with Ada.Text_IO; use Ada.Text_IO;
procedure factor is
rate: Integer;
begin
Put("Enter rate: ");
Get(rate);
case rate is
when 1 | 2 =>
Put("Factor = ", factor = 2 * rate - 1);
when 3 | 5 =>
Put("Factor = ", factor = 3 * rate + 1);
when 4 =>
Put("Factor = ", factor = 4 * rate - 1);
when 6 | 7 | 8 =>
Put("Factor = ", factor = rate - 2);
when others =>
Put("Factor = ", rate);
end case;
end factor;
Я новичок в ada и не могу решить эту ошибку. пожалуйста, помогите мне с этим кодом
это простой случай переключения в ada.. это должно возвращать фактор, а скорость - это ввод от пользователя
Во-первых, вы не упомянули об ошибке, которую получили.
Я думаю, ты понял это первым
factor.adb:8:05: no candidate interpretations match the actuals:
factor.adb:8:05: missing argument for parameter "Item" in call to "get" declared at a-textio.ads:239
factor.adb:8:05: missing argument for parameter "Item" in call to "get" declared at a-textio.ads:205
factor.adb:8:09: expected type "Standard.String"
factor.adb:8:09: found type "Standard.Integer"
Если вы внимательно прочитаете, то увидите, что компилятор жалуется на типы. Он ожидал Standard.String и получил Standard.Integer. На самом деле вы использовали Ada.Text_io, который предназначен только для текста (см. ARM).
Поскольку вы хотите получить целое число, вы должны использовать целочисленную версию для ввода-вывода, то есть Integer_IO.
Для отображения есть несколько способов, но вы можете использовать Integer'Image(my_int) чтобы преобразовать ваше целое число в строку.
Затем проверьте, где объявлен переменный фактор. Фактически, вы никогда не заявляли об этом, но даже не обязаны этого делать.
Наконец, проверьте, как вы можете объединить две строки, вы сможете присоединиться к "Factor =" с целым числом, преобразованным в строку.
Вот сравнение вашей программы и той, которая компилируется и работает правильно:
---------------------------------------------------------------
-- Original program:
--
-- with Ada.Text_IO; use Ada.Text_IO;
-- procedure factor is
-- rate: Integer;
-- begin
-- Put("Enter rate: ");
-- Get(rate);
-- case rate is
-- when 1 | 2 =>
-- Put("Factor = ", factor = 2 * rate - 1);
-- when 3 | 5 =>
-- Put("Factor = ", factor = 3 * rate + 1);
-- when 4 =>
-- Put("Factor = ", factor = 4 * rate - 1);
-- when 6 | 7 | 8 =>
-- Put("Factor = ", factor = rate - 2);
-- when others =>
-- Put("Factor = ", rate);
-- end case;
-- end factor;
------------------------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Main is
rate : Integer;
factor : Integer;
begin
Put ("Enter rate: ");
Get (rate);
case rate is
when 1 | 2 =>
factor := 2 * rate - 1;
when 3 | 5 =>
factor := 3 * rate + 1;
when 4 =>
factor := 4 * rate - 1;
when 6 | 7 | 8 =>
factor := rate - 2;
when others =>
factor := rate;
end case;
Put_Line ("Factor = " & factor'Image);
end Main;
В Аде процедуры и функции ввода-вывода привязаны к читаемым или записываемым типам. Следовательно, для чтения Integer требуется экземпляр Ada.TextIO.Integer_IO. Предопределенный пакет Ada.Integer_Text_IO как раз такой пакет. Процедура Get из этого пакета используется для ввода значения переменной скорости.
В Аде переменные должны быть объявлены до того, как они будут использованы, и они объявляются только в декларативной части процедуры или функции; то есть часть процедуры или функции перед началом зарезервированного слова. Переменная с именем factor объявлена в декларативной части процедуры main.
Оператор case вычисляет значение фактора на основе введенной скорости. После окончания оператора case переменной factor было присвоено значение в соответствии с логикой оператора case. Затем он выводится с завершающим символом новой строки с помощью процедуры Put_Line.
Процедуре Put_Line требуется одна строка в качестве аргумента. Эта строка создается путем объединения литеральной строки "Factor =" со строковым представлением значения в factor. Атрибут Image преобразует целочисленное значение в factor в соответствующее строковое представление. Это строковое значение объединяется с литеральной строкой, образуя один строковый аргумент для процедуры Put_Line.
Переменные (и типы среди прочего) также могут быть объявлены в declare .. begin .. end; блокировать.
Когда вы хотите получить рейтинг от пользователя, полезно знать, что такое рейтинг. Из оператора case похоже, что тип скорости может быть объявлен как -
1) type Rate_Type is 1 .. 8;
2) type Rate_Type is new Integer range 1 .. 8;
3) subtype Rate_Type is Integer range 1 .. 8;
Rate : Rate_Type;
В этом случае (новый для Ады) вариант 3 будет лучшим вариантом. Итак, теперь Rate является целым числом в диапазоне от (включая) 1 до (включая) 8. Чтобы получить Rate от пользователя
package Rate_IO is new Ada.Text_IO.Integer_IO (Rate_Type);
Пакет Rate_IO похож на Ada.Integer_Text_IO, но для Rate_Type вместо Integer и Rate вводится пользователем.
Rate_IO.Get (Rate);
Преимущество Rate_IO заключается в том, что если пользователь вводит значение, не входящее в диапазон Rate_Type, возникает исключение (Data_Error).
Это приведет к остановке программы с некоторым сообщением.
Часто бывает лучше остановить программу, чем позволить ей работать со значением, выходящим за пределы допустимого диапазона. По крайней мере, это делает программу намного проще.
Итак, теперь, когда Rate находится в диапазоне, оператор case
выглядит так:
case rate is
when 1 | 2 => factor := 2 * rate - 1;
when 3 | 5 => factor := 3 * rate + 1;
when 4 => factor := 4 * rate - 1;
when 6 | 7 | 8 => factor := 1 * rate - 2;
end case;
Ниже представлена программа с обработчиком исключений. А uncommented — это пример со значением по умолчанию для rate.
with ada.text_io; use ada.text_io;
with ada.integer_text_io;
procedure program_2 is
subtype rate_t is integer range 1 .. 8;
package rate_io is new ada.text_io.integer_io (rate_t);
rate : rate_t;
factor : integer;
begin
-- Input
put ("Enter rate: ");
rate_io.get (rate); -- May raise data_error exception
-- Calculate
case rate is
when 1 | 2 => factor := 2 * rate - 1;
when 3 | 5 => factor := 3 * rate + 1;
when 6 | 7 | 8 => factor := 1 * rate - 2;
when 4 => factor := 1 * rate + 0;
end case;
-- Output
put ("factor = ");
ada.integer_text_io.put (factor);
new_line;
-- Error handling
exception when data_error =>
put_line ("rate out of range");
end program_2;
-- Put begin/exception/end block around rate_io.get to
-- provide ie a default value:
--
-- begin
-- rate_io.get (rate);
-- exception when data_error =>
-- rate := rate_t'first; -- A default value
-- end;
Кроме того,
=
сравнивает элементы слева и справа и возвращает логическое значение; единственный видимыйfactor
— это имя процедуры, а процедуры ничего не могут вернуть, поэтому компилятор говоритerror: procedure name cannot be used as operand
. Я думаю, что OP имел в виду присвоитьfactor
и использовать результат, что является вещью C