Este texto é um programa letrado (PL) usando C e markdown.
Ele é também um teste de sintaxe (e não uma prova de conceito de PL).
Vamos imprimir os 1001 menores números primos.
Nota. A programação letrada
é um conceito de Knuth.
Knuth e Levy
Escreveram um sistema para programação letrada usando
Que tal usar markdown como marcação para uma rede em C?
Uma vantagem é que há pouca interação entre os operadores dessas linguagens.
Abrimos mão do controle tipográfico fino do
Os bocados (chunks) que formam a rede podem (ou não) ter nomes. Um bocado tem três partes: uma parte texto, uma parte para definições de macros, e uma parte código. Cada uma dessas partes é opcional. Pense no texto como um espaço informal para elaborar a notação (formal) do programa. (Se isso soou acadêmico, bingo! O pessoal da matemática têm uma boa experiência com o delicado balanço entre as linguagens formal e natural.)
Se alterar o programa, atualize o banner.
#define banner "Olá, sou PRIMOS, (versão 0.9)\n"
O programa é bastante simples
#include <stdio.h> /* para `printf` */
#define quantos_primos 1001
int
main (int argc, char **argv)
{
<Variáveis de `main`>
printf (banner);
<Imprime primos>
printf ("Até mais!\n");
return 0;
}
Testamos se o número n
é primo, imprimindo se for o caso.
O array primos[0..encontrados -1]
contém os números primos menores do que n
.
Como o único número primo par é 2, só precisamos testar a primalidade dos
números ímpares
<Imprime primos>=
primos[0] = 2;
encontrados = 1; /* encontramos 1 primo até agora */
n = 3; /* candidato a primo */
printf ("Primos: 2");
while (<Faltam primos>)
{
<Incremente `n` até o próximo primo>
printf (", %d", n);
primos[encontrados++] = n;
n += 2; /* testamos só os números ímpares */
}
<Faltam primos>=
encontrados < quantos_primos
<Variáveis de `main`>=
int primos[quantos_primos];
int i, n, encontrados;
n
é primo se e somente se ele não possui divisores em primos[0..encontrados -1]
.
Uma otimização:
podemos decidir que n
é primo se não é divisível por algum primo
menor ou igual a primos[0,...encontrados -1]
está sempre ordenado.
Porque podemos parar em
[. . .] The property of being prime (or not) is called primality. A simple but slow method of verifying the primality of a given number
$n$ is known as trial division. It consists of testing whether$n$ is a multiple of any integer between 2 and$\sqrt{n}$ .
<Incremente...>=
i = 0;
while (<`primos[i]` é um primo menor ou igual a $\sqrt {n}$>)
if (n % primos [i] == 0)
{
n += 2; /* testamos só os números ímpares */
i = 0;
}
else
++i;
<`primos[i]` é um primo menor ou igual a $\sqrt{n}$>=
i < encontrados && primos [i] * primos [i] <= n
Nem todo bocado tem título, mas eles devem ser numerados,
para que seja possível navegar entre eles com links.
Por isso tem apenas um jogo-da-velha seguido por dois espaços #
(dá pra ver melhor na versão raw deste arquivo).
Aqui nós quase não fizemos reordenações; ainda assim, espero que alguma noção de como a PL pode ser usada tenha transparecido.
Com alguma sorte, será possível trazer mais pessoas para a programação letrada se adotarmos uma marcação mais simples. Isso é essencial se queremos ter alguma chance de encontrar boas fórmulas para exposição de programas.