Как исправить эту ошибку переключения регистра в Аде?

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.. это должно возвращать фактор, а скорость - это ввод от пользователя

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
108
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Во-первых, вы не упомянули об ошибке, которую получили.

Я думаю, ты понял это первым

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 =" с целым числом, преобразованным в строку.

Кроме того, = сравнивает элементы слева и справа и возвращает логическое значение; единственный видимый factor — это имя процедуры, а процедуры ничего не могут вернуть, поэтому компилятор говорит error: procedure name cannot be used as operand. Я думаю, что OP имел в виду присвоить factor и использовать результат, что является вещью C

Simon Wright 28.10.2022 09:16
Ответ принят как подходящий

Вот сравнение вашей программы и той, которая компилируется и работает правильно:

---------------------------------------------------------------
-- 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; блокировать.

darkestkhan 11.11.2022 08:54

Когда вы хотите получить рейтинг от пользователя, полезно знать, что такое рейтинг. Из оператора 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;

Другие вопросы по теме