#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;
Моя проблема должна быть в состоянии выполнить все эти входные данные и выдать следующие выходные данные:
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