Как добавить различные значения типа в массив в Ada?
Моя цель состоит в том, чтобы получить из стандартного ввода уравнение, сохранить его в массиве для последующего использования / повторной печати, а затем вывести строку, печатающую все уравнение И ответ после, примерно так:
Вход: 2+3=
Выход: 2 + 3 = 5
Я очень смущен тем, как это сделать, из-за неспособности Ады иметь динамические строки и тому подобное.
Это грубая идея, которую я имею в псевдокоде..
Until_loop:
loop
get(INT_VAR);
--store the int in the array?
get(OPERATOR_VAR);
--store the operator in the following index of that array? and
--repeat until we hit the equal sign, signaling end of the equation
get(CHECK_FOR_EQUALSIGN);
exit Until_loop when CHECK_FOR_EQUALSIGN = "=";
end loop Until_loop;
--now that the array is filled up with the equation, go through it and do the math
--AND print out the equation itself with the answer
Я предполагаю, что массив должен выглядеть так:
[2][+][5][=][7]
Я также новичок в Ada, поэтому еще сложнее понять, я очень хорошо разбираюсь в Java, но не могу привыкнуть к строго типизированному синтаксису. Пожалуйста, спросите, если вам нужно больше информации.
3 ответа
Ada может использовать динамические фиксированные строки, не прибегая к Unbounded_String или Containers, а также к выделению и указателям, хотя это варианты.
Это делает возможным понимание того, что строка может получить свой размер из своего выражения инициализации, когда она объявлена, но это объявление может быть внутри цикла, так что она выполняется заново каждый раз вокруг цикла. Вы не всегда можете структурировать программу так, чтобы это имело смысл, хотя это возможно на удивление часто, если немного подумать.
Еще одна особенность заключается в том, что в дальнейшем эти блоки "объявления" делают отличных кандидатов для очень простого рефакторинга в процедуры.
with Ada.Text_IO; use Ada.Text_IO;
procedure Calculator is
begin
loop
Put("Enter expression: ");
declare
Expression : String := Get_Line;
begin
exit when Expression = "Done";
-- here you can parse the string character by character
for i in Expression'range loop
put(Expression(i));
end loop;
New_Line;
end;
end Loop;
end Calculator;
Вы должны получить
brian@Gannet:~/Ada/Play$ gnatmake calculator.adb
gcc-4.9 -c calculator.adb
gnatbind -x calculator.ali
gnatlink calculator.ali
brian@Gannet:~/Ada/Play$ ./calculator
Enter expression: hello
hello
Enter expression: 2 + 2 =
2 + 2 =
Enter expression: Done
brian@Gannet:~/Ada/Play$
Вы все еще должны написать калькулятор...
Если все, что вы пытаетесь сделать, это ввести строку переменной длины, передать ее какому-нибудь оценщику, который анализирует и оценивает строку, а затем отражает ее обратно вместе с вычисленным значением, для динамической обработки строки вы можете просто использовать Unbounded_Strings и Unbounded_IO:
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
use Ada.Text_IO;
procedure Evaluate_Expression is
function Evaluate (E : Unbounded_String) return Unbounded_String is
begin
...
end Evaluate;
Expression : Unbounded_String;
begin
Put("Input: ");
Get_Line(Expression); -- This is Unbounded_IO.Get_Line.
Put_Line(To_Unbounded_String("Output: ")
& Expression
& To_Unbounded_String(" = ")
& Evaluate(Expression));
end Evaluate_Expression;
неспособность Ады иметь динамические строки и тому подобное
У Ады нет неспособности как таковой, вам просто нужно использовать структуру, чтобы обеспечить желаемую динамическую способность. В этом случае вам нужно использовать объекты и указатели (записи и доступ). Ваши объекты инкапсулируют входные данные и предоставляют функции для их объединения. Очевидно, у вас также есть различные типы входных данных, чисел и операторов, поэтому вам нужно встроить их в свои объекты (используя наследование).
В основном вы хотите использовать ООП для хранения и обработки введенных данных.