Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Do-While

  1. #1

    [C] Do-While

    pur essendo semplice, non riesco a farlo funzionare.. è come se ignorasse la scelta dell'utente e continuasse all'infinito !!

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int c;
    float g;
    unsigned int r;
    char m;
    
    int main(void)
    {
    
        do
            {
                printf("\nIntroduci i valori delle variabili: ");
                printf("\n");
                printf("\nc (int) vale: ");
                scanf("%d",&c);
                printf("\ng (float) vale: ");
                scanf("%f",&g);
                printf("\nr (unsigned int) vale: ");
                scanf("%u",&r);
     
                printf("\nVuoi ripetere? S/N\n ");
                scanf("%c",&m);
            }
    
        while(m!='N'||'n');
        
    
        printf("\nProgramma terminato!!");
    
    system("pause");
    return(0);
    }
    mi chiedevo anche...c'è un modo "standard " di fare il controllo dell'inserimento da parte dell'utente ? ad esempio come mi comporto in maniera "da buon probrammatore" per controllare che c, g r e m e le varie variabiliinserite a mano siano del corrispettivo tipo ? sempre con dei piccoli do-while ?

  2. #2
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Prova while(m != 'N' || m != 'n');
    Poi perche l'OR? L'OR richiede che almeno una sia vera
    Se scrivi 'n' ovviamente si verifica m != 'N' quindi una delle due condizioni è sempre vera
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  3. #3
    purtroppo il problema nn è li perchè anche se faccio solo :

    while(m!='N');

    lui se ne fotte

  4. #4
    Soluzione a)
    codice:
    do
            {
                printf("\nr (unsigned int) vale: ");
                scanf("%u",&r);
    
                fflush(stdin);
     
                printf("\nVuoi ripetere? S/N\n ");
                scanf("%c",&m);
            }
    
        while(m!='N' && m !='n');
    oppure

    Soluzione b)
    codice:
    do
            {
                printf("\nr (unsigned int) vale: ");
                scanf("%u",&r);
    
                getchar();
     
                printf("\nVuoi ripetere? S/N\n ");
                scanf("%c",&m);
            }
    
        while(m!='N' && m !='n');
    scanf non scarta il '\n' che immetti nel buffer di input quando hai inserito il numero, per cui "scanf("%c",&m)" piazzerà in m il carattere '\n'.
    La prima soluzione "flusha" (scarica) il buffer di input che è rimasto dopo che scanf ne ha prelevato il numero,

    esempio1 ('\n' indica che premi invio, '\t' è il tab) :
    tu scrivi "12431 \t \n" questo va nel buffer di input
    scanf prende 12431
    ora il buffer contiene questa schifezza " \t \n"
    fflush() la butta via.

    esempio2
    se scrivi "12431\n"
    allora scanf preleva 12431
    il buffer di input contiene "\n"
    Soluzione: a) fflush() lo butta via.
    b) getchar() che lo scarta.

    La gestione dell'input in maniera robusta richiede di costruirsi
    una piccola libreria con funzioni tipo
    get_int(int* i, int maxlen)
    che gestiscono anche il massimo numero di caratteri di cui un
    numero può essere composto.

    codice:
    printf("dammi i:";
    scanf("%3d",&i);
    dammi i: 12000
    codice:
    printf("i = %d", i);
    i = 120

    quello che si vuole è che l'utente non inserisca più di 3 caratteri, non basta dire non inserire più di 3 caratteri, occorrono funzioni ad hoc, stesso discorso per i float e per le stringhe.

  5. #5
    suggerisco:
    codice:
    while(getchar()!='\n') 
                ;
    al posto di:
    codice:
    fflush(stdin);
    in quanto:
    L’uso della funzione standard fflush() applicata al file stdin è da evitare in quanto l’ISO C non definisce un comportamento preciso per questa funzione quando applicata ai file di input.
    Alcuni compilatori potrebbero implementare fflush() in modo che abbia lo stesso comportamento su tutti i file (input e output), ma l’uso di questa caratteristica fa perdere portabilità al programma.


    Per il resto, come ti hanno già detto, devi utilizzare l'AND.
    ...Terrible warlords, good warlords, and an english song

  6. #6
    non potevo pretendere di meglio !!! grazie !!!!!

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.