Ruby中的决策错误

问题描述 投票:0回答:2

我被困在决策过程中。当answer变量为N当我键入N表示我不想在不同的行中打印文本)和marks变量为Y当我键入Y时,表示我不想打印带引号的文本),我收到消息:答案'Y'是无效的。程序正在终止。这是代码:

def multiFunctionalPrinter 
    puts "How many times do you want to print?"
    number = gets
    puts "-------------------------------------------"
    puts "What do you want to print?"
    text = gets.chomp                                                    #chomping variable to format it for decision making
    puts "-------------------------------------------"
    puts "Do you want to print in different lines (Y or N)?"
    answer = gets.chomp                                                  #chomping variable to format it for decision making
    puts "-------------------------------------------"
    puts "Do you want to add quotation marks (') (Y or N)?"
    marks = gets.chomp                                                   #chomping variable to format it for decision making

    if answer == "Y" && marks == "Y"                                     # Different lines: ON , Quotation marks: ON
        1.upto(number.to_i) {puts "'" + text.to_s + "'"}
    elsif answer == "Y" && marks == "N"                                  # Different lines: ON , Quotation marks: OFF
        1.upto(number.to_i) {puts text.to_s}
    elsif answer == "Y" && marks != "Y" || marks != "N"                  # Different lines: ON , Quotation marks: INVALID
        puts "Answer '#{marks}' is invalid. Program is terminating."
    elsif answer == "N" && marks == "Y"                                  # Different lines: OFF , Quotation marks: ON
        puts "Do you want to split what you print? (Y or N)"
        answer2 = gets.chomp
        if answer2 == "Y"                                                # Split: ON 
            1.upto(number.to_i) {print "'" + text.to_s + "' "}
            print "\n"
        elsif answer2 == "N"                                             # Split: OFF
            1.upto(number.to_i) {print "'" + text.to_s + "'"}
        else
            puts "Answer '#{answer2}' is invalid. Program is terminating."
        end 
    elsif answer == "N" && marks == "N"                                  # Different lines: OFF , Quotation marks: OFF
        puts "Do you want to split what you print? (Y or N)"
        answer2 = gets.chomp
        if answer2 == "Y"                                                # Split: ON
            1.upto(number.to_i) {print text.to_s + " "}
        elsif answer2 == "N"                                             # Split: OFF
            1.upto(number.to_i) {print text.to_s}
        else
            puts "Answer '#{answer}' is invalid. Program is terminating."
        end 
    else
        puts "Answer '#{answer}' or '#{marks}' is invalid. Program is terminating."
    end 
    puts "--------------------------------------------"
end 

multiFunctionalPrinter

我在做什么错?

ruby
2个回答
1
投票

二进制运算符&&的优先级高于||。这意味着该行:

answer == "Y" && marks != "Y" || marks != "N"

相当于

(answer == "Y" && marks != "Y") || marks != "N"

因此,只要marks"N"不同,该语句就成立。


您应该解决的问题是添加一堆括号。

answer == "Y" && (marks != "Y" || marks != "N")

0
投票

逻辑问题在此行上:

elsif answer == "Y" && marks != "Y" || marks != "N" 

您的脚本希望立即查看(答案==“ Y” &&标记!=“ Y”)||标记!=“ N”。它在到达and语句之前先评估and语句,并且因为答案为“ N”且标记为“ Y”(答案==“ Y” &&标记!=“ Y”)的结果为true。

您想在or表达式两边加上括号,因此上一行将变为:

elsif answer == "Y" && (marks != "Y" || marks != "N")

并且程序应该按照您的想法工作。

© www.soinside.com 2019 - 2024. All rights reserved.