Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Problema ciclo while (programmazione C)

    Ciao a tutti. Ho iniziato ora a ri-studiare (seriamente) il linguaggio C.

    Nonostante non sia un programmatore neofita, non riesco a capire dove si trova l'errore in questo blocco:

    do {

    printf("Inserisci l'operatore (+, -, *, /): ");
    scanf("%c", &op);

    if (op != '+' && op != '-' && op != '*' && op != '/') {

    printf("\nErrore di inserimento!\n\n");
    i = 0;

    } //end if
    else {
    i = 1;
    } //end else

    } //end do

    while (i == 0);

    Una volta compilato e avviato, il programma esegue tutte le istruzioni contenute nel DO senza contare la presenza dell'IF, per poi tornare indietro e svolgere tutto come dovrebbe. Mi spiego, l'output ottenuto è:

    [...]

    Inserisci l'operatore (+, -, *, /):
    Errore di inserimento!

    Inserisci l'operatore (+, -, *, /):
    //solo a questo punto è possibile inserire effettivamente l'operatore e da qui in poi tutto regolare.

    [...]

    Vorrei capire se si tratta di un mio errore, oppure se (cosa che escludo al 90%) è un errore nella compilazione.

    Vi prego sto impazzendo!
    Grazie!

    (compilo con gcc per mac da terminale)




  2. #2
    Aggiungo anche che questa cosa succede ogni volta che annido un if dentro un while. Le sto provando tutte :'(

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da Fr4nkWeb Visualizza il messaggio
    Aggiungo anche che questa cosa succede ogni volta che annido un if dentro un while. Le sto provando tutte :'(
    Ma la prima volta inserisci il dato con la scanf?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Scanf lascia il buffer sporco, non rimuove tutti i caratteri.
    Aggiungi
    codice:
    while(getchar()!=0);
    dopo l'ultima scanf prima del ciclo e dopo la scanf nel ciclo.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Esatto ma ...

    while
    (getchar()!='\n');
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Esatto ma ...

    while
    (getchar()!='\n');
    Oddio, grazie, devo essere proprio fuso...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Grazie mille! Ho capito!

    Non ho pensato che scanf utilizzasse un buffer... mannaggia!

    In ogni caso, così funziona:

    codice:
    do {
    
            printf("Inserisci l'operatore (+, -, *, /): ");
            scanf("%c", &op);
    
                    while (getchar() != '\n');
    
            if (op != '+' && op != '-' && op != '*' && op != '/') {
    
                printf("\nErrore di inserimento!\n\n");
                i = 0;
    
            } //end if
            else {
                i = 1;
            } //end else
    
        } //end do
    
    
        while (i == 0);
    
    


    Grazie ancora a tutti!
    Ultima modifica di Fr4nkWeb; 10-11-2014 a 19:03

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Okay, ma in futuro usa i tag CODE per mostrare del codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Quote Originariamente inviata da Fr4nkWeb Visualizza il messaggio
    In ogni caso, così funziona:
    codice:
    do {
    
            printf("Inserisci l'operatore (+, -, *, /): ");
            scanf("%c", &op);
    
                    while (getchar() != '\n');
    
            if (op != '+' && op != '-' && op != '*' && op != '/') {
    
                printf("\nErrore di inserimento!\n\n");
                i = 0;
    
            } //end if
            else {
                i = 1;
            } //end else
    
        } //end do
    
    
        while (i == 0);
    

    Funzionerà anche, ma prova ad analizzare il seguente codice e cerca di comprendere perché, pur essendo volutamente lontano dall'ottimalità, è comunque nettamente migliore di quello che hai scritto finora.
    codice:
        i = 0;
    
        do
        {
            printf("Inserisci l'operatore (+, -, *, /): ");
            scanf("%c", &op);
            while (getchar() != '\n');
    
            if (NULL != strchr("+-/*", op))
            {
                i = 1;
            }
            else
            {
                puts("Errore di inserimento!");
            }
        }
        while (i == 0);
    Ultima modifica di M.A.W. 1968; 10-11-2014 a 19:00
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  10. #10
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Funzionerà anche, ma prova ad analizzare il seguente codice e cerca di comprendere perché, pur essendo volutamente lontano dall'ottimalità, è comunque nettamente migliore di quello che hai scritto finora.
    codice:
        i = 0;
    
        do
        {
            printf("Inserisci l'operatore (+, -, *, /): ");
            scanf("%c", &op);
            while (getchar() != '\n');
    
            if (NULL != strchr("+-/*", op))
            {
                i = 1;
            }
        }
        while (i == 0);
    Sono d'accordo, mi sono però dimenticato di specificare che il codice che ho scritto era per risolvere un esercizio consegnato dalla prof., che pretende si utilizzino esclusivamente costrutti che ha spiegato a lezione (già con getchar() sono andato oltre...).
    Purtroppo se vi facessi vedere come ha scritto lei la soluzione vi spaventereste da tanto che è ridondante e contorta.

    In ogni caso mistero risolto! Grazie ancora.

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.