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

Langage Pascal Discussion :

Répétition d'un programme depuis ce même programme


Sujet :

Langage Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Répétition d'un programme depuis ce même programme
    Bonjour

    Je débute dans le domaine du Pascal, et après avoir achevé un tutoriel, voilà que l'envie m'a pris d’élaborer un simple petit programme de choix.
    Il s'agit d'indiquer un chiffre entre 1 et 4, moyennant quoi une réponse prédéfinie apparaît. Jusque là, pas de problème. J'ai utilisé une structure de CASE OF.

    Mais, la dernière partie me pose un problème, la partie en ELSE. En effet, j'aimerais non seulement afficher un message d'erreur, mais surtout pouvoir provoquer un retour au début du programme pour pouvoir rééditer la variable.
    Or, si le message ne pose pas de problème, mes diverses tentatives de boucles échouent toutes. J'ignore où est mon erreur, mais je soupçonne mon ELSE de refuser de conditionner l'utilisation du programme dans lequel il est lui même inclus. Malgré mes recherches sur toutes les ressources que j'ai pu trouver (google est mon ami), je n'arrive pas à trouver de fonction qui permettrait de contourner ce problème en provoquant un retour au début du programme (en dehors du GOTO, qui semble plus que vivement critiqué).

    En désespoir de cause (hum, 2H du matin, c'est le cas de le dire), j'aimerais avoir vos conseils. Ci dessous, la base de programme sur laquelle se sont basés tous mes essais de boucle, avec en rouge la partie concernée :

    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
    program Hangar(output);
     
     
    var choix_avion : integer;
     
    begin
     
    writeln('=== Hangar ===');
     
    writeln;
    writeln;
     
    writeln('1. Spad XIII');
     
    writeln;
     
    writeln('2. Nieuport 28');
     
    writeln;
     
    writeln('3. Albatros D.V');
     
    writeln;
    writeln('4. Fokker D.VII');
     
    writeln;
    writeln;
     
    readln;
     
     
    readln (choix_avion);
     
    case choix_avion of
         1 : writeln('Votre appareil sera un Spad XIII.')  ;
         2 : writeln('Votre appareil sera un Nieuport 28.') ;
         3 : writeln('Votre appareil sera un Albatros D.V.');
         4 : writeln('Votre appareil sera un Fokker D.VII.');
         else writeln('Votre formulaire est incompr‚hensible, merci d''en remplir un nouveau.');
     
    End;
    readln;
    end.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Bonjour,

    1) le code doit être entre balises CODE et non QUOTE

    2) le GOTO fonctionne bien qu'il soit peu apprécié du fait de l'effet spaghetti qu'il donne aux programmes.

    3) les boucles à conditions sont "WHILE Cond DO Code;" (Tant que) et "REPEAT Code UNTIL Cond;" (Jusqu'à ce que)

    la différence entre les deux étant que la condition n'est testée qu'après la première execution du Code dans un REPEAT

    ce qui donne, par exemple:

    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
     
    var
      Done: Boolean;
    begin
      ...
      repeat
        ReadLn(choix_avion);
        Done := True;
        case choix_avion of
          1 : writeln('Votre appareil sera un Spad XIII.') ;
          2 : writeln('Votre appareil sera un Nieuport 28.') ;
          3 : writeln('Votre appareil sera un Albatros D.V.');
          4 : writeln('Votre appareil sera un Fokker D.VII.');
          else
           writeln('Votre formulaire est incompr‚hensible, merci d''en remplir un nouveau.');
           Done := False;
        end;
      until Done;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !
    Et désolé pour l'erreur de code.

    Il fallait donc placer la boucle conditionnelle à l'extérieur du code, et non tenter de l'implanter sur la question même qui l'exigeait... Joli travail en matière de prise de recul que la programmation .

    Merci encore d'avoir pris le temps de m'expliquer

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je pense, sans l'avoir testé que ceci fonctionne également

    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
     
    label
      encore;
    begin
      ...
      encore:
      ReadLn(choix_avion);
      case choix_avion of
        1 : writeln('Votre appareil sera un Spad XIII.') ;
        2 : writeln('Votre appareil sera un Nieuport 28.') ;
        3 : writeln('Votre appareil sera un Albatros D.V.');
        4 : writeln('Votre appareil sera un Fokker D.VII.');
        else
         writeln('Votre formulaire est incompr‚hensible, merci d''en remplir un nouveau.');
         goto encore;
      end;
    end;
    dans ce cas ce n'est pas très compliqué, mais imagine un label différent sur chaque cas du case et là ça devient spaghetti, il devient difficile de suivre la logique du programme.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Joa,

    Pour parodier une célèbre expression :

    Quand je vois un GoTo, je sors mon révolver.
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2014, 14h39
  2. Réponses: 5
    Dernier message: 28/04/2008, 12h46
  3. Réponses: 8
    Dernier message: 11/03/2006, 18h40
  4. Réponses: 5
    Dernier message: 11/03/2006, 16h18
  5. sql server: execution d'un programme depuis un trigger
    Par constantin dans le forum Développement
    Réponses: 3
    Dernier message: 04/10/2005, 19h20

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