Exercício nº1
Números Primos
Objetivos do Programa
Este programa tem como objetivo identificar se o número introduzido é primo ou não.
Para isso é, inicialmente, pedido que seja introduzido um número inteiro (já que não existem números decimais que sejam primos), de seguida, o programa identifica se o número é primo ou não e informa na tela o resultado. O utilizador é informado no início do programa quais são as condições para sair do mesmo.
O programa irá funcionar até o utilizador digitar um número negativo (pois convencionou-se que números negativos não são primos e na descrição eu explico o porquê) ou pressionar uma letra (tentativa de contornar os erros fatais).
Algoritmia
Programa numprim;
( Escrever variáveis);
Começar
Contador do número de divisores=0;
Escrever o que programa faz;
Escrever como o utilizador deve proceder caso deseje sair;
Pedir que seja introduzido um número inteiro;
Ler o número inteiro;
Se o número inteiro inserido for maior do que 1 então dividir o número inserido por todos os números de 1 até ao número inserido, inclusive.
Quando houver resto zero na divisão que estiver a ser feita, o contador de número de divisores deve acrescentar (+1) sendo que inicialmente encontra-se igualado a zero;
Se o número de divisores for dois então o número é primo, caso contrário, o número não é primo.
Repetir o programa até que o número inserido seja negativo (ou ser inserida uma letra ou um outro caracter não númerico).
Fim.
Codificação
Program numprim ;
var n,i,d: integer;
Begin
repeat
d:=0;
writeln('Este programa verifica se o número é primo.');
writeln('Caso pretenda sair, digite uma letra ou um número negativo e enter');
write('Por favor, introduza um número inteiro: '); Readln(n);
if n>1 then
for i:=1 to n do
begin
if (n mod i)=0
then d:=d+1;
end;
if d=2 then writeln('O número que introduziu é primo.')
else
writeln('O número que introduziu não é primo.');
writeln('');
until n<0 ;
End.
Observações.: A variável d é um contador, isto é: a sua função é contar quantos divisores existem entre 1 e n. Ou seja, sempre que o resto de uma divisão desde 1 até n der zero, o contador d acrescenta +1. Assim, se d for =2 então n só tem dois divisores e, consequentemente, é primo, caso contrário, não é.
Explicação
(alternativas e limitações)
Em primeiro lugar, os números primos são aqueles que têm unicamente dois divisores: são unicamente divisíveis por si e por 1 (ou seja, o resto dá zero- foi, por isso, usado o "mod" já que é o resto de uma divisão). Assim, quando o utilizador insere um número, o programa decide o que fazer a seguir: se o número inserido for maior que 1 este continua, caso contrário ( se for 1 ou zero ou menor que zero) o programa diz, automaticamente que não é primo. A verdade é que era indiferente pôr "para n>=1 ou para n>1" uma vez que em ambos os casos o 1 não seria primo, mas escrever "para n>=0" poderia dar problema uma vez que é um erro matemático, portanto optei por usar "para n>1". Em relação aos números negativos, foi convencionado pelos matemáticos que estes não seriam primos mesmo obedecendo à condição para o serem. Isto porque o conjunto dos números primos foi inventado muito antes de serem descobertos (ou inventados) os números negativos, portanto, para não alterar teoremas relacionados ao conjunto referido, convencionou-se que quando se fala de números primos, fala-se de números inteiros, positivos com unicamente 2 divisores.
Com isto, eu resolvi informar o utilizador que um número negativo interrompia a execução do programa, no entanto, como existe um "if >1", existe também um "else" e este else funciona para qualquer número que não seja maior do que 1, e faz com que seja escrito no ecrã que o número introduzido não é primo. Se esse número for negativo, além de ser informado ao utilizador que o número não era primo, o utilizador sai do programa, como lhe foi informado no início foi, para isso usado o "repeat until n<0" . Isto foi feito numa tentativa de contornar os erros fatais: o utilizador é informado como deve proceder para sair do programa.
O "for " usado neste programa serve para criar um ciclo, isto é, para repetir as divisões desde o número 1 até ao número inserido (só por números inteiros).
Em alternativa ao if pode ser usado, como aprendemos, o Case (variável) of, no entanto, como em ambos ifs que foram usados só existem duas opções (ou é maior que 1 ou não; ou o resto é zero ou não) então eu preferi utilizar o if já que não iriam haver conflitos lógicos dentro do programa. Não faria sentido, neste caso, utilizar case, uma vez que não são usados intervalos fixos como o case exige ( 12..78 por exemplo mas sim <0) e só existem duas opções . Para além disso, em vez de ser usado o repeat until, eu poderia ter usado while 1=1 do (depois do begin inicial). Isto alterava unicamente uma coisa: o programa só era interrompido se a pessoa clicasse uma letra ou outro caractere não numérico. No entanto, como não faz muita diferença já que o programa é pouco extenso, decidi manter o repeat. Em programas maiores, poder-se-ia pôr toda a decisão do computador numa procedure e invocá-la pelo seu nome em qualquer parte do programa, não fiz neste porque (e como já referi) o programa é pouco extenso.
Funcionamento do Programa

O zero não é primo e um número negativo interrompe a execução do programa, tal como avisado.

Caso a codificação na coluna do meio não esteja clara, está aqui um print do exercício.

Este não acaba até ser pressionado um número negativo ou uma letra.

O zero não é primo e um número negativo interrompe a execução do programa, tal como avisado.