Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Boucle "while do" de procédures

    Bonjour,

    J'ai un "petit" problème avec une boucle de procédures que je dois réaliser.

    Voici ma séquence principale :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    begin
      Initialiser;
      InitialiserDonnees;
      nomEtudiant1;
        while not (nomEtudiant = '****') do begin
          encoderEtudiant;
          CalculerResultats;
          AfficherResultats;
        end;
      CalculerResultatsClasse;
      AfficherResultatsClasse;
      Terminer
    end.
    Mon problème est que normalement, lorsque dans la procédure "nomEtudiant1" on donne comme nom "****" le programme doit passer à "CalculerResultatsClasse" mais le résultat est toujours le même => le programme ne s'arrête pas

    Merci à ceux qui pourront m'aider à comprendre mon erreur

  2. #2
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 301
    Points : 3 301
    Points
    3 301

    Par défaut

    Je supprime ma réponse qui ne répondait pas au problème. La solution correcte se trouve dans le message de Paul TOTH.
    L'Art est long et le Temps est court.

  3. #3
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 516
    Points : 14 564
    Points
    14 564

    Par défaut

    je suppose que nomEtudiant1 demande le nom de l'étudiant...comme c'est fait en dehors de la boucle, le nom ne change jamais.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    begin
      Initialiser;
      InitialiserDonnees;
      nomEtudiant1;
        while not (nomEtudiant = '****') do begin
          encoderEtudiant;
          CalculerResultats;
          AfficherResultats;
     
          nomEtudiant1; // étudiant suivant !
     
        end;
      CalculerResultatsClasse;
      AfficherResultatsClasse;
      Terminer
    end.
    accessoirement, on pourra faire de nomEtudiant1 une fonction booléenne qui renvoie True si un nom est donné, et False dans les autres cas, et tester directement sa valeur dans le WHILE.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  4. #4
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Un tout grand merci.

    j'ai rajouter la procédure "nomEtudiant1" a la fin de ma boucle et tout fonctionne a merveille

  5. #5
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 554
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 554
    Points : 4 068
    Points
    4 068

    Par défaut

    Hoa,

    On est dans un cas typique où la boucle à privilégier est repeat ... until :

    On passe au moins une fois dans la boucle pour lire le premier nom, et avec un while, ça t'oblige à déporter cette 1ère lecture hors de la boucle, d'où l'erreur courante consistant à oublier d'ajouter à nouveau la lecture dans la boucle.

    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  6. #6
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 516
    Points : 14 564
    Points
    14 564

    Par défaut

    Citation Envoyé par droggo Voir le message
    Hoa,

    On est dans un cas typique où la boucle à privilégier est repeat ... until :

    On passe au moins une fois dans la boucle pour lire le premier nom, et avec un while, ça t'oblige à déporter cette 1ère lecture hors de la boucle, d'où l'erreur courante consistant à oublier d'ajouter à nouveau la lecture dans la boucle.

    oui mais ça ne change pas le double appel...

    Code :
    1
    2
    3
    4
    5
    6
     
      premiernom;
      repeat
        traitement;
        nomsuivant;
       until nom='*****';
    pour l'éviter il faut passer par une fonction.

    Code :
    1
    2
    3
     
      while nouveaunom do
        traitement;
    EDIT: dans d'autres langages on écrirait l'équivalent de ceci qui n'est pas possible en Pascal
    Code :
    1
    2
    3
     
      while (nom := lirenom) <> '****' do
       traitement;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  7. #7
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 554
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 554
    Points : 4 068
    Points
    4 068

    Par défaut

    Hoe,

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    repeat
      nom := lire_nom;
      if nom <> '*****' then
      begin
         traiter
      end;
    until nom = '*****';
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •