Как мне ввести строку, содержащую менее 5 символов, и при этом перейти к следующей строке кода?

#string #ada

Вопрос:

 
with Ada.Text_IO;              use Ada.Text_IO;
with Ada.Float_Text_IO;        use Ada.Float_Text_IO;

procedure Help is
    F: Float
    S: String(1..6);
begin
    Put("Type a string with max 5 characters: ");
    Get_Line(S(1..5), I);
    Put("You typed the string: ");
    Put(S(1..I));
    Skip_Line;
    New_Line;

    Put("Type a string with max 5 characters: ");
    Get_Line(S(1..5), I);
    Put("You typed the string: ");
    Put(S(1..I));
end Help;
 

Когда я запускаю этот код и, например, набираю «Привет, брат», я получаю «Привет, б» в качестве вывода, а затем он переходит к следующей проблеме. Все хорошо и понятно!

Но когда я набираю строку, содержащую менее 5 символов, например «Эй», она вводит ее, как и ожидалось, НО все еще ждет, пока я заполню строку, содержащую 5 символов. Предполагается, что это должно перейти к следующей проблеме, но этого не происходит. Если я сейчас наберу «ss», вы получите

«Хейсс», а затем он переходит к следующей проблеме. Так как же мне это сделать? Как мне сделать так, чтобы даже если у меня меньше 5 символов, он не только наберет их, но и перейдет к следующей задаче? Я вроде как понял, что мне нужно использовать простые последовательности «если», но я понятия не имею, как мне их применять, поскольку все мои попытки провалились.

Моя проблема должна быть в состоянии выполнить все эти входные данные и выдать следующие выходные данные:

 Tye a string with max 5 characters: Hi
You typed the string: Hi

Tye a string with max 5 characters: Hello
You typed the string: Hello

Tye a string with max 5 characters: Hey there
You typed the string: Hey t

Tye a string with max 5 characters: 
You typed the string:
 

Комментарии:

1. Это Ада, а не АДА. Пожалуйста, опубликуйте код, а не ссылки на изображения.

2. Используйте declare блок с. I : String := Get_Line; Я думаю, что это должно сработать, я не делаю такого ввода.

3. Я не могу заставить его работать. Мне сказали, что я должен использовать простую последовательность «если», но я просто не могу заставить ее работать…

4. Пожалуйста, повторите свой вопрос и покажите нам КОД.

5. Я ответил на этот вопрос на Reddit ( reddit.com/r/ada/comments/pmd6xw/ada_string_output/… ).

Ответ №1:

Функция Get_Line принимает два параметра с именем Item, который является строкой, и последний, который является экземпляром Natural.

Get_Line будет считывать входные данные до конца строки или до конца строки, в зависимости от того, что наступит раньше. Последний параметр-это параметр OUT, возвращающий значение индекса последнего символа, считанного в строку. Попробуйте следующий подход:

 with Ada.Text_IO; use Ada.Text_IO;
procedure help is
   Input    : String (1..80); -- It need not be only 5 characters
   Length   : Natural;
   Num_Good : Natural := 0;
begin
   while Num_Good < 2 loop
      Put ("Enter a string of 5 characters: ");
      Get_Line (Item => Input, Last => Length);
      if Length = 5 then
         Put_Line (Input (1..Length));
         Num_Good := Num_Good   1;
      else
         Put_Line ("Error: Input does not contain exactly 5 characters.");
      end if;
   end loop;
end help;
 

Ниже приведена версия, в которой используются только описанные вами функции:

 with Ada.Text_IO; use Ada.Text_IO;
procedure help2 is
   S : String(1..80);
   I : Integer;
   J : Integer := 0;
begin
   loop
      Put("Enter a string containing 5 characters: ");
      Get_Line (S, I);
      if I = 5 then
         J := J   1;
         Put_Line (S(1..I));
      end;
      if J = 2 then
         exit;
      end if;
   end loop;
end help2;
 

Программа прочитает строку, введенную пользователем, и выведет строку, если она содержит ровно 5 символов. Ничего не будет выведено, если строка не содержит ровно 5 символов. Цикл завершается, когда пользователь успешно вводит две строки, содержащие ровно 5 символов.

Следующая версия принимает строку длиной до 5 символов.

 with Ada.Text_IO; use Ada.Text_IO;
procedure Up_To_five is
   S : String (1..5);
   I : Integer;
begin
   Put ("Enter a string with a max of 5 characters: ");
   Get_Line (S, I);
   Skip_Line;
   Put ("You typed the string: ");
   Put_Line (S(1..I));
   New_Line;
   Put ("Enter a string with a max of 5 characters: ");
   Get_Line (S, I);
   Skip_Line;
   Put ("You typed the string: ");
   Put_Line (S(1..I));
end Up_To_five;
 

Комментарии:

1. Спасибо вам за ваш ответ! Хотя это может сработать, это не совсем то, что я ищу, так как некоторые вещи, такие как Num_Good, Item => Ввод, Last =>> Длина, для меня совершенно новы. Эту проблему следует решить, используя только некоторые из следующих: Строка, символ, Целочисленная строка Get_Line, Get, Put, Put_Line, цикл, if-последовательности. Я работаю над этой проблемой уже несколько часов… Я знаю, в чем проблема, но я не могу найти способ ее решить.

2. Num_Good-это просто имя переменной, которую я создал, чтобы подсчитать, сколько раз пользователь вводил 5 символов. Элемент => Ввод, Последний =>> Длина использует именованные ассоциации Ada. Большинство языков программирования используют только позиционную ассоциацию, такую как «Put_line (ввод, длина)». Ada допускает как позиционную ассоциацию, так и именованную ассоциацию. Именованная ассоциация напрямую связывает формальное имя параметра с фактическим именем параметра. Natural-это заранее определенный подтип целого числа с минимальным значением 0.

3. Да, но я пока не собираюсь решать эту проблему с их помощью. Поскольку я учусь в школе и все еще новичок, мы узнали всего несколько вещей. Поэтому мы должны решать эту проблему только с помощью того, чему мы научились

4. Спецификация процедуры Get_Line такова: «процедура Get_Line (Элемент : Строка; Последний : Натуральный)»; Каждый экземпляр Natural является экземпляром целого числа. Минимальное значение, которое Get_Line присвоит последнему, равно 0.

5. Нет, вовсе нет, но нам разрешается применять только то, чему мы научились до выполнения этой задачи.

Ответ №2:

В вашей программе говорится

 Put("Type a string with max 5 characters: ");
Get_Line(S(1..5), I);
 

и вы набираете hi и нажимаете RET (клавиша возврата). Get_Line возвращает, израсходовав h i RET , значение S (1 .. 2) hi , которое вы распечатали, и I значение 2.

Теперь ваша программа говорит

 Skip_Line;
 

который, согласно ARM A. 10.5(9)

… Считывает и отбрасывает все символы до тех пор, пока не будет прочитан терминатор строки, …

и поэтому сидит там, ожидая очередного повторения.

С другой стороны, если вы наберете 5 или более символов, Get_Line завершится до того, как потребуется прочитать RET, так что он все еще находится во входном буфере.

Поэтому вам нужно решить, звонить или нет Skip_Line .

Комментарии:

1. Я попытался удалить Skip_Line, но затем столкнулся с другой проблемой. Если я введу более 5 символов, символы, которые не поместились в моей первой строке, автоматически перенесутся в другую строку.

2. Возможно, мне следовало сказать, что ваша программа должна решить, звонить или нет Skip_Line