Problema con il menu principale (scanf e switch)

di il
8 risposte

Problema con il menu principale (scanf e switch)

Avvrei un problema che mi sta dando molti grattacapi
Premetto che è il primo anno che studio informatica e che quello che si vede giu è frutto delle mie conoscenze da smanettone,ho voluto fare questo programmino per sfizio, non trovando soluzione ho chiesto al mio prof ma insieme non siamo riusciti a risolvere il problema,
dovrei fare una cosa del genere:
#include <stdio.h>
#include <stdlib.h>
int main(){
    int scelta;
    int funzione1();
    int funzione2();
    do{
    scelta=0;
    system ("cls");
    system ("color a");
    printf ("                                            Menu principale\n\n");
    printf ("             1) Funzione1;\n");
    printf ("             2) Funzione2;\n");
    printf ("             9) Esci.\n\n");
    printf ("Scegli  ");
    scanf ("%d", &scelta);
    printf ("\nHai scelto %d", scelta);
    system ("pause"); /* se tolgo il pause ed a programma in corso inserisco un carattere non numerico il programma va in loop nonostante nella variabile sel ci sia rimasto il numero della scelta precedente */
    switch (scelta){
           case 1:Funzione1();
           break;
           case 2:Funzione2();
           break;
           }
    }while (scelta != 9);
    // il mio prof mi ha detto di provare col do...while,ma non funziona lo stesso...   (-_-)

    }
    int Funzione1(){//eccetera
    }
    int Funzione2(){//eccetera
    }
    
Se inserisco 1 , 2 , o 9 funziona,se inserisco un numero a caso come previsto ritorna ad accettare,se inserisco un carattere il programma va in loop nonostante la variabile scelta sia uguale al numero precedente
Ho provato anche a cercare una sorta di controllo tipo "is string" ma in rete non ho trovato nulla... sarei molto grato se qualcuno mi desseun suggerimento.

8 Risposte

  • Re: Problema con il menu principale (scanf e switch)

    Conosci la libreria ctype.h ?
  • Re: Problema con il menu principale (scanf e switch)

    Per cominciare, leggi con attenzione questo thread.

    Nel codice vi sono poi anche altri problemi, stilistici e di codifica, che magari vedremo in seguito: a cominciare dall'errata collocazione delle dichiarazioni di funzioni.
  • Re: Problema con il menu principale (scanf e switch)

    Va in loop perché devi effettuare la pulizia dello stream di input quando vengono inseriti caratteri non accettabili... Ti posto il codice di un menù perfettamente funzionante... Puoi trovare maggiori informazioni sulla sintassi facilmente online
    
    
    #define exitprogram 14
    
    int menu=0;
    
    
    
    
    
    /* prototipo */
    void printmenu();
    
    
    
    
    
    
    
    
    /* menu all interno della funzione main */
    while (menu!=exitprogram) {
    		printmenu();
    		scanf("%d", &menu);
    		if (menu<1 || menu>exitprogram) while(((menu=getchar())!='\n') && (menu!=EOF)) {}
    	
    		switch (menu) {
    		case 1:
    			printf("\nInserimento di uno studente___");
    			printf("\nInserisci cognome: ");
    			scanf("%s", bufferc);
    			printf("\nInserisci nome: ");
    			scanf("%s", buffern);
    			printf("\nInserisci matricola: ");
    			scanf("%d", &matricola);
    			printf("\nInserisci nome esame: ");
    			scanf("%s", bufferen);
    			printf("\nInserisci voto dell'esame: ");
    			scanf("%d", &esamev);
    			inserisci(bufferc, buffern, matricola, bufferen, esamev);
    			break;
    			/* TUTTE LE ALTRE VOCI DELLO SWITCH */
    			case exitprogram:
    			break;
    		default:
    			printf("\nLa scelta inserita non e' valida!");
    			break;
    		} /* end switch */
    } /* end while */
    
    
    
    
    
    
    
    
    
    
    /* funzione */
    void printmenu() {
    	printf("\n\n========================================================================");
    	printf("\n=============================    MENU    ===============================");
    	printf("\n========================================================================");
    	printf("\n[ 1] Inserisci studente e relativo esame");
    	printf("\n[ 2] Inserisci studente e relativo esame in modo ordinato in base al cognome");
    	printf("\n[ 3] Inserisci studente e relativo esame in coda");
    	printf("\n[ 4] Stampa intero elenco degli studenti");
    	printf("\n[ 5] Cerca studente per cognome");
    	printf("\n[ 6] Cerca studente per numero di matricola");
    	printf("\n[ 7] Salva database");
    	printf("\n[ 8] Carica dati da un database esistente");
    	printf("\n[ 9]Carica dati da un database esistente in testa alla lista");
    	printf("\n[10] Elimina studente");
    	printf("\n[11] Elimina studente in testa alla lista");
    	printf("\n[12] Eliminazione avanzata di uno studente");
    	printf("\n[13] Elimina tutti gli studenti");
    	printf("\n[%d] Esci dal programma", exitprogram);
    	printf("\nInserisci la scelta: ");
    } /* end printmenu */
    
    
    Spero sia di facile comprensione visto che è un programma realizzato avendo buone conoscenze di Ansi C. Per qualsiasi chiarimento sono disponibile.
  • Re: Problema con il menu principale (scanf e switch)

    antomau96 ha scritto:


    Va in loop perché devi effettuare la pulizia dello stream di input quando vengono inseriti caratteri non accettabili... Ti posto il codice di un menù perfettamente funzionante... Puoi trovare maggiori informazioni sulla sintassi facilmente online
    
    
    #define exitprogram 14
    
    int menu=0;
    
    
    
    
    
    /* prototipo */
    void printmenu();
    
    
    
    
    
    
    
    
    /* menu all interno della funzione main */
    while (menu!=exitprogram) {
    		printmenu();
    		scanf("%d", &menu);
    		if (menu<1 || menu>exitprogram) while(((menu=getchar())!='\n') && (menu!=EOF)) {}
    	
    		switch (menu) {
    		case 1:
    			printf("\nInserimento di uno studente___");
    			printf("\nInserisci cognome: ");
    			scanf("%s", bufferc);
    			printf("\nInserisci nome: ");
    			scanf("%s", buffern);
    			printf("\nInserisci matricola: ");
    			scanf("%d", &matricola);
    			printf("\nInserisci nome esame: ");
    			scanf("%s", bufferen);
    			printf("\nInserisci voto dell'esame: ");
    			scanf("%d", &esamev);
    			inserisci(bufferc, buffern, matricola, bufferen, esamev);
    			break;
    			/* TUTTE LE ALTRE VOCI DELLO SWITCH */
    			case exitprogram:
    			break;
    		default:
    			printf("\nLa scelta inserita non e' valida!");
    			break;
    		} /* end switch */
    } /* end while */
    
    
    
    
    
    
    
    
    
    
    /* funzione */
    void printmenu() {
    	printf("\n\n========================================================================");
    	printf("\n=============================    MENU    ===============================");
    	printf("\n========================================================================");
    	printf("\n[ 1] Inserisci studente e relativo esame");
    	printf("\n[ 2] Inserisci studente e relativo esame in modo ordinato in base al cognome");
    	printf("\n[ 3] Inserisci studente e relativo esame in coda");
    	printf("\n[ 4] Stampa intero elenco degli studenti");
    	printf("\n[ 5] Cerca studente per cognome");
    	printf("\n[ 6] Cerca studente per numero di matricola");
    	printf("\n[ 7] Salva database");
    	printf("\n[ 8] Carica dati da un database esistente");
    	printf("\n[ 9]Carica dati da un database esistente in testa alla lista");
    	printf("\n[10] Elimina studente");
    	printf("\n[11] Elimina studente in testa alla lista");
    	printf("\n[12] Eliminazione avanzata di uno studente");
    	printf("\n[13] Elimina tutti gli studenti");
    	printf("\n[%d] Esci dal programma", exitprogram);
    	printf("\nInserisci la scelta: ");
    } /* end printmenu */
    
    
    Spero sia di facile comprensione visto che è un programma realizzato avendo buone conoscenze di Ansi C. Per qualsiasi chiarimento sono disponibile.
    #include <stdio.h>
    #include <stdlib.h>
    #define exitprogram 14
    
    int menu=0;
    
    
    
    
    
    /* prototipo */
    void printmenu();
    
    
    
    
    
    
    int main(){
    
    /* menu all interno della funzione main */
    while (menu!=exitprogram) {
          printmenu();
          scanf("%d", &menu);
          if (menu<1 || menu>exitprogram) while(((menu=getchar())!='\n') && (menu!=EOF)) {}
       
          switch (menu) {
          case 1:
             printf("\nInserimento di uno studente___");
             printf("\nInserisci cognome: ");
             
             break;
             /* TUTTE LE ALTRE VOCI DELLO SWITCH */
             case exitprogram:
             break;
          default:
             printf("\nLa scelta inserita non e' valida!");
             break;
          } /* end switch */
    } /* end while */
    
    }
    
    
    
    
    
    
    
    
    /* funzione */
    void printmenu() {
       printf("\n\n========================================================================");
       printf("\n=============================    MENU    ===============================");
       printf("\n========================================================================");
       printf("\n[ 1] Inserisci studente e relativo esame");
       printf("\n[ 2] Inserisci studente e relativo esame in modo ordinato in base al cognome");
       printf("\n[ 3] Inserisci studente e relativo esame in coda");
       printf("\n[ 4] Stampa intero elenco degli studenti");
       printf("\n[ 5] Cerca studente per cognome");
       printf("\n[ 6] Cerca studente per numero di matricola");
       printf("\n[ 7] Salva database");
       printf("\n[ 8] Carica dati da un database esistente");
       printf("\n[ 9]Carica dati da un database esistente in testa alla lista");
       printf("\n[10] Elimina studente");
       printf("\n[11] Elimina studente in testa alla lista");
       printf("\n[12] Eliminazione avanzata di uno studente");
       printf("\n[13] Elimina tutti gli studenti");
       printf("\n[%d] Esci dal programma", exitprogram);
       printf("\nInserisci la scelta: ");
    } /* end printmenu */
    
    
    L'ho compilato così com'era,ho tolto solo un po' di scanf che non funzionavano all'interno del case 1 perchè le variabili non erano state dichiarate,inserisco 1 e funziona,inserisco altri numeri e come previsto torna ad accettare,ma se inserisco " hsfdgdkss " stesso risultato del mio...
  • Re: Problema con il menu principale (scanf e switch)

    beginner32 ha scritto:


    Conosci la libreria ctype.h ?
    no,di che si tratta?
  • Re: Problema con il menu principale (scanf e switch)

    Dai un occhiata qui . Comunque devi prima implementare un qualcosa che "svuoti" il buffer della scanf.
  • Re: Problema con il menu principale (scanf e switch)

    A quanto pare hai saltato a piè pari l'unico suggerimento risolutivo avuto nel corso thread.

    Va bene: repetita juvant.

    M.A.W. 1968 ha scritto:


    Il problema è principalmente dovuto all'annosa questione della mancata pulizia del buffer di tastiera, un problema che si trascina dai primi anni Ottanta in una insensata discrasia tra mondo Unix e PC DOS/Windows.

    Premesso che l'uso di scanf() è di fatto del tutto sconsigliato per l'input di stringhe e caratteri, fatto ormai sviscerato e approfondito in una buona dozzina di testi e in migliaia di discussioni, si deve come minimo fare ricorso ad una funzione siffatta per lo svuotamento forzato del buffer tra due o più chiamate successive di scanf:
    
        void ClearKeyboardBuffer(void)
        {
            char ch;
            do
            {
                ch = getchar();
            } while (('\n' != ch) && (EOF != ch));
            /* versione sintetica: while (((ch = getchar()) != '\n') && (ch != EOF)); */
        }
    

    Oh, a proposito: la scanf() è pesantissimamente deprecata per l'input di qualsiasi elemento che non siano semplici valori numerici, come ben evidenziato nel primo link sopra riportato. Prima di autoattribuirsi superficialmente patenti di "buona conoscenza" del linguaggio C, magari è bene studiare qualche valido manuale e guida di stile e confrontarsi col codice scritto da professionisti retribuiti e realmente preparati.
  • Re: Problema con il menu principale (scanf e switch)

    M.A.W. 1968 ha scritto:


    A quanto pare hai saltato a piè pari l'unico suggerimento risolutivo avuto nel corso thread.
    Non ti preoccupare,non l'avevo saltato,è che avevo problemi di connessione e sono riuscito solo a rispondere agli altri messaggi...
Devi accedere o registrarti per scrivere nel forum
8 risposte