Input 如何在Ada中从用户检索Y/N

Input 如何在Ada中从用户检索Y/N,input,boolean,output,ada,Input,Boolean,Output,Ada,我写了一个程序,它将决定某个想象中的学校是否会下雪。我的程序运行正常我只是有个问题 基本上我想要的是真/假为Y/N,然后当我打印SnowDay时,告诉我是否有一个雪天。然后它将打印“是”或“否”,而不是“真”或“假” 要将布尔值打印为“是”或“否”,只需编写一个函数: function Boolean_Image(B: Boolean) return String is begin if B then return "Yes"; else retu

我写了一个程序,它将决定某个想象中的学校是否会下雪。我的程序运行正常我只是有个问题

基本上我想要的是真/假为Y/N,然后当我打印SnowDay时,告诉我是否有一个雪天。然后它将打印“是”或“否”,而不是“真”或“假”


要将
布尔值打印为“是”或“否”,只需编写一个函数:

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
,只需读取
字符
值并对其进行测试,以确定要设置的布尔值。考虑如果用户输入的字符不是Y、Y、N或N中的任何一个,您希望如何响应。您可以使用
Get_Immediate
读取单个字符,而无需等待输入换行。

假设我理解您的意图:

(1) 如果您希望用户为
SophieAssignment
输入Y或N,则有两种可能:

您可以输入字符串并自己分析该字符串

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
;如果输入其他内容,它将引发数据错误。如果您想更好地控制输入的处理方式,我更喜欢第一种方法。对于第二种情况,如果用户输入“Y Z”,
Get
将返回
Y
,并且
Z
将留在输入流中等待下一个输入操作。此外,第一种方法比第二种方法更好地允许多个可能的答案,尽管您可以使用类似

type Yes_No is (N, No, Y, Yes);
(2) 要根据
布尔值输出
“Yes”
“No”
,可以使用Keith答案中的函数,也可以设置数组:

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);

请学习如何格式化你的代码,这样你就不知道文本或代码本身在哪里了。这是如何回答问题的?它不影响I/O。
type Yes_No is (N, No, Y, Yes);
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);