重置循环计数器

时间:2016-03-14 05:58:29

标签: ruby

如何更改下面的代码,以便当“BYE”连续三次在所有大写中被喊出时,它会退出代码? (否则计数器将重置为0。代码应该从任何单词的所有大写字母中退出,因此BYE必须是对此规则的排除。

puts "say something to grandma"
number = rand(1900..2015)

while true
  talking = gets.chomp
  talking.downcase

  puts "HUH?! SPEAK UP, SONNY!"

  if talking == talking.upcase
    puts "NO, NOT SINCE #{number + (1)}!"
    break
  end
end

3 个答案:

答案 0 :(得分:2)

您几乎在问题中描述了解决方案:添加一个检查用户是否键入BYE的条件。如果他们这样做,请在柜台加一个。如果计数器是3,break;否则使用next转到循环的顶部。如果他们没有键入BYE,请将计数器重置为0.

puts "say something to grandma"
number = rand(1900..2015)
counter = 0

while true
  talking = gets.chomp

  puts "HUH?! SPEAK UP, SONNY!"

  if talking == "BYE"
    counter += 1
    puts "You said 'BYE' #{counter} time(s)"
    break if counter >= 3
    next
  end

  counter = 0

  if talking == talking.upcase
    puts "NO, NOT SINCE #{number + 1}!"
    break
  end
end

一些注意事项:

  1. 您会注意到我删除了talking.downcase。它没有做任何事情。我怀疑你打算使用downcase!来修改字符串(而downcase返回一个新的字符串,你没有做任何事情),但这会破坏代码(因为条件会永远不会是真的。)

  2. 而不是while trueloop do在Ruby中更具惯用性。

  3. 您可能想测试用户是否输入了任何内容,因为"" == "".upcasetrue

答案 1 :(得分:0)

我的代码中没有看到任何计数器。 如果要在“BYE”连续重复counter次时退出循环,则需要有一个计数器。所以我添加了从0开始的变量0,并且每次都会重置为3,调用“BYE”以外的单词。 如果它到达puts "say something to grandma" number = rand(1900..2015) counter = 0 while true talking = gets.chomp talking.downcase puts "HUH?! SPEAK UP, SONNY!" if talking == "BYE" counter += 1 elsif talking == talking.upcase counter = 0 puts "NO, NOT SINCE #{number + (1)}!" break else counter = 0 end if counter == 3 break end end 或者如果用户写了其他大写单词,它将从循环中断开,就像在原始脚本中一样。

    protected void GridView_SelectedIndexChanged(object sender, EventArgs e){
string value = null;
value = GridView1.SelectedRow.Cells(2).Text.ToString();
}

答案 2 :(得分:0)

为了明白计数器是如何工作的,也许你可以使用每次用户回答counter时填充'BYE'的数组'BYE'。如果用户回答 'BYE'以外的任何counter将重置为[]。基本上三个'BYE'的行由数组counter = ['BYE', 'BYE', 'BYE']表示。

代码可能是这样的:

counter =  []
while counter != ['BYE', 'BYE', 'BYE']
  puts "You're in a room with Deaf Grandma. Say something to her"
  a = gets.chomp

  if a == 'BYE'
    counter << 'BYE'
  elsif a == a.upcase
    r = rand(21) + 1930 
    puts 'NO, NOT SINCE ' + r.to_s + '!'
    counter = []
  else
    puts 'HUH?! SPEAK UP, SONNY!'
    counter = []
  end

end

请注意以上代码中的这一行:

while counter != ['BYE', 'BYE', 'BYE']

这确保while循环保持运行 counter数组 NOT 等于['BYE', 'BYE', 'BYE']。因此,如果counter等于[]['BYE']['BYE', 'BYE'],则while循环会继续运行。它仅在counter = ['BYE', 'BYE', 'BYE']时停止。