2017-08-12 1 views
0

j'ai fait un programme simple C qui doit être terminé lorsque le personnage EOF est entré (Ctrl-Z pour Windows) et devrait imprimer:la fin du fichier (EOF) dans le programme C

  • Passé si la note est supérieure ou égale à 5.
  • Passé avec un passage haut si la note est supérieure ou égale à 8.
  • Échec dans tous les autres cas.

J'utilise getchar() pour les entrées de l'utilisateur (note dans ce cas).

#include <stdio.h> 

int main() { 
    int grade; 
    puts("Enter a grade\n"); 
    puts("Enter the EOF character to end input\n"); 

    while ((grade = getchar()) != EOF) { 
     if (grade >= 5) { 
      puts("Passed"); 
      if (grade >= 8) { 
       puts("with High Pass\n"); 
      } 
     } else { 
      puts("Failed\n"); 
     } 
    } 
    return 0; 
} 

Le problème est que le programme ne fait pas ce qui est censé être faire et j'apprécierait si vous pouviez me aider à trouver une solution.

+2

Notez que 'EOF' est pas un caractère, mais une macro pour la valeur retournée par certaines fonctions lorsqu'une condition de fin de fichier est rencontré (ou renvoyé lorsqu'il y a une erreur dans certains cas). –

+0

Et si l'utilisateur entre 'A' au lieu de 8? – user3629249

Répondre

3

Le programme ne fonctionne pas comme prévu pour 2 raisons:

  • octets lus à partir stdin ne sont pas des valeurs numériques: si le type d'utilisateur 1, le programme reçoit '1' qui est la valeur de caractère, pas la valeur numérique. Vous pouvez calculer la valeur numérique d'un caractère à deux chiffres en soustrayant la valeur de caractère de '0':

    int c = getchar(); 
    if (c >= '0' && c <= '9') { 
        int grade = c - '0'; 
        /* you can now test the grade */ 
    
  • Vous lisez l'entrée standard d'un octet à la fois: il ne permet pas pour les classes qui dépassent 9. Si l'utilisateur tape 10, vous testerez deux niveaux et produira deux fois Failed!.

Voici une autre version avec scanf():

#include <stdio.h> 

int main(void) { 
    int grade; 
    puts("Enter the grades\n"); 
    puts("Enter the EOF character to end input\n"); 

    while (scanf("%d", &grade) == 1) { 
     if (grade >= 8) { 
      puts("Passed with High Pass"); 
     } else 
     if (grade >= 5) { 
      puts("Passed"); 
     } else { 
      puts("Failed\n"); 
     } 
    } 
    return 0; 
} 
+0

Assez clair. Je vous remercie :) –

-1

Vous obtenez le code ascii du chiffre entré, pas sa valeur. Convertissez-le en nombre avant comparaison.

while ((grade = getchar()) != EOF) { 
    getchar(); // flush the \n 
    if (isdigit(grade)) 
    { 
     int intgrade = grade - '0'; 

     if (intgrade >= 5) { 
      puts("Passed"); 
      if (intgrade >= 8) { 
       puts("with High Pass\n"); 
      } 
     } 
     else { 
      puts("Failed\n"); 
     } 
    } 
    else printf("Wrong entry\n"); 
} 

return 0; 
+0

Vous pouvez faire une distribution simple par exemple: 'int grade_as_int = (int) grade;' –

+1

@ m.nachury - vous ne pouvez pas. Il ne convertit pas '' 1''en entier 1. il attribue à 'grade_as_int' le code ascii de grade. Tout va passer sera le "High Pass" –

+2

Si vous insérez le numéro plus d'un chiffre, il vide le deuxième chiffre au lieu de '\ n ', donc pour' 45' est sortie a échoué. C'est faux. –