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

Turbo Pascal Discussion :

Évaluation d'une expression arithmétique


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Évaluation d'une expression arithmétique
    Bonjour,

    je veux réaliser un programme Pascal qui lit une expression arithmétique sous forme d'une chaîne de caractères ; après, il me donne le résultat dès que le caractère '=' est rencontré, sans prendre en considération la priorité des opérateurs. Voici un exemple :
    1+5*10-6=54
    et tout ça en réalisant le travail suivant :
    1. fonction vérifiernombre, qui vérifie qu'une chaîne de caractères représente bien un nombre et qui la traduit en un entier ;
    2. fonction vérifieropérateur, qui vérifie qu'une chaîne représente un opérateur ;
    3. fonction lireopérandeopérateur, qui saisit une chaîne puis la traduit en un nombre ou en un opérateur après vérification.

    Merci de me donner juste une indication.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Pour qu'une chaîne de caractères représente un nombre, il faut qu'elle ne soit composée que de chiffres, c'est-à-dire de caractères compris entre '0' et '9'. (Je suppose qu'on ne travaille qu'avec des nombres entiers.)

    Pour vérifier que la chaîne ne contient que des chiffres, il faut la parcourir et vérifier chaque caractère, par exemple de la façon suivante.

    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
    program Exemple;
     
    var
      s: string;
      i: integer;
     
    begin
      s := '123a';
     
      for i := 1 to Length(s) do
      begin
        if (s[i] >= '0') and (s[i] <= '9') then
          WriteLn(s[i], ' est un chiffre.')
        else
          WriteLn(s[i], ' n''est pas un chiffre.');
      end;
     
    end.
    La vérification des caractères peut également s'écrire de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if s[i] in ['0'..'9'] then
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    après tout, merci pour votre attention monsieur Roland.
    J'ai réalisé le programme, mais il fait juste les opérations entre les chiffres sans prendre en considération le 0 car personne n'est intéressé de faire 1+0 ou 1/0, c'est ridicule non ?
    Donc je veux généraliser mon programme pour qu'il soit capable de faire les opérations même entre les nombres.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    program testingisgood;
    function verif_nombre(x:char):boolean;
    var
      vrie:boolean;
      begin
        case x of
        '1': vrie:=true;
        '2': vrie:=true;
        '3': vrie:=true;
        '4': vrie:=true;
        '5': vrie:=true;
        '6': vrie:=true;
        '7': vrie:=true;
        '8': vrie:=true;
        '9': vrie:=true;
        else vrie:=false;
          end;
          verif_nombre:=vrie;
     
        end;
    function con_nombre(x:char):integer;
    var nombre:integer;
      begin
        case x of
        '1':nombre:=1;
        '2':nombre:=2;
        '3':nombre:=3;
        '4':nombre:=4;
        '5':nombre:=5;
        '6':nombre:=6;
        '7':nombre:=7;
        '8':nombre:=8;
        '9':nombre:=9;
        end;
        con_nombre:=nombre;
      end;
    function verif_operateur(x:char):boolean;
    var vrie:boolean;
      begin
        case x of
        '+': vrie:=true;
        '-': vrie:=true;
        '*': vrie:=true;
        '/': vrie:=true;
        '=':vrie:=true;
        else vrie:=false;
           end;
          verif_operateur:=vrie;
     
        end;
    function verif_nombreoperateur(z:string;n:integer):boolean;
    var vrie:boolean;i:integer;
    begin
      vrie:=true;
      if(verif_operateur(z[1])=true) then
        vrie:=false
        else
        if(verif_operateur(z[n])<>true) then
          vrie:=false
          else
          for i:=1 to n-1 do
          begin
            if((verif_operateur(z[i])=true) and (verif_operateur(z[i+1])=true)) then
              vrie:=false
              else
              if((verif_nombre(z[i])=false) and (verif_operateur(z[i])=false)) then
                vrie:=false;
          end;
        verif_nombreoperateur:=vrie;
      end;
    var x:string[100];
       vrie:boolean; j,i,l:integer; res:real;
       {programme principal}
       begin
         writeln('entrer une expression qui se compose uniquement par des chiffres et qui se termine par = :');
         readln(x);
         l:=length(x);
         while(x[l]<> '=')do
            begin
              writeln('vous avez oublier le signe =');
              writeln;
              writeln('entrer une expression qui se termine obligatoirement par = :');
              readln(x);
              l:=length(x);
            end;
            vrie:=verif_nombreoperateur(x,l);
         while(vrie=false)do
            begin
              writeln('vous avez faire une erreur dans la saisi');
              writeln;
               writeln('entrer une expression qui se termine obligatoirement par = :');
         readln(x);
         l:=length(x);
         while(x[l]<> '=')do
            begin
              writeln('vous avez oublier le signe =');
              writeln;
              writeln('entrer une expression qui se termine obligatoirement par = :');
              readln(x);
              l:=length(x);
            end;
            vrie:=verif_nombreoperateur(x,l);
            end;
     
           case x[2] of
           '+':res:= con_nombre(x[1])+con_nombre(x[3]);
           '-':res:= con_nombre(x[1])-con_nombre(x[3]);
           '*':res:= con_nombre(x[1])*con_nombre(x[3]);
           '/':res:= con_nombre(x[1])/con_nombre(x[3]);
           end;
              i:=2;
         j:=3;
         repeat
           i:=i+2;
           j:=j+2;
           case x[i] of
           '+':res:=res+con_nombre(x[j]);
           '-':res:=res-con_nombre(x[j]);
           '*':res:=res*con_nombre(x[j]);
           '/':res:=res/con_nombre(x[j]);
           end;
     
         until(x[i]='=') ;
          writeln(res);
       readln;
     
       end.
    Merci pour toute réponse.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par billel0.9 Voir le message
    je veux généraliser mon programme pour qu'il soit capable de faire les opérations même entre les nombres.
    Il faut donc travailler sur des chaînes de caractères. Je parcours la chaîne saisie par l'utilisateur. Quand je trouve un chiffre, au lieu de le convertir immédiatement en nombre, je cherche d'abord s'il n'y a pas d'autres chiffres derrière. De tous ces chiffres, je forme une chaîne temporaire, et c'est cette chaîne que je convertis en nombre.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Juste une remarque d'ordre ergonomie et clarté : la fonction verif_nombre peut être abrégée en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function verif_nombre(x:char):boolean;
    var  vrie:boolean;
      begin
        case x of
        '1','2','3','4','5','6','7','8','9': vrie:=true;
         else vrie:=false;
        end;
          verif_nombre:=vrie;
      end;
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  6. #6
    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
    Hoa,
    Citation Envoyé par l_autodidacte Voir le message
    Juste une remarque d'ordre ergonomie et clarté : la fonction verif_nombre peut être abrégée en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function verif_nombre(x:char):boolean;
    var  vrie:boolean;
      begin
        case x of
        '1','2','3','4','5','6','7','8','9': vrie:=true;
         else vrie:=false;
        end;
          verif_nombre:=vrie;
      end;
    Et même en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function verif_nombre(x:char):boolean;
    var  vrie:boolean;
      begin
        case x of
        '1'..'9': vrie:=true;
         else vrie:=false;
        end;
          verif_nombre:=vrie;
      end;
    Et de même, la fonction con_nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function con_nombre(x:char):integer;
    var nombre:integer;
      begin
        nombre = ord(x)-ord('0');
        con_nombre:=nombre;
      end;
    Et j'ajoute un conseil : la présentation du code est presque bonne, mais il manque quelques lignes vides pour éclaircir (au minimum, pour séparer les fonctions l'une de l'autre).
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. [Turbo Pascal] Évaluation d'une expression arithmétique
    Par papech dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 28/04/2014, 16h48
  2. Réponses: 8
    Dernier message: 15/05/2007, 11h02
  3. Réponses: 1
    Dernier message: 09/12/2006, 10h13
  4. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25
  5. Réponses: 10
    Dernier message: 18/11/2004, 23h12

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