1er test > Compte-rendu
4 participants
Page 1 sur 1
1er test > Compte-rendu
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.
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 ...
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
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 ...
dellC- Messages : 120
Date d'inscription : 07/11/2008
Age : 35
Localisation : Herve
Re: 1er test > Compte-rendu
Parle pour toi xD moi a part le 1er et 3eme les autres j'ai raté :p mdrrr
Misterkiller- Messages : 169
Date d'inscription : 05/10/2008
Age : 33
Localisation : Waremme
Re: 1er test > Compte-rendu
Salut,
Euh, attendez, vous avez fait le test sur papier ou sur PC ?
Et donc, proprement, le code ci-dessus est amélioré en :
Voilou . . .
Euh, attendez, vous avez fait le test sur papier ou sur PC ?
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.Le truc qui m'a un peu perturbé, c'est l'absence du void devant le main()
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.genre c'est super intéressant d'étudier le théorème d'Euclide par cœur
Je pense que tu parles de saisies clavier qui ont été "sautées". Petit topo là dessus, parce que çà aussi, c'est mal expliqué.j'ai eu quelques soucis de buffer qui ne se vidait pas
- 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.
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 . . .
Re: 1er test > Compte-rendu
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 ...
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 ...
dellC- Messages : 120
Date d'inscription : 07/11/2008
Age : 35
Localisation : Herve
Re: 1er test > Compte-rendu
Cà m'étonnerait bien que ce soit expliqué de la même manière que moi ;o)je savais bien que c'était dans le cours
Re: 1er test > Compte-rendu
tu as trouvé ta voie mon cher
RP- Messages : 50
Date d'inscription : 14/10/2008
Age : 37
Localisation : Engis
Re: 1er test > Compte-rendu
^^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)
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|