Pagina 1 di 7 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 69

Discussione: [c]errore nel ciclo

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383

    [c]errore nel ciclo

    Ciao,ho scritto questo programma che fa uso di un ciclo:

    codice:
    #include <stdio.h>
    
    main()
    {
     int i,n,num,cont_d,cont_c,cont_m;
     printf("\nRICERCA DEI VALORI 10,100 E 1000 ALL'INTERNO DI UN INSIEME DI NUMERI\n");
     printf("\nNumero di interi: ");
     scanf("%d",&n);
     cont_d=0; 
     cont_c=0;
     cont_m=0;
     for(i=0;i<n;i++) {
         printf("Inserisci un numero intero: ");
         scanf("%d",&num);
         if (num==10)    cont_d++;
         if (num==100)   cont_c++;
         if (num==1000)  cont_m++;
     }
     printf("\nIl valore 10 é stato inserito %d volt%c.",cont_d,(cont_d==1) ? 'a' : 'e');
     printf("\nIl valore 100 é stato inserito %d volt%c.",cont_c,(cont_c==1) ? 'a' : 'e');
     printf("\nIl valore 1000 é stato inserito %d volt%c.\n\n",cont_m,(cont_m==1) ? 'a' : 'e');
    }
    Se pero' per sbaglio digito in modo sbagliato,accade che un valore viene conteggiato piu delle volte digitate, invece che uscire un semplice errore.Come mai?E come si puo fare per riportare le cose alla logica?
    codice:
    RICERCA DEI VALORI 10,100 E 1000 ALL'INTERNO DI UN INSIEME DI NUMERI
    
    Numero di interi: 4
    Inserisci un numero intero: 1000
    Inserisci un numero intero: 1000
    Inserisci un numero intero: q
    Inserisci un numero intero: 
    Il valore 10 é stato inserito 0 volte.
    Il valore 100 é stato inserito 0 volte.
    Il valore 1000 é stato inserito 4 volte.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La scanf restituisce un valore che dovresti testare prima di continuare ad eseguire il ciclo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Probabilmente nel mia grande ignoranza ho sempre scritto molto più codice di quanto fosse necessario:

    Io il problema dell'inserimento di lettere in luogo di numeri l'ho risolto così:

    Codice PHP:
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>

    int main() {
       
    char str[20],c;
       
    int interoi=0;         

       
    printf("Inserisci un intero positivo: ");
       for(;;) {
          
    getchar();
          if (
    == '\n') break;
          
          if (
    isdigit(c)) str[i++] = c;
          else {
             
    printf("ERRORE");
             break;
          }
       }
       
    intero atoi(str);

    logicamente si può mettere tutto in un ciclo do..while se si verifica l'errore e far inserire di nuovo il valore.. è l'unica soluzione che ho.
    Anzi.. per favore correggetemi se scrivo inutilmente..

    Grazie
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  4. #4
    dal man scanf:

    codice:
    RETURN VALUE
           These functions return the number of input items successfully matched
           and  assigned,  which can be fewer than provided for, or even zero in
           the event of an early matching failure.
    
           The value EOF is returned if the  end  of  input  is  reached  before
           either  the first successful conversion or a matching failure occurs.
           EOF is also returned if a read error occurs, in which case the  error
           indicator  for  the  stream  (see ferror(3)) is set, and errno is set
           indicate the error.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  5. #5
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Scusate, personalmente continuo a non capire..
    Ho chiaro il significato del valore di ritorno della scanf,
    ma secondo me il problema si pone comunque nel caso
    l'utente inserisca ad esempio una lettera al posto di un numero..

    a prescindere dal fatto che con il mio compilatore (gcc) se inserisco
    una lettera al posto di un intero mi entra in un loop infinito
    (proprio per questo scrivo quel codice descritto sopra), ma anche se
    così non fosse.. sicuramente inserire una lettera in luogo di un numero
    è un errore, che porterà ad altri errori...

    Quello che non capisco è come mi può aiutare il valore di ritorno della
    funzione scanf, una lettera con il cast del formato ad intero non è
    pur sempre un numero ?? La scanf non mi restituisce comunque un
    valore positivo ??

    Grazie a chi vorrà insegnarmi qualcosa..
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma tu hai letto dalla documentazione cosa restituisce la scanf e cosa vuol dire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    E' semplice, se la scanf non riconosce l'input come un numero, restituirà 0 perché non è riuscita ad assegnare neppure un valore. Un piccolo esempio:

    codice:
    gr3yfox test $ cat scf.c 
    #include <stdio.h>
    
    int main() {
            int a;
            printf("->%d\n", scanf("%d", &a));
            printf("%d\n", a);
    }
    
    gr3yfox test $ ./scf 
    12
    ->1
    12
    gr3yfox test $ ./scf 
    deaw423ad
    ->0
    0
    gr3yfox test $ ./scf 
    23d
    ->1
    23
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  8. #8
    Ciao Lex,

    puoi usare la funzione gets al posto di scanf. Controlli che la stringa sia nel formato corretto:

    http://www.guidealgoritmi.it/ShowArticle.aspx?ID=6

    e, in caso affermativo, converti la stringa in intero con la funzione [b]atoi[b].


  9. #9
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Se non ho capito male,
    Restituisce il numero di "variabili" (non ho trovato una parola migliore) correttamente assegnate,
    oppure 0 nel caso di nessun assegnamento, o EOF nel caso non si sia potuto leggere nulla

    in parole semplici ho capito questo
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  10. #10
    Usare gets non è mai una buona idea se non si vuole espressamente dare spazio a buffer overflow.

    edit:
    dal man gets
    codice:
    BUGS
           Never  use  gets().  Because it is impossible to tell without knowing
           the data in advance how many characters gets() will read, and because
           gets()  will continue to store characters past the end of the buffer,
           it is extremely dangerous to use.  It has been used to break computer
           security.  Use fgets() instead.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

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.