Newsgroup: it.comp.lang.pascal
Titolo: successione primi N numeri primi FATTO MA PROBLEMA!!!

Ciao a tutti io ho fatto questo programma, ma mi stampa i numeri primi
minori di n
e non i primi n numeri primi. (Avete capito?)
Potreste guardare dove ho sbagliato?
Ciao e grazie  mille
Paolo
Program numeri_primi;
uses crt;
var n, m, s, conts, d, c:Integer;
procedure determinazione;
Begin
 clrscr;
 writeln ('I primi ' , n , ' numeri primi sono');
 m:=1;
 c:=1;
 if (n>1) then
 Begin
  repeat
  s:=1;
  conts:=0;
   repeat
   d:=m mod s;
   if d=0 then
          conts:=conts+1;
   s:=s+1;
   until s>m;
  if conts<=2 then
              writeln (m);
              m:=m+1;
              c:=c+1;
  until c=n;
 end
 else
 writeln (m);
end;
Begin
clrscr;
write ('Inserisci un numero da tastiera: ');
readln (n);
determinazione;
readln;
end.

Ciao,
allora... vista la mia poca voglia :P di mettermi a spulciare il tuo
programma (magari lo farò in seguito) ti dico alcune cose... allora:
1) Se ti stampa i numeri primi minori di n e non i primi n numeri primi
significa che hai sbagliato a concepire il problema. Cioè... devi inserire
un contatore che aumenti ogni volta che il programma trova un numero primo,
e come condizione d'uscita del ciclo: il contatore è uguale al numero
immesso.
2) Hai fatto una procedura Determinazione... ma qual è il suo senso? Hai
dichiarato tutte variabili globali mentre le varie m,s,conts,d e c vengono
utilizzate solo all'interno della procedura.
3) Metti nomi più significativi alle varibili... non è di facile lettura il
tuo programma.
program NumeriPrimi;
var
  N : Integer;
procedure Stampa(N : Integer);
var
  Att, {il numero preso in considerazione}
  Conta, {il contatore dei numeri primi}
  Divisore, {il divisore preso in considerazione}
  MaxDivisore, {il divisore oltre al quale non ha più senso dividere}
  Resto : Integer; {il resto della divisione, l'ho inserita solo per
chiarezza, ma non è indispensabile, come MaxDivisore}
  Trovato : Boolean; {assume valore True se il numero non è primo}
begin
  Att := 1;
  Conta := 0;
  repeat
    Trovato := False;
    Inc(Att);
    Divisore := Att - 1;
    MaxDivisore := Trunc(Sqrt(Att));
    while (Att > Divisore) and (Divisore > 1) and (MaxDivisore <= Divisore)
and (not Trovato) do begin
      Resto := Att MOD Divisore;
      If Resto = 0 then Trovato := True;
      Dec(Divisore)
    end;
    if not Trovato then begin
      Writeln(Att);
      Inc(Conta)
    end;
    Trovato := False
  until (Conta = N)
end;
{main}
begin
  Write('Quanti numeri primi vuoi stampare? ');
  Readln(N);
  Stampa(N);
  Readln
end.
Questa è una soluzione... ehmm siccome l'ho fatta di fretta *dovrebbe*
funzionare ma non sono per nulla sicuro che sia la migliore. Quindi, evita
di ricopiarla pari pari ma cerca di capirne il significato...
Ciao
Cristian


Qualche domandina:
l'operazione TRUNC che cosa significa?
l'operazione INC incrementa di un unità ad esemprio inc(n) = n:= n +1? Va
bene?
l'operazione DEC decremente di un unita ad esempio dec(n) = n:= n-1? Va
bene?
nel ciclo while 1quando c'è la condizione (not trovato) vuol dire che
trovato è false o true, secondo me è true visto che all'inizio l'hai
dichiarata false, la neghi e diventa true, è corretto?
Ciao e grazie mille
PAolo

 dichiarata false, la neghi e diventa true, è corretto?
il ciclo while controlla se la condizione è vera, se lo è entra nel ciclo
altrimenti ne esce
ciauz!!
PS: vediamo di quotare meglio....

 giusto in pascal, in dlephi sicuramente....)
Sì, è giusto anche in Pascal



 > dichiarata false, la neghi e diventa true, è corretto?
e la domanda è???

> e la domanda č???
quella col punto di domanda...
ha ripreso un suo post che non aveva avuto risposta...
la risposta mi sembra si ma mi si ingarbuglia il cervello a leggere
la domanda :-)
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

 la domanda :-)
allora da quello che sono riuscito a capire dalla sua domanda la risposta č:
(not trovato) deve essere vero per entrare nel ciclo while => trovato=false
per entrare trovato=true per uscire
ciao