k***@gmail.com
2017-05-26 18:47:43 UTC
Bonjour,
Par avance je m'excuse de mon ignorance mais Ada est un langage somme toute compliqué, mes connaissances en programmation se limitent aux concepts simples (condition, variable et constante, un tout petit peu de POO...) que j'ai appris en faisant un peu de Python ou de PHP (deux langages que je ne maîtrise pas du tout soit dit en passant).
OS: Debian 8 64 bits
Compilateur: GNAT 4.9 (dépôts Debian)
Éditeur: vim 2.7.4
Comme premier projet je m'amuse à coder une calculatrice. J'ai obtenu une version fonctionnelle, mais qui ne gère que des entiers, les opérateurs "+", "-", "/", "*", et à priori des nombres de petites tailles. Elle est mal écrite et a des failles évidentes de conceptions.
Avant de passer à la suite, aka améliorer mon code (float, grand nombre, plus d'opérateurs, usage de meilleurs pratique etc) j'aimerai changer ma condition if (voir code ici: https://paste.debian.net/hidden/4e60928d/, notez que j'ai renommé mes variables) par un case.
Or, case ne gère pas de String (obtenu par Ada.Text_IO.Get_Line) mais des types discret (si je ne m'abuse, du genre Character). Donc j'ai voulu modifier mon code, dont voici la version (non fonctionnelle) actuelle:
with Ada.Text_IO;
procedure Main is
type Math_Operators is ('+', '-', 'x', '/');
-- Operator : Math_Operators;
Operator : String (1 .. 1);
First_Number, Second_Number, Result : Integer;
-- Check if the user input (for mathematical operator) is
-- a one length value
function Checking_Operator_And_Change_Type return Math_Operators is
begin
if Operator'Length = 1 then
return Math_Operators (Math_Operators'First);
else
raise Constraint_Error;
end if;
end Checking_Operator_And_Change_Type;
begin
-- Ask the user to assign an integer to variable A
Ada.Text_IO.Put_Line ("ENTER AN Integer:");
First_Number := Integer'Value (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line;
-- Ask the user to assign a mathematical Operator (string) to mathOperator
Ada.Text_IO.Put_Line ("CHOOSE A MATHEMATICAL OPERATOR: '+', '-', '/', '*'");
Operator := Ada.Text_IO.Get_Line;
-- I HAVE TO MAKE SOMETHING WITH THE RETURNED VALUE
-- A FUNCTION RETURN A VALUE
-- I CAN'T IGNORE THIS RETURNED VALUE!
Ada.Text_IO.New_Line;
-- Ask the user to assign an integer to variable Bet
Ada.Text_IO.Put_Line ("ENTER ANOTHER INTEGER:");
Second_Number := Integer'Value (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line;
-- Calculate the result
case Operator is
when "+" =>
Result := First_Number + Second_Number;
when "-" =>
Result := First_Number - Second_Number;
when "*" =>
Result := First_Number * Second_Number;
when "/" =>
Result := First_Number / Second_Number;
end case;
-- Calculate the result
-- if Operator = "+" then
-- Result := First_Number + Second_Number;
-- elsif Operator = "-" then
-- Result := First_Number - Second_Number;
-- elsif Operator = "*" then
-- Result := First_Number * Second_Number;
-- elsif Operator = "/" then
-- Result := First_Number / Second_Number;
-- end if;
-- Display the result
Ada.Text_IO.Put_Line("RESULT:");
Ada.Text_IO.Put_Line (">" & Integer'Image (First_Number) & " " & Operator & Integer'Image (Second_Number) & " =" & Integer'Image (Result));
end Main;
Ce code produit à la compilation cette erreur:
$ gnat make main.adb
gcc-4.9 -c main.adb
main.adb:43:14: expected a discrete type
main.adb:43:14: found type "Standard.String"
gnatmake: "main.adb" compilation error
De ce que j'en comprend, case attend bel et bien un type discret (ou Character, de ce que j'ai retenu d'une discussion sur #***@irc.freenode.org).
On m'a donc indiqué que l'idéal serait de créer un type, comme Math_Operators auquel j'attribue mes opérateurs mathématique ("+", "-", "x", "/"), je récupère via Ada.text_IO.Get_Line (qui donne un String) l'opérateur du choix de l'utilisateur (en testant sa longueur, d'où la fonction Checking_Operator_And_Change_Type, dont je n'arrive pas à me servir et qui au delà de checker la longueur est censé me sortir un Character avec le return) et le rend utilisable pour le case en le rendant du type Math_Operator (qui est, je crois, un sous-type de Character, et est donc compatible avec case).
Sans nécessairement me donner la réponse ou éditer mon code, auriez-vous une indication qui m'aiderait à avancer? J'ai beau lire de la documentation sur wikibooks.org, des manuels de référence ainsi que googler, j'arrive pas à trouver mon bonheur.
Si vous avez besoin de plus d'informations, n'hésitez pas.
PS: Je sais qu'une énorme part de l'apprentissage de l'Ada concerne le Typage, j'y travail, mais j'ai besoin de cas concret plus que de lecture pour comprendre. Cependant si vous avez un bon lien... Je suis preneur ;).
Cordialement,
Kévin GASPARD
Par avance je m'excuse de mon ignorance mais Ada est un langage somme toute compliqué, mes connaissances en programmation se limitent aux concepts simples (condition, variable et constante, un tout petit peu de POO...) que j'ai appris en faisant un peu de Python ou de PHP (deux langages que je ne maîtrise pas du tout soit dit en passant).
OS: Debian 8 64 bits
Compilateur: GNAT 4.9 (dépôts Debian)
Éditeur: vim 2.7.4
Comme premier projet je m'amuse à coder une calculatrice. J'ai obtenu une version fonctionnelle, mais qui ne gère que des entiers, les opérateurs "+", "-", "/", "*", et à priori des nombres de petites tailles. Elle est mal écrite et a des failles évidentes de conceptions.
Avant de passer à la suite, aka améliorer mon code (float, grand nombre, plus d'opérateurs, usage de meilleurs pratique etc) j'aimerai changer ma condition if (voir code ici: https://paste.debian.net/hidden/4e60928d/, notez que j'ai renommé mes variables) par un case.
Or, case ne gère pas de String (obtenu par Ada.Text_IO.Get_Line) mais des types discret (si je ne m'abuse, du genre Character). Donc j'ai voulu modifier mon code, dont voici la version (non fonctionnelle) actuelle:
with Ada.Text_IO;
procedure Main is
type Math_Operators is ('+', '-', 'x', '/');
-- Operator : Math_Operators;
Operator : String (1 .. 1);
First_Number, Second_Number, Result : Integer;
-- Check if the user input (for mathematical operator) is
-- a one length value
function Checking_Operator_And_Change_Type return Math_Operators is
begin
if Operator'Length = 1 then
return Math_Operators (Math_Operators'First);
else
raise Constraint_Error;
end if;
end Checking_Operator_And_Change_Type;
begin
-- Ask the user to assign an integer to variable A
Ada.Text_IO.Put_Line ("ENTER AN Integer:");
First_Number := Integer'Value (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line;
-- Ask the user to assign a mathematical Operator (string) to mathOperator
Ada.Text_IO.Put_Line ("CHOOSE A MATHEMATICAL OPERATOR: '+', '-', '/', '*'");
Operator := Ada.Text_IO.Get_Line;
-- I HAVE TO MAKE SOMETHING WITH THE RETURNED VALUE
-- A FUNCTION RETURN A VALUE
-- I CAN'T IGNORE THIS RETURNED VALUE!
Ada.Text_IO.New_Line;
-- Ask the user to assign an integer to variable Bet
Ada.Text_IO.Put_Line ("ENTER ANOTHER INTEGER:");
Second_Number := Integer'Value (Ada.Text_IO.Get_Line);
Ada.Text_IO.New_Line;
-- Calculate the result
case Operator is
when "+" =>
Result := First_Number + Second_Number;
when "-" =>
Result := First_Number - Second_Number;
when "*" =>
Result := First_Number * Second_Number;
when "/" =>
Result := First_Number / Second_Number;
end case;
-- Calculate the result
-- if Operator = "+" then
-- Result := First_Number + Second_Number;
-- elsif Operator = "-" then
-- Result := First_Number - Second_Number;
-- elsif Operator = "*" then
-- Result := First_Number * Second_Number;
-- elsif Operator = "/" then
-- Result := First_Number / Second_Number;
-- end if;
-- Display the result
Ada.Text_IO.Put_Line("RESULT:");
Ada.Text_IO.Put_Line (">" & Integer'Image (First_Number) & " " & Operator & Integer'Image (Second_Number) & " =" & Integer'Image (Result));
end Main;
Ce code produit à la compilation cette erreur:
$ gnat make main.adb
gcc-4.9 -c main.adb
main.adb:43:14: expected a discrete type
main.adb:43:14: found type "Standard.String"
gnatmake: "main.adb" compilation error
De ce que j'en comprend, case attend bel et bien un type discret (ou Character, de ce que j'ai retenu d'une discussion sur #***@irc.freenode.org).
On m'a donc indiqué que l'idéal serait de créer un type, comme Math_Operators auquel j'attribue mes opérateurs mathématique ("+", "-", "x", "/"), je récupère via Ada.text_IO.Get_Line (qui donne un String) l'opérateur du choix de l'utilisateur (en testant sa longueur, d'où la fonction Checking_Operator_And_Change_Type, dont je n'arrive pas à me servir et qui au delà de checker la longueur est censé me sortir un Character avec le return) et le rend utilisable pour le case en le rendant du type Math_Operator (qui est, je crois, un sous-type de Character, et est donc compatible avec case).
Sans nécessairement me donner la réponse ou éditer mon code, auriez-vous une indication qui m'aiderait à avancer? J'ai beau lire de la documentation sur wikibooks.org, des manuels de référence ainsi que googler, j'arrive pas à trouver mon bonheur.
Si vous avez besoin de plus d'informations, n'hésitez pas.
PS: Je sais qu'une énorme part de l'apprentissage de l'Ada concerne le Typage, j'y travail, mais j'ai besoin de cas concret plus que de lecture pour comprendre. Cependant si vous avez un bon lien... Je suis preneur ;).
Cordialement,
Kévin GASPARD