Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38

    [C] problemi operatore di selezione if

    ciao a tutti volevo sapere alcune cose a riguardo dell' if:

    codice:
    printf("\nDigita la lettera da inserire nel nodo...: ");
    	getchar();
    	scanf("%c", &lettera);
    
    		if ( lettera =='A' || lettera =='E' )
    		   {
    			lettera = printf(" la lettera utilizzata è giusta\n ");
    		   }
    
    		else
    	
    		   {
    			printf("hai sbagliato devi inserire A or E \n");
    			printf("scegli uno delle due lettere: A or E \n");
    			getchar();
    			scanf("%c", &lettera);
    
    		   }
    
    
    	printf("\nDigita la variabile da inserire nel nodo...: ");
    	getchar();
    	scanf("%c", &variabile);
    
    		if ( variabile >= 'a' && variabile <= 'm' )
    		   {
    			variabile = printf(" la variabile utilizzata è corretta\n ");
    		   }
    
    		else
    	
    		   {
    			printf("hai sbagliato.. devi inserire una lettera compresa tra a e m \n");
    			getchar();
    			scanf("%c", &variabile);
    
    		   }
    questo è il mio codice, in teoria dovrebbe funzionare tutto quello che volevo sapere è:

    1) è possibile renderlo più compatto ad esempio, invece di fare due if separati con i relativi else, è possibile farne soltanto 1? non so!

    2) ho messo: getchar() prima della scanf, perchè girando tra vari forum ho visto che in quel modo funzionava non so il perchè! esiste un'implementazione fatta meglio? perchè non funzionava?

    3) poi volevo fare che quando l'utente sbaglia ad inserire, gli stampa che ha sbagliato e che lo deve reinserire.
    però nel codice che ho scritto quando l'utente inserisce il valore esatto va avanti senza nessun problema ma se inserisce il valore sbagliato, gli dice che ha sbagliato e gli fa reinserire un'altro valore, ma a quel punto l'utente può inserire quello che vuole e il programma va avanti comunque perchè? dove sbaglio?

    4) avevo creato una funzione che mi creava un nodo:
    questi controlli li devo mettere dentro la funzione oppure li devo mettere a parte?

    5) avevo messo tutte quelle printf solo per controllare se tutto quanto veniva eseguito in modo giusto..

    vi prego aiutatemi devo correggere queste cose al più presto

    ciao aspetto una vostra risposta al più presto
    grazie a tutti in anticipo!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Il doppio getchar/scanf ti è dovuto al fatto che entrambe le istruzioni ti leggono un solo carattere.
    Ma tu devi svuotare il buffer dello standard input anche dal ritorno a capo '\n'.
    In ogni caso anche così non risolvi il problema, perché se l'utente immette più di un carattere e poi invio
    il problema sussiste.

    Io scriverei il programma così, guarda se ti va bene:

    codice:
    #include <stdio.h>
    
    char getchar_with_prompt(char *prompt)
    {
        char c, tmp;
    
        printf("%s ", prompt);
        c = getchar();
        // rimuovo i restanti caratteri dallo stdin
        tmp = c;
        while (tmp != '\n')
            tmp = getchar();
    
        return c; 
    }
    
    int main()
    {
        char lettera, variabile;
    
        while (1) {
            lettera = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (lettera != 'A' && lettera != 'E')
                printf("hai sbagliato devi inserire A or E\n");
            else
                break;
        }
    
        while (1) {
            variabile = getchar_with_prompt("Digita la variabile da inserire nel nodo...:");
            if (variabile < 'a' || variabile > 'm')
                printf("hai sbagliato devi inserire una lettera compresa tra a e m\n");
            else
                break;
        }
    
        printf("Hai inserito: %c %c\n", lettera, variabile);
    
        return 0;
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    ciao e grazie per la risposta!

    che ne pensi di questa implementazione?

    codice:
         do
         {
    	printf("\nDigita il quantificatore da inserire nel nodo...: ");
    	esito = scanf("%c", &quantif);
    	if ((quantif != 'V' && quantif == 'E'))
    	   {
    	     quantif = printf(" il quantificatore utilizzato non è giusto\n ");
    	     esito = 0;
    	   }
         }
    
         while	(!esito);
    
         do
         {
    	printf("\nDigita la variabile da inserire nel nodo...: ");
    	esito = scanf("%c", &variabile);
    
    	if ( variabile < 'a' || variabile > 'm' )
              {
    	     variabile = printf(" la variabile utilizzata non è corretta\n ");
                 esito = 0;
    	  }
         }
    
         while	(!esito);

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    c0der ho provato il tuo codice è funziona però non ho capito come lo hai fatto!
    mi puoi spiegare i passaggi ?
    Ah poi un'altra cosa, dovrei mettere tutto questo dentro un ciclo, e poi non dovrei usare i break, come posso fare?
    grazie mille!
    ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ho tolto i break

    codice:
    #include <stdio.h>
    
    char getchar_with_prompt(char *prompt)
    {
        char c, tmp;
    
        printf("%s ", prompt);
        c = getchar();
        // rimuovo i restanti caratteri dallo stdin
        tmp = c;
        while (tmp != '\n')
            tmp = getchar();
    
        return c; 
    }
    
    int main()
    {
        char c, lettera = 0, variabile = 0;
    
        while (!lettera) {
            c = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (c != 'A' && c != 'E')
                printf("hai sbagliato devi inserire A or E\n");
            else
                lettera = c;
        }
    
        while (!variabile) {
            c = getchar_with_prompt("Digita la variabile da inserire nel nodo...:");
            if (c < 'a' || c > 'm')
                printf("hai sbagliato devi inserire una lettera compresa tra a e m\n");
            else
                variabile = c;
        }
    
        printf("Hai inserito: %c %c\n", lettera, variabile);
    
        return 0;
    }
    Cosa è che non hai capito in particolare?
    e cosa vuol dire "dovrei mettere tutto questo dentro un ciclo"?
    Ciao.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    i due while ovvero
    codice:
     while (!lettera) {
            c = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (c != 'A' && c != 'E')
                printf("hai sbagliato devi inserire A or E\n");
            else
                lettera = c;
        }
    
        while (!variabile) {
            c = getchar_with_prompt("Digita la variabile da inserire nel nodo...:");
            if (c < 'a' || c > 'm')
                printf("hai sbagliato devi inserire una lettera compresa tra a e m\n");
            else
                variabile = c;
    devo stare dentro ad un ciclo che mi fa ripetere questi due passaggi fino a che non ho inserito tutti gli elementi che l'utente desidera inserire, non so se mi hai capito

    ad esempio una cosa del genere:

    codice:
    	printf("inserisci il numero totale di quantificatori che vuoi inserire nella formula: \n");
    	scanf("%d", &n_tot);
    
    	for (i = 0; i < n; i++)
                {
    		istruzioni		
    		}

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ho capito, in questo caso crei due funzioni getLetteraNodo e getVariabileNodo
    che puoi richiamare tutte le volte che vuoi.

    codice:
    #include <stdio.h>
    
    char getchar_with_prompt(char *prompt)
    {
        char c, tmp;
    
        printf("%s ", prompt);
        c = getchar();
        // rimuovo i restanti caratteri dallo stdin
        tmp = c;
        while (tmp != '\n')
            tmp = getchar();
    
        return c; 
    }
    
    char getLetteraNodo() 
    {
        char c, lettera = 0;
    
        while (!lettera) {
            c = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (c != 'A' && c != 'E')
                printf("hai sbagliato devi inserire A or E\n");
            else
                lettera = c;
        }
    
        return lettera;
    }
    
    char getVariabileNodo() 
    {
        char c, variabile = 0;
    
        while (!variabile) {
            c = getchar_with_prompt("Digita la variabile da inserire nel nodo...:");
            if (c < 'a' || c > 'm')
                printf("hai sbagliato devi inserire una lettera compresa tra a e m\n");
            else
                variabile = c;
        }
    
        return variabile;
    }
    
    int main()
    {
        char lettera, variabile;
    
        // qui puoi aggiungere i tuoi cicli for
        lettera = getLetteraNodo();
        variabile = getVariabileNodo();
    
        printf("Hai inserito: %c %c\n", lettera, variabile);
    
        return 0;
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    grazie c0der adesso mi funziona, ti ho inviato anche un messaggio privato non so se ti è arrivato!

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    c0der scusa se ti rompo un po dappertutto!!

    dove sbaglio? mi puoi dare un occhio?

    codice:
    #include <stdio.h>
    
    char getchar_with_prompt(char *prompt)
    {
        char c, tmp;
    
        printf("%s ", prompt);
        c = getchar();
        /*rimuovo i restanti caratteri dallo stdin*/
        tmp = c;
        while (tmp != '\n')
            tmp = getchar();
    
        return c; 
    }
    
    char getQuantifNodo() 
    {
        char c, quantif = 0;
    
        while (!quantif) {
            c = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (c != 'A' && c != 'E')
                printf("hai sbagliato devi inserire A or E\n");
            else
                quantif = c;
        }
    
        return lettera;
    }
    
    char getVariabileNodo() 
    {
        char c, variabile = 0;
    
        while (!variabile) {
            c = getchar_with_prompt("Digita la variabile da inserire nel nodo...:");
            if (c < 'n' || c > 'z')
                printf("hai sbagliato devi inserire una lettera compresa tra n e z\n");
            else
                variabile = c;
        }
    
        return variabile;
    }
    
    char getLetteraNodo() 
    {
        char c, lettera = 0;
    
        while (!lettera) {
            c = getchar_with_prompt("Digita la lettera da inserire nel nodo...:");
            if (c < 'a' || c > 'z')
                printf("hai sbagliato devi inserire una lettera compresa tra a e z\n");
            else
                lettera = c;
        }
    
        return lettera;
    }
    
    int main()
    {
    
    
        int  i, j, k, Ri, Co;
        char lettera, variabile, quantif, matrix[Ri][2], array[Co];
    
    
    	printf("inserisci il numero totale di elementi che vuoi inserire nella formula: \n");
    	scanf("%d", &Ri);
    
    
    
       for(i=0; i<Ri; i++)
          {
     	quantif = getQuantifNodo();
        	variabile = getVariabileNodo();
        	matrix[i][0] = quantif;
        	matrix[i][1] = variabile;
          }
    
    
    	printf("inserisci il numero totale di elementi che vuoi inserire nella formula P(): \n");
    	scanf("%d", &m);
    
    
    
       for(j=0; j<Co; j++)
         {
     	lettera = getLetteraNodo();
        	array[j] = lettera;
         }
    
    
    	printf(" la formula inserita è:\n ");
    	for(h=0; h<Ri; h++)
    	{	
    	printf("%c %c\t", matrix[h][0], matrix[h][1]);	
    	}
    
        		printf(" P ( ");
    		for(k=0; k<Co; k++)
    		{
        		printf(" %c ", array[k]);
    		}
        		printf(" ) ");
    
        return 0;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    38
    mentre questo è l'esecuzione dell'algoritmo:

    codice:
    	        printf("\nEsecuzione dell'algoritmo\n");
    	
         for (j = 0; j < n_tot; j++)
    	{
    	if (matrix[j][0] == 'V' )
    		{
    		A1[j] = matrix[j][1]; /*è una specie di array temporaneo*/
    		matrix2[j][0] = matrix[j][0];
    		matrix2[j][1] = matrix[j][1];
    		}
    
    	if (matrix[0][0] == 'E' )
    		{
    		/*funzione di ricerca nell'array, se è presente una lettera = variabile allora aggiungo una costante in A2 del tipo c1...cn*/
    		A2[j] = costante;
    		}
    
    	if (matrix[j][0] == 'E' )
    		{
    		/*funzione di ricerca nell'array, se è presente una lettera = variabile allora aggiungo una funzione in A2 del tipo F()...Z() dove dentro la parentesi ci sono i valori di A1;
    F(A1)*/
    		A2[j] = funzione;
    		}
    	}
    
    	printf (" la formula dopo l'algoritmo è:\n ");
    
         for (t = 0; t < n_tot; t++)
    	{
    	printf ("%c", matrix2[t][0]);
    	printf ("%c", matrix2[t][1]);  
    	}
    
    
    
    	printf ("\tP(");
    
         for (w = 0; w < n_tot; w++)
    		{
    		printf (" %c ", A2[w]);
    		}
    
    	printf (")\n");
    
    
    
        return 0;
    }
    anche qui, mi puoi dire dove sbaglio,
    come posso fare per costante e funzione? hai qualche idea??

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 © 2026 vBulletin Solutions, Inc. All rights reserved.