Как получить Y/N от пользователя в Аде
Я написал программу, которая определит, будет ли в какой-нибудь воображаемой школе снежный день или нет. У меня программа работает правильно, у меня просто проблема.
По сути, я хочу, чтобы True/False был Y/N. А потом, когда я печатаю SnowDay - рассказывает, есть ли снежный день. Затем будет напечатано "Да" или "Нет" вместо "Истина" или "Ложь"
SofieAssignment : Boolean;
SnowDay : Boolean;
.
.
Put(Item => "Does Sophie have a big assignment due in class, True/False? ");
Get(Item => SophieAssignment);
.
.
Put(Item => "Should we have a snow day today? " & Boolean'Image (SnowDay));
3 ответа
Предполагая, что я понимаю, что вы пытаетесь сделать:
(1) Если вы хотите, чтобы пользователь вводил Y или N для SophieAssignment
Есть несколько вариантов:
Вы можете ввести строку и проанализировать строку самостоятельно.
Put(Item => "Does Sophie have a big assignment due in class, True/False? ");
declare
Answer : String := Get_Line; -- Get_Line is in Ada.Text_IO
begin
if Answer = "Y" or else Answer = "y" or else Answer = "Yes" or else
Answer = "yes" then
SophieAssignment := True;
elsif Answer = "N" or else Answer = "n" or else Answer = "No" or else
Answer = "no" then
SophieAssignment := False;
else
-- whatever you want to do for an invalid entry
end if;
end;
(Это может быть улучшено, но я просто пытаюсь охватить фундаментальный подход.) Другая возможность - определить собственное перечисление, которое имеет значения Y
а также N
:
type Yes_No is (N, Y);
package Yes_No_IO is new Enumeration_IO (Yes_No); -- Enumeration_IO is in Ada.Text_IO
Answer : Yes_No;
Put(Item => "Does Sophie have a big assignment due in class, True/False? ");
Yes_No_IO.Get(Item => Answer);
SophieAssignment := (Answer = Y);
Get
здесь установят Answer
либо Y
или же N
если пользователь вводит имя перечисления (в любом случае); это поднимет Data_Error
если что-то еще введено. Я бы предпочел первый метод, если вы хотите лучше контролировать обработку ввода. Во-вторых, если пользователь вводит "Y Z", Get
вернет Y
и Z
остается во входном потоке в ожидании следующей операции ввода. Кроме того, первый метод допускает несколько возможных ответов лучше, чем второй, хотя вы могли бы заставить его работать с перечислением вроде
type Yes_No is (N, No, Y, Yes);
(2) Для вывода "Yes"
или же "No"
основанный на Boolean
Вы можете использовать функцию, как в ответе Кейта, или вы можете установить массив:
type Const_String_Acc is access constant String;
Yes_No_Image : constant array (Boolean) of Const_String_Acc :=
(False => new String' ("No"),
True => new String' ("Yes"));
Put(Item => "Should we have a snow day today? " & Yes_No_Image (SnowDay).all);
Чтобы распечатать Boolean
значение как "Да" или "Нет", просто напишите функцию:
function Boolean_Image(B: Boolean) return String is
begin
if B then
return "Yes";
else
return "No";
end if;
end Boolean_Image;
и использовать его вместо Boolean'Image
,
Чтобы прочитать значение от пользователя как Y или y для True
или как N или n для False
Прочитайте Character
значение и проверить его, чтобы определить, какое булево значение установить. Подумайте, как вы хотите ответить, если вводимый пользователем символ не является Y, y, N или n. Ты можешь использовать Get_Immediate
читать один символ, не дожидаясь новой строки при вводе.
type Snow_Day_Type is new Boolean;
function Yes return Snow_Day_Type is (Snow_Day_Type'(True));
function No return Snow_Day_Type is (Snow_Day_Type'(False));