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 :

verifier 2 conditions avec le Do..while


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut verifier 2 conditions avec le Do..while
    Bonjour
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do{
        printf("Entrer Quantités Produits \n");
        scanf("%d",&q_produits);
        printf("Entrer Prix Unitaire du Produit \n");
        scanf("%d",&prix_uni);
     }
    while((q_produits<=0) || (&prix_uni<=0));
    je voudrais que la boucle se repète tant qu' au moins un des 2 est negatif

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Salut,

    penses à présenter ton message correctement (balise CODE).
    Pour ce qui est de ton problème, je pense que tu mélange variable et adresse de variable.

    &prix_uni est l’adresse de la variable prix_uni et non sa valeur (je suppose que prix_uni est un entier ou un flottant).

    Du coup il suffit d’enlever le & sur ta seconde condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
    {
            printf("Entrer Quantités Produits \n");
            scanf("%d", &q_produits);
            printf("Entrer Prix Unitaire du Produit \n");
            scanf("%d", &prix_uni);
    } while (q_produits <= 0 || prix_uni <= 0);
    NeoKript

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour la remarque sur la balise CODE
    pour ce qui est du & c'etait une erreur de frappe
    merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Dans ce cas, ça a l'air correct. Quels résultats obtiens-tu ?

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Je metterais plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //...
    while (q_produits < 0 || prix_uni < 0);
    Je ne pense pas que zero soit négatif

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    resultat souhaité obtenu
    on sort de la boucle lorsque les 2 nombres sont positifs .
    Maintenant je rame sur ce code
    je voudrais creer une boucle qui est
    tant que l'utilisateur entre une lettre differente de 'n ' ou 'N' on reste dans la boucle en lui posant tjrs la meme question
    Continuer ?(O / N)
    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
     
    #include<stdio.h>
    #include<conio.h>
    int prix_uni,q_produits;
    long t_achats;
    char rep;
    main(void){
    t_achats=0;
    rep='n';
     while(rep!='N' || rep!='n'){
    do{
    printf("Entrer Quantités Produits \n"); 
    scanf("%d",&q_produits); 
    printf("Entrer Prix Unitaire du Produit \n"); 
    scanf("%d",&prix_uni); 
    } 
    while ((q_produits <= 0) || (prix_uni <= 0));
    t_achats=t_achats + q_produits*prix_uni;
    printf("Total=%d% \n",t_achats);
    printf("Continuer ?(n ou N pour arreter) \n");                                    
    scanf("%c",&rep);                                   
    }
    Lorsque j'entre dans la boucle la première fois et que j'arrive sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Continuer ?(n ou N pour arreter) \n");
    je n'ai pas la possibilité d'entrer un caractere et la boucle reprend aussitot

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Je metterais plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //...
    while (q_produits < 0 || prix_uni < 0);
    Je ne pense pas que zero soit négatif
    je ne veux pas qu'il entre de prix nulle ou de quantité nulle
    donc le code sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((q_produits <= 0) || (prix_uni <= 0));
    pas de probleme à ce niveau

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Citation Envoyé par icode15 Voir le message
    resultat souhaité obtenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    t_achats=t_achats + q_produits*prix_uni;
    printf("Total=%d% \n",t_achats);
    printf("Continuer ?(n ou N pour arreter) \n");                                    
    scanf("%c",rep);                                   
    }
     while(rep!='N' && rep!='n');
    La derniere accolade (juste avant le while) n'a jamais été ouverte.
    J'aurais fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    do
    {
    printf("Continuer ?(n ou N pour arreter) \n");                                    
    scanf("%c",rep);                                   
    }
     while((rep!='O') && (rep!='o')&&(rep!='N') && (rep!='n'));
    if((rep=='O') || (rep=='o'))
    {
    //reste du programme
    }
    return 0;

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est une conséquence du scanf précédent :
    celui-ci laisse dans le tampon clavier au minimum le caractère '\n' qui donc est lu dans la foulée par le scanf("%c",...) sans qu'il soit besoin d'entrer des caractères supplémentaires au clavier.

    Solution : vider le buffer clavier après la lecture de prix_uni.
    - ne pas utiliser fflush() qui est défini pour des flux de sortie
    - voir la FAQ qui propose une fonction pour le faire
    - ou modifier le scanf() pour qu'il le fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d%*[^\n]%*c",&prix_uni);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Il y a plus simple mais moins rigoureux: mettre un getchar() après le scanf pour qu'il récupère le \n.

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    voici ce que j'ai obtenu en bidouillant le code
    je reconnais que j'ai du mal à expliquer les lignes 23 et 24
    mais ça marche
    si quelqu'un pourait expliquer ?
    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
     
    #include<stdio.h>
    #include<conio.h>
    int prix_uni,mo,q_produits,somme,monnaie;
    long t_achats;
    char rep;
    main(void){
    t_achats=0;
    do{
     do{
    printf("ENTRER QUANTITES PRODUITS \n"); 
    scanf("%d",&q_produits); 
    }
    while (q_produits <= 0 );
    do{
    printf("ENTRER PRIX UNITAIRE [un prix logique en CFA]  \n"); 
    scanf("%d",&prix_uni); 
    }
    while ((prix_uni <= 0) ||prix_uni%5!=0 );
    t_achats=t_achats + q_produits*prix_uni;
    printf("TOTAL ACHATS=%d% \n",t_achats);
    printf("CONTINUER ?['n' ou 'N' POUR ARRETER] \n"); 
    scanf("%c",&rep); 
    scanf("%c",&rep);
    }
    while(rep!='N'&& rep!='n');
    très complexe ce scanf!!

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    C'est parce que le scanf juste avant (qui permet d'entrer le prix unitaire) récupère le nombre et le '\n' du caractère "entrée". Donc quand tu rappelle un scanf le \n est toujours dans le buffer. Le 1er scanf récupère ce '\n' et le 2e la valeur. Ca fait toujours ce genre de problèmes quand tu mets un scanf dans une boucle.

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par dré kam Voir le message
    C'est parce que le scanf juste avant (qui permet d'entrer le prix unitaire) récupère le nombre et le '\n' du caractère entré. Donc quand tu rappelle un scanf le \n est toujours dans le buffer. Le 1er scanf récupère ce '\n' et le 2e la valeur. Ca fait toujours ce genre de problèmes quand tu mets un scanf dans une boucle.
    Merci

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par icode15 Voir le message
    très complexe ce scanf!!
    Petit rappel: scanf() est fait pour récupérer des datas issues d'un flux formaté. Et ce que tape l'utilisateur est tout sauf formaté. Que pasa si l'utilisateur tape "toto" là où tu lui demandes un long ???

    Solution plus robuste
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include<stdio.h>
    int main(void){
        int q_produits
        char saisie[80];
        while(1) {
            printf("ENTRER QUANTITES PRODUITS \n"); 
            fgets(saisie, 80, stdin);
            if (sscanf(saisie, "%d", &q_produits) == 1 && q_produits > 0) break;
            printf("Erreur de saisie - Recommencez\n");
        }
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Vérification de condition avec affichage message
    Par spirou dans le forum Langage
    Réponses: 6
    Dernier message: 05/01/2006, 21h27
  2. Une petite doute avec le cycle while
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 06/11/2005, 10h15
  3. condition avec request
    Par nicerico dans le forum ASP
    Réponses: 3
    Dernier message: 28/06/2005, 15h19
  4. Conditions avec liste de tuples
    Par Robert999 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/07/2004, 11h01
  5. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 09h04

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