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

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    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.
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  2. #2
    Expert confirmé
    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
    Points : 4 845
    Points
    4 845
    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 éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    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
    Expert confirmé
    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
    Points : 4 845
    Points
    4 845
    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
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    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 éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    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
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    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
    Suffit de virer la ligne readln(op); (la deuxième). Pas besoin de commenter 100 ans, une erreur d'inattention est vite arrivée
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Suffit de virer la ligne readln(op); (la deuxième). Pas besoin de commenter 100 ans, une erreur d'inattention est vite arrivée
    Je n'ai pas testé en effet
    C'était pour l'idée générale. Mea culpa.

    L'erreur a été corrigée dans le code.
    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]

  9. #9
    Expert confirmé
    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
    Points : 4 845
    Points
    4 845
    Par défaut
    Je pensais en effet à la même façon de faire qu'Alcatiz (bon, y'en a pas des millions non plus, c'est vrai) mais je voulais pas "spoiler".

    Par contre je n'ai retrouvé nulle par la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case ... of
    ...
    else
    Pourtant c'est ce dont je me rappelais aussi. A la place j'ai trouvé otherwise sur google. C'est bien else donc, en Pascal ?

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Je remercie tout le monde pour les réponses. Je tiens à dire que celle qui m'a été la plus utile est celle d'Alcatîz car m'apprend une belle astuce.
    Cependant, il y a quelque chose que je ne comprends pas : est-ce qu'il y a une grande différence entre char et string ? Je croyais que c'était comme integer et longint, à part bien sûr qu'il y a certaines commandes réservées aux chaînes.
    Maintenant concernant le code, il est bien joli comme mais attention wormful_sickfoot :
    Suffit de virer la ligne readln(op); (la deuxième)
    tu peux virer la 1ere au lieu de la 2ieme, une boucle repeat s'exécute au moins une fois.
    Merci encore, vous êtes très sympas.
    Appreciate.
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    @Loceka : oui c'est bien else qu'il faut utiliser.

    @Katrena : Non tu ne peux pas virer la première ligne, car que vaudra op lorsque tu entreras dans le case ? Il ne vaudra rien, donc ca passera directement dans le case et tu obtiendras le message "ce n'est pas un opérateur!, ré-entrez un opérateur svp " alors que tu n'as encore rien tapé
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  12. #12
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Cependant, il y a quelque chose que je ne comprends pas : est-ce qu'il y a une grande différence entre char et string ? Je croyais que c'était comme integer et longint, à part bien sûr qu'il y a certaines commandes réservées aux chaînes.
    ben char = un caractère
    string = une chaine de caractere

    la gestion de char est différente de celle de string, par exemple char prends en compte les retours chariots
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par katrena99
    Cependant, il y a quelque chose que je ne comprends pas : est-ce qu'il y a une grande différence entre char et string ? Je croyais que c'était comme integer et longint, à part bien sûr qu'il y a certaines commandes réservées aux chaînes.
    Il faut tout de même jeter un coup d'oeil aux docs basiques du langage que tu veux utiliser, et ne pas programmer au hasard en priant que ça se passe bien.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

+ 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