Come mai questa riga
mi dà l'errorecodice:IF max <> 0 AND max<=10000 THEN
INVALID OPERANDS TO BINARY <= ???
Come mai questa riga
mi dà l'errorecodice:IF max <> 0 AND max<=10000 THEN
INVALID OPERANDS TO BINARY <= ???
Prova con le parentesi...:
codice:IF ((max <> 0) AND (max<=10000)) THEN
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
grazie...solo che ora ho un problema con i numeri primi
ho questa funzione per vedere se un numero è primo
e questa e' la parte del programma che richiama la funzionecodice:FUNCTION primo(n:integer):integer; BEGIN f:=1; a:=1; WHILE (a<=n) AND (f=1) DO BEGIN IF (n MOD a) = 0 THEN BEGIN f:=2; END; a:=a+1; END; return f; END;
solo che se do' 100, mi stampa TUTTI i numeri dall' 1 al 100 e non solo quelli primicodice:i:=1; a:=2; read(max); IF max <> 0 THEN BEGIN WHILE i < max DO BEGIN IF primo(i) = 1 THEN BEGIN write(i," "); END; i:=i+1; END; readln; END;
Perchè nella procedura per il testi di primalità hai commesso un piccolo errore:
Comunque... sembra una specie di pseudo-pascal... il Pascal non ti lascerebbe mai usare delle variabili non dichiarate... :master:codice:FUNCTION primo(n:integer):integer; BEGIN f:=1; a:=1; WHILE (a<n) AND (f=1) DO (* attento a non mettere <= *) BEGIN IF (n MOD a) = 0 THEN BEGIN f:=2; END; a:=a+1; END; return f; END;
Ciao.
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
non avevo incollato tutto il programmaOriginariamente inviato da LeleFT
Comunque... sembra una specie di pseudo-pascal... il Pascal non ti lascerebbe mai usare delle variabili non dichiarate... :master:
vabbe'
grazie non avevo notato l'errore!!
Forse è megliocodice:program compito_6; uses crt; var i,num:integer; begin clrscr; repeat write('inserisci un numero: '); readln(num); until num>0; writeln; if num=2 then writeln('il numero Š primo!') else if num=3 then writeln('il numero Š primo!') else begin i:=0; if num mod 2=0 then i:=i+1; if num mod 3=0 then i:=i+1; if i=0 then writeln('il numero Š primo!'); if i>=1 then writeln('il numero non Š primo!'); end; readln; end.
Ciao, ho guardato il tuo codice e a prima vista l'algoritmo sembra corretto. Non mi intendo di Pascal, quindi non so indicarti errori dovuti magari a caratteristiche particolari del linguaggio (casting ecc). Ti posso solo consigliare di provare a usare una parentesi che racchiuda entrambe le condizioni nel WHILE, ma non so quanto possa essere utile.
Posso invece suggerirti una modifica a livello algoritmico, che può rendere più veloce il programma. Al posto di controllare i divisori di n fino ad n stesso, è sufficiente controllarli fino alla sua radice quadrata, o meglio il più grande intero inferiore a sqrt(n); infatti se ipoteticamente n = h*k, con h <> k, uno dei due deve essere per forza minore di sqrt(n), altrimenti si avrebbe h*k > sqrt(n)^2 = n, che è un assurdo data l'ipotesi di partenza. Per evitare qualsiasi errore di approssimazione, è bene comunque (anche se matematicamente parlando non serve) arrivare a controllare fino a sqrt(n)+1.
Ti posto il codice che scriverei io:
In questo caso devi poi inserire il controllo per n = 2, che ovviamente non funziona col mio codice, poiche controlli che 2 mod 2 = 0 e ti porta ad avere f=2. Se invece non aggiungi il +1 a sqrt(n) tutto funziona a meravigliacodice:FUNCTION primo(n:integer):integer; BEGIN f:=1; a:=1; WHILE (a<=trunc(sqrt(n))+1) AND (f=1) DO BEGIN IF (n MOD a) = 0 THEN BEGIN f:=2; END; a:=a+1; END; return f; END;
Questo non risolve il problema che hai; per quello non so aiutarti, mi spiace.
Ciao
ah poi dovevo settare
a:=2;
invece di
a:=1;
E questo? :master:Originariamente inviato da cso
Forse è megliocodice:program compito_6; uses crt; var i,num:integer; begin clrscr; repeat write('inserisci un numero: '); readln(num); until num>0; writeln; if num=2 then writeln('il numero Š primo!') else if num=3 then writeln('il numero Š primo!') else begin i:=0; if num mod 2=0 then i:=i+1; if num mod 3=0 then i:=i+1; if i=0 then writeln('il numero Š primo!'); if i>=1 then writeln('il numero non Š primo!'); end; readln; end.
Calma... non è che un numero sia primo se non è divisibile né per 2 né per 3... ma se non ha divisori diversi da 1 e da se stesso... :master:
Ciao.
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
compila e otterrai le risposte...