Как получить 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));
Другие вопросы по тегам