Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965

    [Pascal] Errore di operandi

    Come mai questa riga

    codice:
         IF max <> 0 AND max<=10000 THEN
    mi dà l'errore
    INVALID OPERANDS TO BINARY <= ???

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    grazie...solo che ora ho un problema con i numeri primi

    ho questa funzione per vedere se un numero è primo

    codice:
    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;
    e questa e' la parte del programma che richiama la funzione

    codice:
         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;
    solo che se do' 100, mi stampa TUTTI i numeri dall' 1 al 100 e non solo quelli primi

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Perchè nella procedura per il testi di primalità hai commesso un piccolo errore:
    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;
    Comunque... sembra una specie di pseudo-pascal... il Pascal non ti lascerebbe mai usare delle variabili non dichiarate... :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

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Originariamente inviato da LeleFT
    Comunque... sembra una specie di pseudo-pascal... il Pascal non ti lascerebbe mai usare delle variabili non dichiarate... :master:
    non avevo incollato tutto il programma

    vabbe'

    grazie non avevo notato l'errore!!

  6. #6
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    codice:
    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.
    Forse è meglio

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    12
    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:

    codice:
    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;
    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 meraviglia

    Questo non risolve il problema che hai; per quello non so aiutarti, mi spiace.

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    ah poi dovevo settare

    a:=2;

    invece di

    a:=1;


  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da cso
    codice:
    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.
    Forse è meglio
    E questo? :master:
    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

  10. #10
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    compila e otterrai le risposte...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.