1er test > Compte-rendu

Aller en bas

1er test > Compte-rendu

Message  dellC le Lun 24 Nov - 18:32

Voici un petit compte rendu du test de ce lundi 24 :

1. Fibonacci (pas indiquer explicitement comme titre)
Le code va affiché une suite de nombre et ensuite affiché le nombre de nombre paire qu'il y avait.
Code:
 [Une ligne vide]
1
2
3
5
8
13
21
34
55
3
Le truc qui m'a un peu perturbé, c'est l'absence du void devant le main() ... Le code ici, retranscrit par mes soins et ma mémoire ...


2. Permutation
Question assez facile, une fonction qui inverse deux entiers si le premier est plus grand que le premier, avec utilisation de pointeur s'il-vous-plait. Voici mon code ...


3. PGCD
La question qui m'a bien fait chier, genre c'est super intéressant d'étudier le théorème d'Euclide par cœur ... Je l'ai complètement bâclée


4. Dates
Transforme une date du format jj/mm/aaaa au format jj mmm...[nom du mois] aaaa. Assez facile, mais j'ai eu quelques soucis de buffer qui ne se vidait pas ... Voici mon code ...
avatar
dellC

Messages : 120
Date d'inscription : 07/11/2008
Age : 29
Localisation : Herve

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  Misterkiller le Lun 24 Nov - 21:09

Parle pour toi xD moi a part le 1er et 3eme les autres j'ai raté :p mdrrr
avatar
Misterkiller

Messages : 169
Date d'inscription : 05/10/2008
Age : 28
Localisation : Waremme

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  Admin le Lun 24 Nov - 21:23

Salut,

Euh, attendez, vous avez fait le test sur papier ou sur PC ?

Le truc qui m'a un peu perturbé, c'est l'absence du void devant le main()
Pas un piège. Il y a eu plusieurs versions du langage C, et dans les plus anciennes il était autorisé de ne pas donner de type de valeur de retour à la fonction main. Cela a été corrigé par la suite. Le prof ne met jamais ce void et n'a donc pas suivi la norme standard du C, comme d'habitude, du coup le compilo n'aime pas, et c'est normal. Il faut toujours donner un type de retour à main, que ce soit void ou int.

genre c'est super intéressant d'étudier le théorème d'Euclide par cœur
Je compatis. L'an dernier on avait eu une question d'examen style : "Citez trois exemple d'utilisation de récursivité vu dans le cours". Alors forcément pour ceux qui connaissent déjà le C et ne vont pas au cours, çà fou les boules de perdre 5 points pour une connerie pareille.

j'ai eu quelques soucis de buffer qui ne se vidait pas
Je pense que tu parles de saisies clavier qui ont été "sautées". Petit topo là dessus, parce que çà aussi, c'est mal expliqué.

  • Lorsque vous utilisez la fonction scanf(), l'utilisateur va taper deux choses avec son clavier, ce que vous lui avez demandé (int, float, caractère, chaine) et le caractère "Entrée" de validation (\n si vous préférez). Tout cela va dans un buffer d'entrée pour y être traité.
  • Cependant, le caractère de validation '\n' reste dans le buffer puisqu'il ne fait pas partie de ce qui était demandé. Du coup, la prochaine fois qu'un caractère sera demandé au clavier, scanf ne va pas attendre que l'utilisateur entre quelque chose puisqu'il aura déjà ce '\n' resté dans le buffer. Il va donc s'en servir et zapper la saisie clavier.
  • Exemple :
    int age;
    char c;
    char s[10];
    char c_2;

    printf("\nEntrez votre age : ");
    scanf("%d",&age);
    /* j'ai 20 ans, je rentre donc 20 et je valide par "Entrée". scanf() va donc prendre le 20 et le mettre dans age. Le "Entrée" reste dans le buffer.*/

    printf("\nEntrez un caractere : ");
    scanf("%c",&c);
    /* Ici, scanf va aller chercher un caractère se trouvant dans le buffer, et va donc prendre \n. Il va aller le mettre dans c */

    printf("\nAVANT%cAPRES",c);
    /* devrait afficher AVANT, retour à la ligne, APRES.*/

    printf("\nEntrez une chaine : ");
    scanf("%s",s);
    /* Ici, l'utilisateur va pouvoir entrer une chaine de caractère. Cependant, il va entrer sa chaine mais de nouveau y laisser un '\n' !*/

    printf("\nEntrez enfin un dernier caractere : ");
    scanf("%c",&c_2);
    /* Du coup, impossible d'entrer le dernier caractère, et fin du programme ! */

  • Comment faire alors pour éviter ce problème ?
    Je ne doute pas que M. Gerday vous ait parlé de... fflush(stdin). C'est une fonction qui est sensée prendre en paramètre un flux de sortie. Cependant, on lui passe stdin qui est le flux d'entrée par défaut ! C'est littéralement un abus de langage (C), et donc à proscrire. Si vous voulez plus d'infos, il faudra me le demander...

  • Et donc, comment faire pour éviter ce problème proprement ?
    • Je propose la solution la plus facile, je ne vais pas m'attarder sur les options d'écriture complexes de scanf.
    • Il suffit en fait de récupérer ce caractère '\n' du buffer juste après que celui-ci y ait été placé ! Mais comment ?
    • Utiliser la fonction getchar(). Cette fonction capture un seul caractère au clavier (et donc a fortiori dans le même buffer que scanf, là où restent les \n).
    • Elle retourne le caractère entré que l'on peut récupérer en faisant c = getchar(); Mais cela ne nous servira pas dans ce cas puisqu'on ne veut pas récupérer le '\n', on veut juste le virer du buffer.


  • Et donc, proprement, le code ci-dessus est amélioré en :
    int age;
    char c;
    char s[10];
    char c_2;

    printf("\nEntrez votre age : ");
    scanf("%d",&age);
    /* j'ai 20 ans, je rentre donc 20 et je valide par "Entrée". scanf() va donc prendre le 20 et le mettre dans age. Le "Entrée" reste dans le buffer.*/
    getchar(); /* et ici, on l'en sort ! */

    printf("\nEntrez un caractere : ");
    scanf("%c",&c);
    /* Maintenant, l'utilisateur pourra ici entrer son caractère. Cependant, quand il va l'entrer, il va encore rester un '\n' dans le buffer !*/
    getchar(); /* donc on s'empresse de le virer */

    printf("\nAVANT%cAPRES",c);
    /* devrait afficher AVANT, le caractère entré, APRES.*/

    printf("\nEntrez une chaine : ");
    scanf("%s",s);
    /* Ici, l'utilisateur va pouvoir entrer une chaine de caractère. Cependant, il va entrer sa chaine mais de nouveau y laisser un '\n' !*/
    getchar(); /* rebelotte. */

    printf("\nEntrez enfin un dernier caractere : ");
    scanf("%c",&c_2);
    /* Et voila, le programme est terminé. Cependant je vous conseille tout de même d'ajouter le getchar() allant avec la saisie de ce dernier caractère. Car si vous vouliez ensuite ajouter du code à la suite, il est possible qu'un oubli soit bien ennuyeux... */
    getchar();

Voilou . . .
avatar
Admin
Admin

Messages : 428
Date d'inscription : 11/09/2008
Age : 30
Localisation : Mortroux

Voir le profil de l'utilisateur http://info-gestion.1fr1.net

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  dellC le Lun 24 Nov - 21:55

Le test a été fait sur feuille, ce qui est très embettant, notamment lorsqu'on doit déclarer des variables et qu'on avait pas prévu assez de place pour les noter alors qu'on y pensait pas tout de suite...

Pour le problème de buffer, je savais bien que c'était dans le cours, mais je m'en souvenais plus. Et en retranscrivant mon code tantôt sur l'ordi, j'avais pas envie d'aller trifouiller dans mon syllabus ...
avatar
dellC

Messages : 120
Date d'inscription : 07/11/2008
Age : 29
Localisation : Herve

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  Admin le Lun 24 Nov - 22:01

je savais bien que c'était dans le cours
Cà m'étonnerait bien que ce soit expliqué de la même manière que moi ;o)
avatar
Admin
Admin

Messages : 428
Date d'inscription : 11/09/2008
Age : 30
Localisation : Mortroux

Voir le profil de l'utilisateur http://info-gestion.1fr1.net

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  RP le Lun 24 Nov - 23:24

tu as trouvé ta voie mon cher
avatar
RP

Messages : 50
Date d'inscription : 14/10/2008
Age : 31
Localisation : Engis

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  Admin le Lun 24 Nov - 23:59

tu as trouvé ta voie mon cher
^^
(tiens rien à voir, faudra que demain je te raconte ce qui m'est arrivé... Tu vas mourir de rire) lol!
avatar
Admin
Admin

Messages : 428
Date d'inscription : 11/09/2008
Age : 30
Localisation : Mortroux

Voir le profil de l'utilisateur http://info-gestion.1fr1.net

Revenir en haut Aller en bas

Re: 1er test > Compte-rendu

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum