Vorrei un chiarimento su questa struttura Switch

di Anonimizzato7589 il
8 risposte
In pratica ho in parte costruito un programma, che visualizzi uno per volta se dall'intero inserito, costituito da piu cifre, esse siano pari o dispari, tramite visualizzazione, in ordine di lettura...in pratica, se inserisco 123487, il programma mi deve visualizzare, uno per volta, in base al numero letto, se pari o dispari...e ho fatto cosi...

#include <stdio.h>

int main()
{
	
	int grade;
  
printf("Inserisci un intero:");

while((grade = getchar()))	

switch(grade % 2){

case 0 :
printf("\n\nIl numero è pari");
break;

case 1:
printf("\n\nIl numero è dispari");
break;
		
case '\n' : case ' ' :
break;
}
	
return 0;
}



il problema è che in questo modo, l'ultimo valore letto, lo scrive due volte...e non capisco il motivo...cioè...se inserisco un numero composto da 5 cifre...otterrò 6 visualizzazioni...perchè?

8 Risposte

  • Come termini la sequenza? con il newline giusto? ebbene il getchar trasforma il \n nel suo corripettivo int (10). quindi lo switch lo piglia come numero. basta mettere un if(grade != '\n') prima dello switch e sei a posto.
  • Beh...si...però, cè il case che lo dovrebbe ignorare...sia ' ' che '\n'...no?
  • No lo switch decide se il risultato sarà 0 oppure 1. quei case lì non sono mai raggiunti.
  • Scusatemi, mi sono un po sbattuto su questa cosa del case per ignorare newline, e spazio...non capisco il motivo del perchè, quando lavoro con caratteri 'A', e inserendo appunto il case per ignorare i suddetti, lo faccia, e mentre invece, lo faccio con interi numerici, no...per capirsi, io ho questo esempio in codice:
    
    #include <stdio.h>
    
    int main(){
    
    int grade;
    
    int aCount=0, bCount=0, cCount=0, dCount=0;
    
    printf("Inserisci tutte le lettere dei voti(EOF=ctrl+d per terminare): ");
    
    while((grade = getchar()) != EOF){
    	
        switch (grade){
    	
    		case 'A' : case 'a' :
    	++aCount;
    	break;
    
    case 'B' : case 'b' :
    	++bCount;
    	break;
    
    case 'C' : case 'c' :
    	++cCount;
    	break;
    
    case 'D' : case 'd' :
    	++dCount;
    	break;
    	
    case '\n' : case ' ':
    			break;
    	
    default:
    	    
    			printf("\n\nIl valore inserito non è corretto, inseriscine un altro: ");
    			break;
    	}
    	}
    
    	printf("A: %d", aCount);
    	printf("\nB: %d", bCount);
    	printf("\nC: %d", cCount);
    	printf("\nD: %d", dCount);
    	
    	return 0;
    }
    
    
    e quando invece faccio una cosa simile:
    
    #include <stdio.h>
    
    int main()
    {
    	
    	int grade, pari, dispari;
    	
    	pari = 0;
    	dispari = 0;
      
    printf("Inserisci un intero:");
    
    	while((grade = getchar()) != EOF){	
    
    switch(grade % 2){
    
    case 0 :
    		pari++;
    break;
    
    case 1:
    		dispari++;
    break;
    		
    case '\n' : case ' ' :
    
    }
    	}
    	
    printf("\n\nI numeri dispari sono: %d", dispari);
    	
    printf("\n\nI numeri pari sono: %d", pari);
    	
    return 0;
    }
    
    non lo faccia...
  • Modifica:
    
    #include <stdio.h>
    
    int main()
    {
       
       int grade, pari, dispari;
       
       pari = 0;
       dispari = 0;
     
    printf("Inserisci un intero:");
    
       while((grade = getchar()) != EOF){   
     if(grade != '\n' && grade != ' ')
    switch(grade % 2){
    
    case 0 :
          pari++;
    break;
    
    case 1:
          dispari++;
    break;
    
    }
       }
       
    printf("\n\nI numeri dispari sono: %d", dispari);
       
    printf("\n\nI numeri pari sono: %d", pari);
       
    return 0;
    }
    
  • Ok, ti ringrazio sky...ma quello avevo capito...solo per pignoleria, non capisco ,perchè, nel codice costituito da interi numerici che è proporzionalmente lo stesso di quello fatto con caratteri...la stessa struttura che serve ad ignorare, in quella letterale, funziona, in quella numerica, no...perchè??non sono riuscito a capirlo...
  • Il '\n' è un carattere ASCII di valore 10. Nel caso int questo viene convertito in 10. Nel caso char non viene convertito e lo puoi bennissimo usare nello switch.
  • Ok...adesso si mi torna la cosa...perfetto...in effetti nel volume è anche specificato...e avevo intuito qualcosa del genere...ma volevo conferme..ok...perfetto sky, grazie ancora, anche a tutti gli altri che hanno preso in considerazione, i miei perchè...
Devi accedere o registrarti per scrivere nel forum
8 risposte