我正在编写一个多项选择测验,用户必须通过输入a
到d
之间的字母来选择答案。每个问题的提示如下所示:
What is the last letter in alphabet?
(a) Y
(b) R
(c) Z
(d) Q
如果用户输入了其他内容,我希望显示一条消息并再次打印整个问题,直到输入为a
、b
、c
或d
。
以下是我尝试过的方法:(简体字)
question = "What is the last letter in alphabet?\n(a) Y\n(b) R\n(c) Z\n(d) Q"
puts question
answer = gets.chomp.to_s
while answer > "d"
puts "Please enter a, b, c, or d"
puts
puts question
answer = gets.chomp.to_s
end
当输入e
、f
、g
等时,它可以正常工作,但它不能捕获像ab
、1
、Z
这样的输入,或者当用户只是按回车键时。
3条答案
按热度按时间cclgggtu1#
您的方法不起作用,因为
answer > "d"
使用两个字符串的(Unicode)码位来比较字符串。(它相当于ASCII表)“d”的码位为U+0064。任何较小的码位(即图表中“d”之前的每个字符)都被视为较小的码位。这包括所有(常规)数字、所有(基本拉丁文)大写字母和以下几个符号:
您可以添加
answer < "a" || answer > "d"
之类的下限,但这仍将允许所有字符串 * 以 * 允许的字符之一开头,例如:要将答案限制为四个允许的值,必须将字符串与它们中的每一个进行比较。可以将这些比较组合在一起:
对允许值的数组使用循环:
检查数组是否包含答案:
或者使用正则表达式将
a
与d
进行匹配:请注意,如果
answer
* 介于a
和d
之间,则上述示例为真。您可以通过!(...)
求反该条件:或者使用
until
而不是while
:chhqkbe12#
你只有四个允许的输入。直接检查那些。即使像
if !(answer == "a" || answer == "b" ...
那样不优雅。其他任何输入都将接受一些无效的输入。特别是if answer > "d"
允许"ab"
作为有效的答案。6pp0gazn3#
其他答案已经回答了您问题标题中给出的问题。
我想建议您考虑采用以下代码的一些变体。
第一个
假设可能的答案如下。
然后
和
印刷品
这里我假设选项总是以
"a"
开头的连续字母,如果这个假设是正确的,就不需要手动将这些字母与可能的答案关联起来。现在让我展示一个与方法的可能对话(使用上面定义的
answers
)。将显示以下内容。
然后,您可以构造一个哈希数组,该数组提供问题、可能的答案、正确答案、可能的问题权重以及一个指示是否给出了正确答案的布尔值。
每个问题的
:correct_answer_given
值在回答问题时更新为true
或false
。一旦回答了所有问题,questions
就可以用于确定考试分数。如果你想给每个问题分配一个数字,你可以写
第一个
如果
question_number #=> 12
和然后