Problème avec un programme C

GH -  
 Gen -
Bonjour,
Je dois faire:
Numéro 2 (18 pts)

Matière: boucles while, do while, for imbriqués, validation, fonctions,

Description:
Écrire un programme C qui permet de dessiner un des chiffres, décrits plus loin, et choisi dans un menu interactif présentant différentes options.
Chiffres à dessiner
Chiffre 0 Chiffre 7
***** *****
* * *
* * *
* * *
***** *
Le programme doit :
• afficher le menu suivant : Menu
O : chiffre 0
S : chiffre 7
Q : quitter
• permettre à l’usager de faire le choix du chiffre à dessiner
• valider le choix de l’usager et lui permettre d'entrer le bon choix
• demander à l’usager de fournir la hauteur du chiffre (nombre de lignes et de colonnes du dessin)
• valider les données (hauteur comprise entre 5 et 11 et impaire)
• permettre à l’usager de recommencer en cas d’erreurs (fournir une autre hauteur)
• permettre à l’usager de faire d’autres dessins (les mêmes chiffres évidement)
• quitter le programme avec l’option Q
Note : Vous devez vous inspirer du squelette du main donné en annexe( page 3 et sur page web)

Critères de correction:
Fonctionnement (compilation et exécution)
: 10 pts
Fonctions et codage (boucles, validation…….) : 7 pts
Présentation du programme (commentaires, indentation, ...) et de l'affichage : 1 pt

Mais là, ça fais un bout que je travaille dessus... et je ne vois plus mes erreurs... quelquerci!'un peux m'aider svp?

voilà ce que ça donne: (il n'y a que la ligne du haut qui affiche pour le chiffre 7, le chiffre 0 n'affiche pas et le quitter lui fonctionne)
Menu
O : Chiffre 0
S : Chiffre 7
Q : Quitter
Entrez votre choix : S
Entrez la hauteur du chiffre : 6
*****

Menu
O : Chiffre 0
S : Chiffre 7
Q : Quitter
Entrez votre choix :
Entrez votre choix : O
Entrez la hauteur du chiffre : 7
Menu
O : Chiffre 0
S : Chiffre 7
Q : Quitter
Entrez votre choix :
Entrez votre choix : Q

Appuyer sur une touche pour continuer

et voilà mon programme:

/* T.p.2 Numero 2

*/
#include <stdio.h>
#include <ctype.h>

//Fonctions

void afficherMenu ()
{
printf ("Menu");
printf ("\n O : Chiffre 0");
printf ("\n S : Chiffre 7");
printf ("\n Q : Quitter");
}
// Fin afficher menu

// Lire choix

char lirechoix (){
char O,S,Q,choix;
do
{
printf(" \nEntrez votre choix : ");
scanf("%c", &choix);
}
while ( choix !='O' && choix !='S' && choix !='Q');
return choix;
}
// Fin lire choix

// Lire hauteur

int lirehauteur() {
int min,max,hauteur;
min=5;
max=11;
do
{
printf(" Entrez la hauteur du chiffre : ");
scanf("%d", &hauteur);
}
while ( hauteur < min && hauteur > max );
return hauteur ;
}
//fin lire hauteur

//Dessiner le chiffre 0

void dessiner0 (int hauteur) {
int i;

for(i=0;i<5;i++)

printf("*");
printf("\n");

for ( hauteur=0; hauteur<4; hauteur++) {
printf ("* *");
printf("\n"); }

for(i=0;i<5;i++)

printf("*");
printf("\n");

}
// Fin dessiner le chiffre0

//Dessiner le chiffre7

void dessiner7 (int hauteur){
int u;
for(u=0;u<5;u++)
printf ("*");
printf ("\n");
for (u =1; u<=4; u++)
{
for (u=1; u <=11; u++)
{
if (u+hauteur==5)
printf ("*");
else
printf (" ");
}
printf ("\n");
}
}
// Fin dessiner le chiffre 7

// Faire une pause
void fairepause ()
{
printf ("\n Appuyer sur une touche pour continuer");
getch();
}
// Fin de faire une pause

//fonction principale

void main()
{
char choix; // choix de l'usager
int hauteur; // hauteur de la lettre

do
{
afficherMenu();
choix = lirechoix();
if ( choix != 'Q' )
{
hauteur = lirehauteur();
switch (choix)
{
case '0' : dessiner0(hauteur); break;
case 'S' : dessiner7(hauteur); break;
}// fin switch
} // fin if
}// fin while
while (choix != 'Q');

fairepause();

} // fin main

M
Configuration: Windows XP
Internet Explorer 7.0

6 réponses

  1. le père
     
    Bonjour

    Tu as bien avancé...

    Dans le dessin du 7, tu utilises la même variable u dans 2 boucles imbriquées. Quand tu sors de ta boucle intérieure u vaut 12 et tu sors immédiatement de ta boucle extérieure.
    De toutes manières, je ne comprens rien du tout à la logique ce tes boucles. Pour dessiner un 7 d'une hauteur donnée, après avoir tracé la barre du haut, il te reste à écrire hauteur-1 lignes de 4 espaces + 1 *. Je ne vois pas du tout le rapport avec ton u+hauteur==5. Mais je n'ai peut-être pas tout compris.

    Dans le dessin du 0,
    D'abord le switch. Il ne faut pas confondre le chiffre 0 et la lettre O
    ensuite, ta fonction dessiner0 : tu lui donnes une variable hauteur comme paramètre, mais ta boucle for commence par remplacer hauteur par 0. Tu ne pourras plus jamais faire la hauteur voulue, tu l'as oubliée. Alors tu fait 5 boucles au lieu d'en faire hauteur-2 comme il est demandé.
    En fait il faudrait faire for (u=0; u<hauteur-2;u++)

    Dernières remarques : enlève les char O,S,Q qui ne servent à rien dans lirechoix
    et pour afficher 5 *, tu n'as peut être pas besoin d'une boucle, un printf ("*****\n") devrait suffire.
    0
  2. amigo
     
    encore une remarque

    min=5;
    max=11;
    do
    {
    printf(" Entrez la hauteur du chiffre : ");
    scanf("%d", &hauteur);
    }
    while ( hauteur < min && hauteur > max ); <--------- incorrect
    4<5 vrai 4>11 faux resultat (vrai && faux) = faux sortie de la boucle avec hauteur=4

    le test correct est
    while ( hauteur < min || hauteur > max );

    J'ai corrigé et testé le prog, à part l'ecriture du 7 qui n'est pas belle si hauteur > 7 le reste est bon.
    Si tu ne trouve pas tes erreurs je te le passerai.

    Salut
    0
    1. GH
       
      Premierement, merci...

      J'ai tout corrigé mes erreurs, mais là il reste encore deux bog... ce fameux 7 qui affiche toujours la même grandeur et non celle que l'utilisateur entre

      Menu
      O : Chiffre 0
      S : Chiffre 7
      Q : Quitter
      Entrez votre choix : S
      Entrez la hauteur du chiffre : 6
      *****
      *
      *
      *
      *
      Menu
      O : Chiffre 0
      S : Chiffre 7
      Q : Quitter
      Entrez votre choix :
      Entrez votre choix :

      le deuxieme bug c qu'il m'affiche deux fois entrez votre choix en dernier... ??

      /* T.p.2 Numero 2

      */
      #include <stdio.h>
      #include <ctype.h>

      //Fonctions

      void afficherMenu ()
      {
      printf ("Menu");
      printf ("\n O : Chiffre 0");
      printf ("\n S : Chiffre 7");
      printf ("\n Q : Quitter");
      }
      // Fin afficher menu

      // Lire choix

      char lirechoix (){
      char O,S,Q,choix;
      do
      {
      printf("\nEntrez votre choix : ");
      scanf("%c", &choix);
      }
      while ( choix !='O' && choix !='S' && choix !='Q');
      return choix;
      }
      // Fin lire choix

      // Lire hauteur

      int lirehauteur() {
      int min,max,hauteur;
      min=5;
      max=11;
      do
      {
      printf(" Entrez la hauteur du chiffre : ");
      scanf("%d", &hauteur);
      }
      while ( hauteur < min || hauteur > max );
      return hauteur ;
      }
      //fin lire hauteur

      //Dessiner le chiffre 0

      void dessiner0 (int hauteur) {
      int i;

      for(i=0;i<5;i++)

      printf("*");
      printf("\n");

      for ( i=0; i<hauteur-2; i++) {
      printf ("* *");
      printf("\n"); }

      for(i=0;i<5;i++)

      printf("*");
      printf("\n");

      }
      // Fin dessiner le chiffre0

      //Dessiner le chiffre7

      void dessiner7 (int hauteur){
      int u;
      for(u=0;u<5;u++)
      printf ("*");
      printf ("\n");
      for (u =1; u<=4; u++)
      {
      for (hauteur=1; hauteur <=4; hauteur++)
      {
      if (hauteur+u==5)
      printf ("*");
      else
      printf (" ");
      }
      printf ("\n");
      }
      }
      // Fin dessiner le chiffre 7

      // Faire une pause
      void fairepause ()
      {
      printf ("\n Appuyer sur une touche pour continuer");
      getch();
      }
      // Fin de faire une pause




      //fonction principale

      void main()
      {
      char choix; // choix de l'usager
      int hauteur; // hauteur de la lettre

      do
      {
      afficherMenu();
      choix = lirechoix();
      if ( choix != 'Q' )
      {
      hauteur = lirehauteur();
      switch (choix)
      {
      case 'O' : dessiner0(hauteur); break;
      case 'S' : dessiner7(hauteur); break;
      }// fin switch
      } // fin if
      }// fin while
      while (choix != 'Q');

      fairepause();


      } // fin main
      0
  3. BoonDu06 Messages postés 190 Statut Membre 25
     
    Bonjour ,

    Je ne sais pas si tu l'a encore appris mais pour tout ce qui est menu à ta place j'aurai utilisé les switch

    Exemple :

    {
    long choixMenu;

    printf("=== Menu ===\n\n");
    printf ("\n O : Chiffre 0");
    printf ("\n S : Chiffre 7");
    printf ("\n Q : Quitter");
    printf("\nQuel est votre choix ? ");
    scanf("%ld", &choixMenu);

    printf("\n");

    switch (choixMenu)
    {
    case 1:
    printf("Vous avez choisi le chiffre 0 !");
    break;
    case 2:
    printf("Vous avez choisi le chiffre 7");
    break;
    case 3:
    printf("Vous avez choisi de quitter);
    break;
    default:
    printf("Vous n'avez pas rentre une commande valide");
    break;
    }

    Voilà voilà : je sais que ce n'est pas le sens de ta question mais j'ai pensé que sa pourrait t'intéresser ...
    Merci de me dire ce que tu en pense ;-)

    Ps: je n'ai pas de compilo sous la main donc je ne sais pas si je n'ai pas fait de fautes mais à premières vu il a l'air bon :p

    Boon'
    0
  4. amigo
     
    Bonjour,

    Tu es pratiquement arrivé au bout.
    Pour dessiner le chiffre 7 voila comment e me suis pris.
    //Dessiner le chiffre7
    
    void dessiner7 (int hauteur){
    int u;
    int h;
    int d;
    
    d=div((hauteur-5), 2)-1;
    if (d<0) d=0;
    printf("\n");
    printf ("*****\n");
    
    for(u=0;u<d;u++) printf("    *\n");
    
    for (h=1; h<hauteur-d; h++)
    {
        for (u=0;u<5;u++){
          if (((u+h)==5) || ((h>5) && (u==0)))
              printf ("*");
          else
             printf (" ");
        }
    printf ("\n");
    }
    printf ("\n\n");
    }
    // Fin dessiner le chiffre 7
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. TBC Messages postés 3 Statut Membre
     
    bonjour,peux tu m'aider a comprendre turbo c++
    0