IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Reinitialiser variable après un tour de boucle


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut Reinitialiser variable après un tour de boucle
    Bonjour a tous.

    Je suis nouveau dans la programmation. Je commence a étudier de C (vaste programme), c'est pas le plus simple vous me direz mais étant déjà un peu geek (tweak php pour developpement sous wordpress, connaissance avancée du fonctionnement d'un ordinateur) je me suis dit que je pouvais le faire.

    Je suis un tutorial pour apprendre les bases et je me suis exercé à créer une calculatrice en mode console permettant de faire les 4 opérations de base (+,-,*,/)

    Tout fonctionne comme je l'avais prévu sauf une variable qui conditionne la fin du programme à la fin de boucle. Je m'explique

    Fonctionnement du progz:

    Le programme s'ouvre sur un menu lui donnant le choix entre les opérations à effectuer codé grace à un "switch". Ce menu à 4 choix est lui-même régie par la boucle "do...while" (ya plus simple me direz vous mais avec un "while" simple, ça merde ) Bref. Si l'user entre un nombre supérieur à 4 la boucle lui ramène au départ pour choisir un nombre valide (de 1 à 4). Le "default" du switch incrémente la variable "erreur" (++) qui se retrouve à l'intérieur du "while"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ....
    default;
    printf("Veuillez faire un choix entre les 4 operations possibles");
    erreur++;
    break;
    }
    }while(erreur++ || repeat>1);
    Une fois qu'il a choisi son opération, le programme lui demande le nombre 1 et le nombre 2 puis process l'opération.
    A la fin de cette opération le programme demande si il veut recommencer une autre opération. (boucle). L'user tape "1" pour oui ou "0" pour non.
    A la fin du premier calcul si l'user tape 0 le programme s'arrete.
    A la fin du premier calcul si l'user tape 1 la boucle le ramène au point de départ sur le menu de choix des opérations

    Le problème
    La variable "repeat" (invoquée au début de main par repeat=0) ne reconnait pas le 0 si l'utilisateur à déjà répété l'opération.
    A la fin du deuxièmme calcul si l'user tape 1 la boucle le ramène au point de départ et si l'user tape 0, la boucle le ramène quand même au point de départ.

    Il semblerait donc que la variable repeat garde en mémoire la valeur qui lui à été attribuée à la fin du premier tour de boucle. L'utilisateur aura beau entrer "0" apres les calculs suivant, le programme le ramène toujours au point de départ sans jamais s'arreter.

    Pouriez vous m'aider à faire en sorte que la variable "repeat" est une valeur de 0 à chaque tours de boucle et faire en sorte que l'user puisse sortir du programme en tapant 0 même apres plusieurs tours dans la boucle ?

    Je vous laisse la source afin que vous puissiez avoir une vue d'ensemble

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main(int argc, char *argv[])
    {
        int operation = 0, resultat = 0, nombre1 = 0, nombre2 = 0; /*definition des variable utilisée dans le programme */
        int erreur=0;
        int repeat=0; /* la fameuse variable que j'aimerais reset*/
     
     
    do
    {
     
    printf("==== Menu des operations ====\n\n");
    printf("1. addition\n");
    printf("2. soustration\n");
    printf("3. Division\n");
    printf("4. multiplication\n\n");
     
    printf("Votre choix ?\n");
    scanf("%d", &operation);
     
     
     
    switch (operation)
    {
        case 1:// addition
     
        printf("\nvous avez demande une addition\n");
        printf("nombre1 : \n");
        scanf("%d", &nombre1);
        printf("nombre2: \n");
        scanf("%d", &nombre2);
        resultat = nombre1 + nombre2;
        printf("%d + %d = %d\n" , nombre1, nombre2, resultat);
        printf("Voulez vous faire un autre calcul ?\n appuyez sur 1 pour oui et 0 pour non \n");
        scanf("%d", &repeat);
        break;
     
        case 2://soustration
     
        printf("\nvous avez demande une soustration\n");
        printf("nombre1 : \n");
        scanf("%d", &nombre1);
        printf("nombre2: \n");
        scanf("%d", &nombre2);
        resultat = nombre1 - nombre2;
        printf("%d - %d = %d\n" , nombre1, nombre2, resultat);
        printf("Voulez vous faire un autre calcul ?\n appuyez sur 1 pour oui et 0 pour non \n");
        scanf("%d", &repeat);
        break;
     
        case 3: //division
     
        printf("\nvous avez demande une division\n");
        printf("nombre1 : \n");
        scanf("%d", &nombre1);
        printf("nombre2: \n");
        scanf("%d", &nombre2);
        resultat = nombre1 / nombre2;
        printf("%d / %d = %d\n" , nombre1, nombre2, resultat);
        printf("Voulez vous faire un autre calcul ?\n appuyez sur 1 pour oui et 0 pour non \n");
        scanf("%d", &repeat);
        break;
     
        case 4: //multiplication
        printf("\nvous avez demande une multiplication\n");
        printf("nombre1 : \n");
        scanf("%d", &nombre1);
        printf("nombre2: \n");
        scanf("%d", &nombre2);
        resultat = nombre1 * nombre2;
        printf("%d * %d = %d\n" , nombre1, nombre2, resultat);
        printf("Voulez vous faire un autre calcul ?\n appuyez sur 1 pour oui et 0 pour non \n");
        scanf("%d", &repeat);
        break;
     
        default:
        printf("Veuillez faire un choix parmis les 4 opération basiques\n");
        erreur++;
        break;
    }
     
    }while(erreur++ || repeat>1);
     
     
     
    return 0;
    }
    Merci d'avance pour votre aide. Cela me permettra d'avancer dans ma compréhension de ce langage.

    Crdlt.

    unsteady

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Comme on demande à l'utilisateur de taper 0 ou 1 pour la variable repeat, celle-ci ne sera jamais supérieure à 1 si l'utilisateur suit les instructions. Le test devrait être simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do
    ...
    while(erreur++ || repeat != 0);
    Maintenant, le plus simple est de compléter le menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    do
    {
       printf("==== Menu des operations ====\n\n");
       printf("0. sortir\n");
       printf("1. addition\n");
    //....
      switch (operation)
      {
         case 0 : break;
         case 1:// addition
                printf("\nvous avez demande une addition\n");
                printf("nombre1 : \n");
                scanf("%d", &nombre1);
                printf("nombre2: \n");
                scanf("%d", &nombre2);
                resultat = nombre1 + nombre2;
                printf("%d + %d = %d\n" , nombre1, nombre2, resultat);
                break;
         //....
      }
    }while(erreur++ || operation !=0);
    Il est économique de faire une fonction pour lire les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void lireDonnees(int *nombre1, int *nombre2)
    {
      printf("nombre1 : \n");
      scanf("%d", nombre1);
      printf("nombre2: \n");
      scanf("%d", nombre2);
    }
    ...
      switch (operation)
      {
         case 0 : break;
         case 1:// addition
                printf("\nvous avez demande une addition\n");            
                lireDonnees(&nombre1, &nombre2);
                resultat = nombre1 + nombre2;
                printf("%d + %d = %d\n" , nombre1, nombre2, resultat);
                break;
        case 2://soustration 
                printf("\nvous avez demande une soustration\n");
                lireDonnees(&nombre1, &nombre2);
         //....
      }

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut
    salut diogene.

    Merci pour cette petite correction de logique. Je vois bien que l'ajout de la fonction void (que je ne connaissait pas d'ailleur) simplifie grandement la tâche et est "économique" comme tu dis.

    La fonction de sortie du programme dans la liste est une très bonne idée (prq n'y ai-je pas pensé ! )

    En tous cas merci pour cette correction/evolution. Ma calculette fait exactement ce que je veux et en plus je viens d'apprendre de nouveaux trucs.

    MERCI!

    A bientôt

Discussions similaires

  1. toujours les variables apres une boucle
    Par lrgtk dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 05/09/2010, 15h22
  2. Gérer mes variables après une boucle
    Par Snipy dans le forum Langage
    Réponses: 10
    Dernier message: 06/05/2008, 12h09
  3. Variable après un ComboBox dans une boucle FOR
    Par Dream Master dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/05/2007, 09h26
  4. Réponses: 2
    Dernier message: 23/10/2005, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo