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 :

Problème de boucle Do While


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Problème de boucle Do While
    Bonjour à tous,

    Etant nouveau sur ce forum et débutant en langage C, je fais appel à votre expérience pour m'aider.
    Je cherche (dans le cadre de mes études) à créer un programme qui traite des informations sur des CDs.
    La procédure qui me pose problème est celle qui permettrait d'afficher les caractéristiques d'un CD que nous avons dans la liste.
    Il se trouve que lorsque je lance le programme, il affiche sans fin les caractéristiques du cd qu'il trouve, comme
    si il ne sortait plus de la boucle alors que la condition est validé.
    Voici la partie de mon programme qui pose problème (je m'excuse par avance pour la qualité de mon code).

    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
    void afficherCD (char titre[40], t_cd liste [], int *nb_cd) {
    int i=0; //indice correspondant au i-eme cd de ma liste
    int OK=1; // condition de fin de boucle
    int R; // résultat de ma fonction strcmp : 0=même titre ; 1=titre différent
     
    do
      {
        R=strcmp(titre, liste[i].titre);
       if (R == 0){
        OK=1;
        printf(" %s\n %s\n %d\n %s\n %s\n\n",liste[i].titre, liste[i].artiste, liste[i].annee, liste[i].genre, liste[i].fichier_pochette);//Ensemble des caracteristiques du cd
          }
       else
        i=i+1;
        OK=0;
      }
     
    while ((i<=*nb_cd)||(OK=!1));
     
    if (OK==0){
      printf("CD NON TROUVE\n\n");
      }
     
    }
    Je pense que ce sont mes conditions qui ne sont pas bonnes... pourtant le while est bien l'inverse logique du "jusqu'à" algorithmique non ?

    Merci par avance.

    Bonne soirée!

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    Il faut faire attention OK=!1 , c'est une affectation et non une comparaison.
    Sinon c'est fortement déconseillé dans la plupart des langage de prog d'utiliser les majuscules pour les variables.
    (Il existe les balises code sur le forum )

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il y a tellement d'incohérences dans ce morceau de code qu'on ne va pas toutes les relever, mais j'ajoute aux remarques de Kannagi :

    • Comment la fonction est-elle appelée ?
    • Que vaut *nb_cd ?
    • Pourquoi nb_cd est-il un pointeur ?
    • Pourquoi un do ... while (plutôt qu'un for ou un while) ?


    Il manque probablement des accollades à la suite du else : OK est mis à zéro quoiqu'il arrive. Alternativement tu pourrais return dès que tu as trouvé l'élément recherché, et donc supprimer ce else qui deviendrait implicite.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Oui merci pour la remarque je sais que mon code est de mauvaise qualité (je débute).

    Je ne comprend pas : l'opérateur "=!" vérifie bien qu'une variable (ici mon "OK") est différente d'une valeur (ici 1) non ?

    Je travaille sur le fait de remplacer cette boucle do ... while par une boucle for.

    Merci en tout cas pour vos quelques conseils, j'avance, doucement certes ... mais surement!

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Nous savons que tu débutes et je ne t'en fais nullement le reproche. Je t'expose simplement les choses comme elles sont, à savoir que le code est truffé d'erreurs que nous allons t'aider à appréhender dans l'ordre.

    L'opérateur de test d'inégalité est !=. Or tu as écrit =!. Ton code reste toutefois valide car OK=!1 a bien une signification en C, mais pas celle que tu attends : tu demandes au compilateur d'affecter !1 (non « vrai », soit « faux » : 0) à la variable OK, puis de tester la valeur de l'expression d'affectation, qui se trouve être celle affectée soit : 0 de type int.

    OK=!1 renvoie donc toujours « faux ».


    Afin d'activer la coloration syntaxique et la conservation de l'indentation, peux-tu comme te l'as demandé Kannagi éditer ton message initial et placer le listing de ton programme entre balises [code] ? Il y a un bouton pour cela (si tu as Javascript activé pour les domaines DVP) sur la page de rédaction du message.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    En effet, je n'avais pas remarqué la différence entre "!=" et "!=" ! Merci
    Et désolé pour la notification [CODE]

    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
     
    void afficherCD (char titre[40], t_cd liste [], int *nb_cd) {
    int i=0; //indice correspondant au i-eme cd de ma liste
    int OK=0; // condition de fin de boucle
    int R; // résultat de ma fonction strcmp : 0=même titre ; 1=titre différent
     
    do{R=strcmp(titre, liste[i].titre);
        if (R == 0){
        OK=1;
        printf("%d\n",OK);
        }
        else{
        i=i+1;
        OK=0;}
        }
     
    while ((i<=*nb_cd)||(OK!=1));
     
     
    if(OK==1){
    printf(" CD TROUVE : %s\n",liste[i].titre);
    }
    else
      if (OK==0){
      printf("CD NON TROUVE\n");
      }
    }
    Bon j'ai essayé de simplifier tout ca mais j'ai vraiment du mal à comprendre comment fonctionne cette boucle "Do.. While"
    Dans ce cas là, je n'obtiens que des 1 non-stop si je rentre le meme titre et mon programme plante si je rentre un titre différent.
    Et si je supprime la ligne 10 (printf("%d\n",OK) alors il ne maffiche plus rien dans les 2 cas comme si la boucle n'était pas éxécuté!

    Merci pour votre aide

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bon petite évolution j'ai réussi à obtenir quelque chose à l'affichage en reprenant le code à 0

    voici le nouveau code:
    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
     
    void afficherCD (char titre[40], t_cd liste [], int *nb_cd) {
    int i=0;
    int ok=0; // ok=0=FAUX et ok=1=VRAI
     
    do
    {
        if(titre == liste[i].titre){
            ok=1;
            printf(" %s %s %d %s %s\n",liste[i].titre, liste[i].artiste, liste[i].annee, liste[i].genre, liste[i].fichier_pochette);;}
        else{
            i=i+1;
        }
    }
    while ((i<=*nb_cd)||(ok!=1));
     
    if (ok==0){
        printf("CD NON TROUVE\n");
      }
    }
    Le problème maintenant est qu'il ne m'affiche que le bon titre, par contre pour le reste YOLO... il me donne des données appartenant aux autres cd.

    Merci en tout cas !

    J'avance doucement mais surement

  8. #8
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 657
    Points : 1 684
    Points
    1 684
    Par défaut
    Hello,

    Pour comparer des char * (des chaînes de caractères), il faut utiliser (entres autres), strcmp() ! Ce que tu ne fais pas à la ligne 8 de ton dernier code.

Discussions similaires

  1. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  2. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  3. Problème de boucle do..while
    Par chental dans le forum C
    Réponses: 12
    Dernier message: 02/08/2006, 19h26
  4. Problème Boucle Do-While?!
    Par Julien_C++ dans le forum C++
    Réponses: 6
    Dernier message: 29/07/2006, 12h23
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

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