{ File: primi2.pas } { Scopo: esercizio sull'uso di cicli e di funzioni } program NumeriPrimi2; var numero : integer; function TestDivisibile (n: integer): boolean; { verifica se il numero n e` divisibile } var i : integer; temp : boolean; { valore booleano che facciammo corrispondere all'affermazione "trovato un divisore per n" } begin { il procedimento consiste nel cercare di dimostrare che il numero non e' primo (perche' troviamo un divisore). Allora inizialmente poniamo 'temp' = FALSE. Se durante il ciclo di ricerca dei divisori troviamo un divisore, temp diventa TRUE e il ciclo deve interrompersi. } if (n mod 2) = 0 then temp := TRUE else temp := FALSE; { Verifichiamo se il numero e' pari e inizializziamo di conseguenza temp. Poi inizializziamo i a 3 (perche' il controllo su 2 lo abbiamo gia' fatto. si entra nel ciclo successivo solo se il numero non e' divisibile per 2. Quindi e' inutile controllare se il numero e' divisibile per 4, 6 etc ... Quindi durante il ciclo verificheremo se n mod i = 0 solo per i valori di i = 3, 5, 7 ... cioe' incrementeremo i in modo da saltare i valori pari. } i := 3; while ((i <= sqrt(n)) and not temp) do begin if (n mod i) = 0 then temp := TRUE; i := i + 2; end; TestDivisibile := temp; end; {TestDivisibile} begin { NumeriPrimi2 } writeln; write('Inserire un numero? '); readln(numero); write('Il numero proposto '); if TestDivisibile(numero) then writeln('non e'' primo.') else writeln('e'' primo.'); readln end. { NumeriPrimi2 }