PROGRAMME C

Bonjour, je utilise un boucle do .. while dans mon programme
mais il ne marche plus voici mon programme

#include <stdio.h>
void main()

{ int n;
do
{ printf("donner un entier");
scanf("%d",&n);
}
while ((n>=1)&&(n<=12));
switch (n)
{ case 1:printf ("janvier");
case 2:printf ("fevrier");
.
.
.
.}
}
Configuration: Windows XP
Firefox 2.0.0.18

13 réponses

  • Votes
  • Date
  • Date décroissante
  1. A mon avis c'est parce que tu n'as pas initialisé la variable n...

    Et puis tu devrais mettre des break; à la fin de chaque case.
    1. Salut Dragasani,

      je ne pense pas que son problème vienne de là car le test sur la valeur de n est effectué systématiquement après une saisie de son utlisateur, s'il avait utilisé une boucle while il aurait été possible de ne jamais rentrer dans la boucle si n était en dehors des conditions (n>0&&n<13) du à la valeur (quelconque et certainement pourrie) se trouvant à l'emplacment mémoire de n.

    2. @daronmasterOulala oui honte à moi je devrais aller me coucher lol
  2. effectivement comme le dit Dragasani, il faut mettre des break à la fin de chaque case sinon tu auras certainement à chaque fois soit "décembre" à ton affichage, soit la valeur par defaut de ton printf de ton "default"
    1. et sinon ta condition est bien formulée mais nous pensons que cela vient du fait qu'il n'y ai pas de "break" à tes "case"
      1. Non je ne pense pas que les break empêchent le programme de tourner. C'est juste que ce n'est pas propre et plus lent si on ne les mets pas à mon avis.
    2. mon problème c'est que la boucle while n'exécute plus?
      1. Laisse tomber j'avais pas les yeux en face des trous.

        #include <stdio.h>
        
        void main()
        {
           
        int n;
        
        do
        {
            printf("donner un entier\n");
            scanf("%d",&n);
            switch (n)
            {
                case 1:
                printf ("janvier");
                break;
                case 2:
                printf ("fevrier");
                break;
                .
                .
                .
            }
        
        }
        
        while ((n>=1)&&(n<=12));
        
        }
    3. jeveux que le traitement n'execute plus sauf pour les valeurs entre 1 et 12?
      1. en fait il faut mettre ton switch dans ta boucle whilme sinon boucle infinie de printf scanf

        Ce code là fonctionne :

        #include <stdio.h>

        void main() {

        int n=1;

        while ( (n > 0) && (n < 13)){

        printf("Saisissez un nombre : ");

        scanf("%d",&n);

        switch(n){

        case 1 :printf("janvier\n");break;

        case 2 : printf("fevrier\n");break;

        ///le reste

        default:printf("bye bye\n");break;

        }
        }

        et voilà le tour est joué.

        1. hé hé les grands esprits se rencontrent on a été assez synchro sur ce coup
      2. Bonjour Amin,

        normal, ta condition de rupture de boucle n'est pas bonne. En fait la tu lui dis, demande lui un entier tant qu'il entre un entier compris entre 1 et 12. Tu dois justement poser la condition contraire.

        de plus ton switch est incomplet, mais j'imagine que tu le sais. Par contre tu as oublie les break; ce qui signifie que quoi qu'il arrivem les instructions suivant ton "saut" seront toutes executees.

        bref, voici ton code corrige ( je me suis permis certaines libertes ) :

        #include <stdio.h>
        #include <iostream>
        using namespace std;

        int main(void)
        { int n;
        do
        { printf("donner un entier : ");
        scanf("%d",&n);
        } while(!(n>=1)&&!(n<=12));
        printf("Vous avez choisi comme moi : ");

        switch(n){
        case 1:printf ("janvier \n"); break;
        case 2:printf ("fevrier \n"); break;
        case 3:printf ("mars \n"); break;
        case 4:printf ("avril \n"); break;
        case 5:printf ("mai \n"); break;
        case 6:printf ("juin \n"); break;
        case 7:printf ("juillet \n"); break;
        case 8:printf ("aout \n"); break;
        case 9:printf ("septembre \n"); break;
        case 10:printf ("octobre \n"); break;
        case 11:printf ("novembre \n"); break;
        case 12:printf ("decembre \n"); break;

        }
        system("PAUSE");
        }
        1. Je crois qu'il veut que ça continue tant que l'utilisateur entre un mois correct. C'est pas ça Amin?
      3. Ah bah dans ce cas la c'est effectivement la bonne condition de rupture de boucle et il suffit de mettre le switch dans la boucle :

        #include <stdio.h>
        #include <iostream>
        using namespace std;

        int main(void) {
        int n;
        do
        {
        printf("donner un entier (-1 pour arreter): ");
        scanf("%d",&n);
        printf("Vous avez choisi comme moi : ");
        switch(n){
        case 1:printf ("janvier \n"); break;
        case 2:printf ("fevrier \n"); break;
        case 3:printf ("mars \n"); break;
        case 4:printf ("avril \n"); break;
        case 5:printf ("mai \n"); break;
        case 6:printf ("juin \n"); break;
        case 7:printf ("juillet \n"); break;
        case 8:printf ("aout \n"); break;
        case 9:printf ("septembre \n"); break;
        case 10:printf ("octobre \n"); break;
        case 11:printf ("novembre \n"); break;
        case 12:printf ("decembre \n"); break;
        system("PAUSE");}
        }while((n>=1)&&(n<=12));
        }
        1. voici le code ,mais toujours demende de saisir un entier:
          #include <stdio.h>
          void main()

          { int n ;
          do
          { printf("donner un entier");
          scanf("%d",&n);

          switch (n)
          { case 1:printf ("janvier");
          break;
          case 2:printf ("fevrier");
          break;
          case 3:printf("mars");
          break;
          case 4: printf("avril");
          break;
          case 5: printf("mai");
          break;
          case 6 :printf("juin");
          break;
          case 7 : printf("juillet");
          break;
          case 8: printf("aout");
          break;
          case 9: printf("septembre");
          break;
          case 10: printf("octobre");
          break;
          case 11 :printf("novembre");
          break;
          case 12 :printf("decembre");}

          }
          while ((n>=1)&&(n<=12));

          }
          1. et alors c'est bon maintenant ? si oui passe en résolu
        2. Contributeur
          Salut,
          Je donne une autre façon de faire :
          A noter, que main() doit renvoyer un int (donc pas void).
          #include <stdio.h>
          
          int main(void){
              char *mois[]={"janvier","fevrier","mars","avril","mai","juin","juillet","aout","septembre","octobre","novembre","decembre"};
              int n;
          
              do{
                  printf("donnez un entier : ");fflush(stdout);
                  scanf("%d",&n);
                  if(n>0 && n<11) puts(mois[n-1]);
              }while(n>0 && n<11);
          
              return 0;
          }
          

          Cdlt