Rimpiazzare switch con if else

di il
6 risposte

Rimpiazzare switch con if else

Scusate se oggi è il secondo esercizio che posto ma proprio non riesco a venirne a capo L'esercizio mi chiede di sostuire lo switch prima con else if poi solo con if prestando particolare attenzione al caso default.Questo è il codice
#include <stdio.h>
int main (void) {
    int grade=0;
    int aCount = 0;
    int bCount = 0;
    int cCount = 0;
    int dCount = 0;
    int fCount = 0;
    int A,a,B,b,C,c,D,d,F,f;
    
    printf("Enter the letter grades.\n");
    printf("Enter the EOF character to end the input.\n");
   
    while ((grade=getchar())!=EOF) {
              if(grade==A || grade==a){
              ++aCount;
              }else if (grade==B|| grade==b){
              ++bCount;
              }else if (grade==C || grade==c){
              ++cCount;
              }else if (grade==D || grade==d){
              ++dCount;
              }else if (grade==F || grade==f){
              ++fCount;
              }else 
              {
              printf("Incorrect letter grade entered.");
              printf("Enter a new grade.\n");
              }
              }
              printf("\nTotals for each letter grade entered are:\n");
              printf("A: %d\n", aCount );
              printf("B: %d\n", bCount );
              printf("C: %d\n", cCount );
              printf("D: %d\n", dCount );
              printf("F: %d\n", fCount );
              fflush(stdin);
              getchar();
              return 0;
              }
              
se inserisco a b c d f mi stampa Incorrect letter grade entered.Enter a new grade.
se inserisco qualsiasi altro carattere mi stampa Incorrect letter grade entered.Enter a new grade. due volte.
se inserisco EOF i contatori sono tutti a 0. Dove sbaglio?

6 Risposte

  • Re: Rimpiazzare switch con if else

    Sbagli due cose:
    1) Fai un test sui valori delle due variabili e non sul valore ASCII del carattere che deve contenere --- if (grade == 'A') ---
    2) Hai il buffer di tastiera sporco con il INVIO (\n). Alla seconda iterazione legge il carattere e non lo riconosce andando nella zona else.

    Per il secondo caso hai due possibilità:
    1) o pulisci il buffer
    2) o aggiungi un if (grade=='\n') che non fa niente
  • Re: Rimpiazzare switch con if else

    Ciao ixamit ora funziona,però non ho capito bene. Cioè ho capito che se imposto la condizione
    if (grade) == '\n' ignora i newline.
    Non ho capito però:
    1)quali sono i newline che interferiscono
    2)se scrivo A così e non così 'A' se non valuta il carattere ASCII che valuta? L'ultimo valore numerico in memoria attribuito alla variabile A?
    3)Come si pulisce il buffer?

    Non sapevo neanche che fosse il buffer!

    Il buffer è utilizzato per la comunicazione fra componenti che lavorano a velocità differenti. Ad esempio se la CPU, che lavora ad alta velocità, deve spedire alcuni dati alla stampante, la quale supporta una velocità molto minore, scriverà tali dati nel buffer di memoria, potendo così continuare a lavorare ad un altro processo mentre la stampante può stampare il dato leggendolo dal buffer e non interrompendo la CPU. Viceversa, se la CPU è impegnata in lavori gravosi, potrebbe "perdere" alcuni input se non fossero salvati in un buffer e poi prelevati dal processore.
    I buffer sono necessari per coprire i tempi di latenza dei collegamenti di rete. Due dispositivi che devono inviarsi grandi quantità di dati, in un sistema monodirezionale, dovranno salvare i dati da inviare in un buffer, per poi inviarlo quando il canale è libero.

    Questa tecnica è fondamentale per gli hub di rete. Se più canali convogliano il traffico verso un solo hub, questo è costretto a salvare temporaneamente tutti i dati in arrivo in un buffer, svuotandolo mano a mano che i dati vengono inviati.

    Ora ho capito cos'è il buffering=per me ex tempo di caricamento dei video
  • Re: Rimpiazzare switch con if else

    1)quali sono i newline che interferiscono
    Il newline il carattere di [INVIO], quello che premi dopo l'inserimento della lettera. Deve necessariamente stare nel buffer perchè serve principalmente a redirigere con la stessa logica, input di tipologia differente... per esempio file.
    Se scrivo un file testuale e metto:
    
    ABBBBCDDF
    
    Posso tranquillamente chiamare il tuo programmino così:
    
    programmino < file
    
    per ottenere la stessa cosa.
    2)se scrivo A così e non così 'A' se non valuta il carattere ASCII che valuta? L'ultimo valore numerico in memoria attribuito alla variabile A?
    Esattamente. Avrei anche potuto dire:
    
    A='A';
    if (grade == A)
    
    3)Come si pulisce il buffer?
    Se cerchi in questo forum trovi le spiegazioni che sono state date più volte.

    Ciao
  • Re: Rimpiazzare switch con if else

    Abbi pazienza ixamit ma non ho capito la spiegazione del punto 1 volevo semplicemente sapere i newline di quale riga interferivano dato che nei cicli if else non ce ne sono
  • Re: Rimpiazzare switch con if else

    Si, scusami... mi riferivo al buffer di tastiera.
    La tua variabile grade al secondo giro contiene il carattere '\n' che non viene riconosciuto nelle condizioni if e else if, ma viene riconosciuto nell' else
  • Re: Rimpiazzare switch con if else

    No scusami tu se sono un po' tarato ma la \n nel secondo giro nn la vedo,cioè nel corpo switch non ci sono newline
Devi accedere o registrarti per scrivere nel forum
6 risposte