Oppure

Loading
28/04/12 22:22
tantocibo
Ho compilato questo programma in Pascal, che stampa tutti i numeri primi da 1 a 1000, e che, almeno logicamente dovrebbe essere giusto (se effettivamente lo è, evitate di suggerirmi come risposta altri algoritmi che al momento non m'interessano più di tanto). Il problema è che quando avvio l'eseguibile, questo crasha improvvisamente D:

program primi_mille_num_primi;
uses crt;
var k,a,n,i,b:longint;primi:array[1..200] of longint;
begin
textcolor(white);
k:=0;
a:=0;
for n:=1000 downto 1 do begin
                        k:=2;
                        i:=n-1;
                        repeat begin if n mod i=0 then k:=k+1;    // K = contatore resti 0 per n
                               i:=i-1;
                               end;
                               until i=2;
                        a:=a+1;
                        if k=2 then begin primi[a]:=n;
                                          b:=b+1;
                                          end;
                        end;
for a:=1 to b do begin
                 if a=b then write(primi[a],'.')
                 else write(primi[a],', ');
                 end;
writeln;
writeln;
writeln;
write('Programma terminato. Premi un tasto per chiudere...');
readkey;
end.


Soluzioni?
aaa
29/04/12 6:37
XBarboX
Allora il problema principale riguarda il repeat until. Non usarlo mai: è poco intuitivo in mia opinione. Il while è molto più facile.

Inoltre fai casino quando salvi i dati nel vettore. Perchè devi usare a e b? Basta semplicemente la variabile a che viene incrementata ogni volta che viene aggiunto un elemento.

Quà c'è il codice funzionante:
program primi_mille_num_primi;
uses crt;
var k,a,n,i,b:longint;primi:array[1..200] of longint;
begin
textcolor(white);
k:=0;
a:=1;

for n:=100 downto 1 do
begin
    k:=2;
    i:=n-1;
    while(i >= 2) do
    begin
         if n mod i=0 then k:=k+1;// K = contatore resti 0 per n
         i:=i-1;
    end;

    if k=2 then
    begin
         primi[a]:=n;
         a:=a+1;
    end;
end;

for i:=1 to a-1 do writeln(primi[i]);

writeln;
writeln;
writeln;
write('Programma terminato. Premi un tasto per chiudere...');
readkey;
end.

Cerca di notare le differenze.
Inoltre ti consiglio di usare correttamente l'indentatura che aiuta molto a trovare gli errori ed il codice risulta ordinato.
E magari qualche commento in più non guasta XD
Comunque adesso funziona il programma tranne per il fatto che segnala 1 come numero primo.
aaa
11/05/12 12:39
tantocibo
Ti ringrazio mi sei stato molto d'aiuto ;) Con un po' di accorgimenti ho anche sistemato la questione del numero "1" e ordinato la stampa in ordine crescente!
aaa