Question sur mon programme Calculatrice...

Question sur mon programme Calculatrice... - Ada - Programmation

Marsh Posté le 02-02-2007 à 18:02:50    

Bonjour/Bonsoir,
 
Dans un exo de TP je dois réaliser une calculatrice qui supporte uniquement les 4 opérations de base (qui sait donc effectuer des opérations du style "12*7" ). Bon, j'ai réussi et ça marche. Mais y'a un truc qui m'intrigue (une question de débutante qui se pose toujours trop de questions..) Je vous donne d'abord mon code:
 
PROCEDURE Calculatrice IS
   I,J: Integer;
   R: Float;
   Op: Character;
   
BEGIN
   Put("Veuillez entrer l'opération à effectuer: ");
   Get(I);
   Get(Op);
   Get(J);
   IF Op='*' THEN
      R:=Float(I*J);
   ELSIF Op='+' THEN
      R:=Float(I+J);
   ELSIF Op='/'THEN
      R:=Float(I/J);
   ELSE
      R:=Float(I-J);
   END IF;
   New_Line;
   Put("Résultat-----------> ");
   Put(R,1,2,0);
 
END Calculatrice;
 
Voilà, donc en fait j'ai remarqué qu'en exécutant, si je tape mon opération d'un bloc ou si je fais entrée entre le premier nombre et le type d'opération (+,-,* ou/) et entre le type d'opération et le deuxième, ça marche dans les deux cas. En clair, que je tape
23*7
ou
23
*
7
le programme fonctionne et me donne le bon résultat.
Alors je me demande:
Quand je tape tout d'un bloc, comment le compilateur sait-il qu'à l'intérieur de ce bloc il y a la variable I suivie du type d'opération suivie de la variable J ?? Parce qu'avant de tester mon programme je pensais que pour que ça marche j'aurais dû faire entrée entre chaque élément, et que sinon il aurait considéré que tout ça n'était que la variable I et que le curseur aurait continué à clignoter en faisant entrée, afin que je rentre l'opération puis J...  Or ça fonctionne    :??:  
 
Je sais pas si c'est très clair lol...  
 
Merci..

Reply

Marsh Posté le 02-02-2007 à 18:02:50   

Reply

Marsh Posté le 02-02-2007 à 20:46:46    

A priori, c'est "Get" qui prend juste ce qu'il attend (ce qui me surprend, mais bon, je debute).
Donc, comme toute les données attenduent par les trois "Get" sont dans le buffer clavier, chacun prend ça part.


Message édité par Profil supprimé le 02-02-2007 à 20:47:17
Reply

Marsh Posté le 03-02-2007 à 00:40:40    

Oh un collègue débutant ;)  
Merci jovalise, mais je comprends toujours pas en fait: parce que si on entre 127+4, comment Get peut-il savoir que I va de 1à 7, qu'ensuite c'est le type d'opération et qu'en dernière position on a J ?  :??:  
Ou alors il sait différencier les chiffres des caractères et donc sait qu'il doit passer à la variable Op lorqu'on entre "+" puis à la variable J lorsqu'on entre 4 ?? (je ne vois que ça  :??: )

Reply

Marsh Posté le 03-02-2007 à 04:32:47    

Salut  :hello: ,  
Pour poster du code source, tu ferais mieux d'utiliser les balises faites pour ça : ( code=ada puis /code )

Code :
  1. Procedure ... is
  2. begin ...


 

liligator a écrit :

Voilà, donc en fait j'ai remarqué qu'en exécutant, si je tape mon opération d'un bloc ou si je fais entrée entre le premier nombre et le type d'opération (+,-,* ou/) et entre le type d'opération et le deuxième, ça marche dans les deux cas.
.....
Quand je tape tout d'un bloc, comment le compilateur sait-il qu'à l'intérieur de ce bloc il y a la variable I suivie du type d'opération suivie de la variable J ??


Ce n'est pas le compilateur qui "sait ..." car cela se passe à l'exécution.
De plus, tu ne sembles pas avoir compris que tu utilise 2 Get différents :
 
Le Get de Ada.Integer_Text_io saute tout les blancs, lit un nombre entier respectant la syntaxe Ada pour les entiers et s'arrète dès qu'il arrive nième caractère tel que n = Integer'length, ou bien s'il rencontre un caractère qui ne respecte pas la syntaxe d'un entier.
Dans ton exemple, Get(i), s'arrète à '*' après avoir consommé les caractères '2' et '3'.
Le caractère '*' est laissé dans le tampon mémoire, et c'est le Get de Ada.Text_Io qui le consomme.
Ce Get là ne va pas plus loin car il est fait pour consommer un seul caractère.
Enfin Get(j) consomme les derniers caractères numérique pour donner une valeur entière à J.
 
Voilà, c'est pas plus compliqué.
 

Reply

Marsh Posté le 04-02-2007 à 00:56:19    

Effectivement je sais pas pourquoi j'ai parlé de compilateur, je devais être fatiguée  :)  
Ben merci pour ces explications, maintenant je comprends mieux comment ça fonctionne (en cours on n'était pas rentrés dans les détails, or c'est quand même mieux de savoir ce qui se passe et pourquoi on tape tel ou tel truc).
 
(et ok pour les balises, j'y penserai la prochaine fois, c'est quand même plus simple..)
 
 :hello:  
 

Reply

Marsh Posté le 04-02-2007 à 01:50:49    

la div par 0 ça se passe comment ?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 04-02-2007 à 07:22:59    


manuel@gandalf:~/claculatrice$ ./calculatrice
Veuillez entrer l'opération à effectuer: 10/0
 
raised CONSTRAINT_ERROR : calculatrice.adb:28 divide by zero

Reply

Marsh Posté le 04-02-2007 à 11:44:37    

Ben moi quand je divise par zéro avec Adagide j'obtiens l'infini comme résultat...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed