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

Pascal Discussion :

Lecture d'un opérateur mathématique à l'aide d'un de case of


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut Lecture d'un opérateur mathématique à l'aide d'un de case of
    Bonjour,
    Le programme est tout à fait simple, il doit afficher un opérateur en toutes lettres, j'ai voulu faire en sorte que le programme ne se bloque pas si on entre un caractère autre qu'un des quatres opérateurs.
    Problème : j'ai une erreur de syntaxe mais, le vrai problème c'est que je suis convaincu de ne pas en avoir.
    voici le 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
    28
    29
    30
    program affiche_op ;
    uses wincrt;
    var op,opl:string;
    begin
    writeln('entrez un opérateur');
    read(op);
    case op of
    '+', '-', '*', '/' : case op of                  {1}
    	'+' : opl:='somme';
    	'-' : opl:='différence';
    	'*' : opl:='produit';
    	'/' : opl:='quotient';
    	end
    end
    else
    begin
    repeat
    writeln('ce n''est pas un opérateur!, ré-entrez un opérateur svp');
    read(op);
    until
    (op='+') OR (op='-') OR (op='*') OR (op='/');     {2}
    end;
    case op of
    	'+' opl:='somme';
    	'-' opl:='différence';
    	'*' opl:='produit';
    	'/' opl:='quotient';
    	end;
    writeln(opl);
    end.
    {1} la condition de la forme case .. of
    {2} même condition sous repeat
    Dites-moi où est l'erreur svp et aidez-moi à la corriger.
    Merci.

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par katrena99
    Problème : j'ai une erreur de syntaxe mais, le vrai problème c'est que je suis convaincu de ne pas en avoir.
    Et pourtant... ^^

    Le problème vient déjà d'un "else" en plein milieu du code (qui ne doit pas pouvoir compiler à mon avis).

    Ensuite il n'est pas du tout utile (au contraire même) d'imbriquer des case comme tu le fais.

    Bon, ça fait longtemps que je n'ai pas fait de Pascal mais, d'après google, cette structure pourrait t'être utile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case c of 
       'c' : writeln(c);
       otherwise writeln('le caractere ne vaut pas c');
    end;
    Le but n'étant pas de refaire ton programme, mais de t'aider à comprendre, je n'irai pas plus loin.

  3. #3
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    plusieurs erreurs... en particulier
    1- case ... of ne peut operer sur un string.
    utiliser un chiffre ou un char.
    2- op in ['+','-', ... plus efficace que (op='+) or (op='--) or ...
    3- effectuer le test sur op avant d'entrer dans case of et de tout melanger
    4- eviter d'ecrire 2X le même bout de code ( case ... of )
    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
     
    var  opl: string;
         op : char; // 1er modif
         ok : boolean;// 2eme modif
    begin
    write('entrez un opérateur  ');
       repeat
       readln(op);
       ok := op in ['+','-','*','/'];
       if not ok then
          begin
          write('ce n''est pas un opérateur!, ré-entrez un opérateur svp  ');
          readln(op);
          end;
       until ok;
    case op of                  {1}
       '+' : opl:='somme';
       '-' : opl:='différence';
       '*' : opl:='produit' 
       else opl:='quotient';  // ici plus besoin de faire le test op='/'
       end;
    writeln(opl);

  4. #4
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par j.p.mignot
    plusieurs erreurs... en particulier
    1- case ... of ne peut operer sur un string.
    Arf j'avais pas vu ça, comme il utilisait "read(op)" je croyais que c'était un char
    .

    Pour le reste, c'est plus de l'optimisation que de réelles erreurs. Donc à comprendre une fois que le code sera correct à mon avis. ^^

    Citation Envoyé par j.p.mignot
    3- effectuer le test sur op avant d'entrer dans case of et de tout melanger
    Pour ma part, je ne ferais pas de test du tout car ça empiète sur l'utilisation du case... autant limiter au maximum le nombre de répétition dans ce cas.

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 056
    Billets dans le blog
    2
    Par défaut
    Bonjour !
    Citation Envoyé par Loceka
    Pour ma part, je ne ferais pas de test du tout car ça empiète sur l'utilisation du case... autant limiter au maximum le nombre de répétition dans ce cas.
    +1 autant simplifier au maximum :
    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
    write('entrez un opérateur  ');
    ok := False;
    repeat
      readln(op);
      case op of
        '+' : begin opl:='somme'; ok := True; end;
        '-' : begin opl:='différence'; ok := True; end;
        '*' : begin opl:='produit'; ok := True; end;
        '/' : begin opl:='quotient'; ok := True; end;
      else
        write('ce n''est pas un opérateur!, ré-entrez un opérateur svp  ');
        readln(op);
      end;
    until ok;
    writeln(opl);
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Alcatîz
    Bonjour !

    +1 autant simplifier au maximum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    write('entrez un opérateur  ');
    ok := False;
    repeat
      readln(op);
      case op of
        '+' : begin opl:='somme'; ok := True; end;
        '-' : begin opl:='différence'; ok := True; end;
        '*' : begin opl:='produit'; ok := True; end;
        '/' : begin opl:='quotient'; ok := True; end;
      else
        write('ce n''est pas un opérateur!, ré-entrez un opérateur svp  ');
      end;
    until ok;
    writeln(opl);
    As-tu essayé ton code ?

    En gros :
    -Tu entres dans la boucle repeat
    - étape 1 - tu lis la valeur à traiter
    - tu traites la valeur:
    - ... Si ok, tu sors de la boucle, bien
    - ... Sinon, tu lis la valeur
    ..... et tu retournes au début de la boucle, à l'étape 1, où tu lis la valeur

    D'autre part, il faut penser à définir op comme char, et non comme string

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

Discussions similaires

  1. [XL-2007] Lecture d'un fichier texte d'aide utilisateur à partir d'un classeur Excel
    Par AlexTitou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/05/2014, 17h56
  2. [AC-2010] Liste déroulante d'opérateurs mathématiques dans formulaire
    Par Cynthia67 dans le forum IHM
    Réponses: 4
    Dernier message: 07/02/2014, 12h56
  3. [2008] Stocker des opérateurs mathématiques
    Par hawksidu dans le forum Développement
    Réponses: 2
    Dernier message: 26/08/2013, 14h26
  4. Group by et opérateur mathématique
    Par castorameur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/10/2009, 10h02
  5. Lecture d'AVI en boucle à l'aide de DSPack
    Par Dirk-Pitt dans le forum Delphi
    Réponses: 0
    Dernier message: 20/07/2007, 11h56

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