Comptage des voyelles d'une suite de caracteres, plusieurs questions..

Comptage des voyelles d'une suite de caracteres, plusieurs questions.. - C - Programmation

Marsh Posté le 29-03-2010 à 12:31:40    

Bonjours a tous   :)  
 
Voila plusieurs questions a propos de ce code :
 
1/ Pourquoi il est écrit while(c != '\n') au lieu de while(c != '\0') car ce dernier correspond a la fin de la chaine de caractère, mais '\n' ? o_O
 
 
2/ Pourquoi dans le scanf il est écrit "%c" qui correspond a un caractère au lieu de "%s" qui correspond a une chaine de caractère, car dans ce code on rentre une phrase et non une lettre?
 
 
3/ Pourquoi le scanf fait parti de la boucle alors que le texte est demandé a être taper qu'une seul fois? (dans ce code, normalement a chaque boucle je dois taper le texte car scanf est dans la boucle)
 
 
4/ Et enfin peut on utiliser la boucle while au lieu de Do.. while ? si non, pourquoi?
 
Merci a vous d'avance  :)  
 
Voici le code :
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3. char voy[6] = {'a','e','i','o','u','y'}, c;
  4. int compte[6] = {0}, i;
  5. printf("Donnez un texte de votre choix :\n" );
  6. do
  7.   { scanf("%c", &c);
  8.     for(i = 0; i < 6; i++)
  9.      if(c == voy[i])
  10.       compte[i] = compte[i] + 1;
  11.   } while(c != '\n');
  12.   printf("Votre texte comporte :\n" );
  13.   for(i = 0; i < 6; i++)
  14.   printf("%d fois la lettre %c\n", compte[i], voy[i]);
  15.   return 0;
  16. }

Reply

Marsh Posté le 29-03-2010 à 12:31:40   

Reply

Marsh Posté le 29-03-2010 à 13:01:01    

Citation :

1/ Pourquoi il est écrit while(c != '\n') au lieu de while(c != '\0') car ce dernier correspond a la fin de la chaine de caractère, mais '\n' ? o_O


Il y a un \n parce que l'appuie sur la touche "entrée" vaut ce symbole.

Citation :

2/ Pourquoi dans le scanf il est écrit "%c" qui correspond a un caractère au lieu de "%s" qui correspond a une chaine de caractère, car dans ce code on rentre une phrase et non une lettre?
 
3/ Pourquoi le scanf fait parti de la boucle alors que le texte est demandé a être taper qu'une seul fois? (dans ce code, normalement a chaque boucle je dois taper le texte car scanf est dans la boucle)


En utilisant la tactique de mettre le symbole %c au lieu d'une chaine de caractère c'est que le texte n'a pas besoin d'être délimité, car si j'écris par exemple voyelle, le v sera pris en compte au premier passage de la boucle, puis (et c'est là l'intérêt de mettre le scanf dans la boucle) le o sera récupéré automatiquement grâce au buffer, et ainsi de suite jusqu'au \n. Alors qu'avec une chaine on aurait dû délimiter le mot, ce qui est dommage si la personne s'appelle Schwarzenegger  :lol: . Le buffer c'est une chaine de caractère virtuelle si tu veux, vu qu'on demande un seul caractère, le reste de la chaine est stockée dans cette variable (qui est virtuelle attention, donc pas appelable) quand on fait un appelle à scanf par exemple, la fonction regarde s'il y a quelque chose dans le buffer et si c'est le cas, un caractère ou une chaine est récupéré. Le seul désavantage, c'est qu'il faut bien vider le buffer avant de passer à la suite du programme pour ne pas récupérer des fausses données qui seraient restées dans le buffer, mais une petite fonction peut faire ce travail :p

Citation :

4/ Et enfin peut on utiliser la boucle while au lieu de Do.. while ? si non, pourquoi ?


L'intérêt du do...while, c'est que la boucle se fait au moins au fois même si la condition est fausse dès le départ, ce qui n'est pas nécessaire ici, donc un while direct est possible.

Message cité 1 fois
Message édité par Dolphin Dice le 29-03-2010 à 13:01:51

---------------
Apprenez à créer des jeux d'aventure avec AGS
Reply

Marsh Posté le 29-03-2010 à 13:09:39    

Ce genre d'énoncé fait penser à un devoir : ici, on ne les fait pas :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-03-2010 à 13:32:23    

Merci Dolphin Dice c'est plus claire..
 
Mais c'est quoi "le buffer"?
 
Et si on utilise une chaine de caractère d'une taille [1000] c'est suffisant pour taper une petite phrase donc c'est possible d'utiliser %s ?

Reply

Marsh Posté le 29-03-2010 à 13:37:38    

lassault1 a écrit :


2/ Pourquoi dans le scanf il est écrit "%c" qui correspond a un caractère au lieu de "%s" qui correspond a une chaine de caractère, car dans ce code on rentre une phrase et non une lettre?


Tout simplement parce que le programme effectue le comptage au fur et a mesure que l'utilisateur tape au clavier! (et donc caractère par caractères)
Si le programme effectuait le comptage après la saisie on aurait utiliser scanf avec %s et alors on aurait parcouru la chaine caractere par caractere jusqu'a '\0'

Reply

Marsh Posté le 29-03-2010 à 18:24:54    

Dolphin Dice a écrit :

L'intérêt du do...while, c'est que la boucle se fait au moins au fois même si la condition est fausse dès le départ, ce qui n'est pas nécessaire ici, donc un while direct est possible.

Non, le do while est obligatoire à moins que c ne soit initialisé à 0, on ne sait jamais.

Reply

Marsh Posté le 29-03-2010 à 20:24:30    

Citation :

Non, le do while est obligatoire à moins que c ne soit initialisé à 0, on ne sait jamais.


 
Pourquoi le do..while est obligatoire dans ce code car je suis plutôt de l'avis de Dolphin Dice ?

Message cité 1 fois
Message édité par lassault1 le 29-03-2010 à 20:25:13
Reply

Marsh Posté le 29-03-2010 à 22:32:46    

Parce que si par malheur c, qui n'est pas initialisé dans ton code, vaut '\n' alors tu n'entres jamais dans la boucle.  
Peu de chance que ça arrive, mais on ne sait jamais, et ce sera justement le jour où tu montreras le code à ton prof que ça arrivera !

Reply

Marsh Posté le 29-03-2010 à 22:38:43    

lassault1 a écrit :

Citation :

Non, le do while est obligatoire à moins que c ne soit initialisé à 0, on ne sait jamais.


 
Pourquoi le do..while est obligatoire dans ce code car je suis plutôt de l'avis de Dolphin Dice ?


 
L'interet du do..while est surtout le fait que l'on doit passer au moins une fois dans la boucle, c'est a dire que l'on demande a l'utilisateur au moins une saisie et le do..while reflète ca de manière simple.
 
Si l'on souhaite utiliser un while, il faut faire une saisie avant la boucle et une a la fin de la boucle, ce qui est un peu moins élégant:

Code :
  1. scanf("%c", &c);
  2. while(c != '\n')
  3. {
  4.       for(i = 0; i < 6; i++)
  5.       {
  6.           if(c == voy[i])
  7.               compte[i] = compte[i] + 1;
  8.       }
  9.       scanf("%c", &c);
  10. }


Message édité par breizhbugs le 29-03-2010 à 22:40:07
Reply

Marsh Posté le 30-03-2010 à 01:00:17    

Trap D a écrit :

Parce que si par malheur c, qui n'est pas initialisé dans ton code, vaut '\n' alors tu n'entres jamais dans la boucle.  
Peu de chance que ça arrive, mais on ne sait jamais, et ce sera justement le jour où tu montreras le code à ton prof que ça arrivera !


 
Oui mais même si 'c' n'est pas initialisé et qui vaut '\n' alors il y aura qu'une seule boucle donc le tableau ne sera pas trier...

Reply

Marsh Posté le 30-03-2010 à 01:00:17   

Reply

Marsh Posté le 30-03-2010 à 07:15:04    

lassault1 a écrit :


 
Oui mais même si 'c' n'est pas initialisé et qui vaut '\n' alors il y aura qu'une seule boucle donc le tableau ne sera pas trier...

Pas avec un while, avec un do / while oui.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed