6(2)歧路好风光 兜兜又转转
下面的小贴士能够在你们写分支程序中有所帮助,同时也能运用在其他的流程控制中:
循环Loop
我们经常想让电脑一遍又一遍得做相同的事--毕竟这正是电脑被认为所擅长的。
当你告诉你的电脑保持重复做某事时,你也需要告诉它在何时停止做这件事。电脑从来不会为重复做某事而感到厌烦的,如果不告诉它何时停止它就会无限重复这件事。在告诉电脑在某个特定条件是真时重复程序中某部分时,我们也要确保它不会无限重复下去。这与if条件语句很相似:
command = ''
while command != 'bye'
puts command
command = gets.chomp
end
puts 'Come again soon!'
上面就是一个循环(你可能注意到在输出的开头有一个空行,这是在我们输入数据前程序的第一个输出。你可以试试如何修改程序来去除第一行,你的程序是不是能像上面程序一样成功运行?)
循环能够让我们做各种有趣的事,你们能想到的都能做到。然而如果你写的程序有错误循环程序就会产生问题,如果电脑运行程序进入了无限循环怎么办?不用太担心,如果你认为程序已经进入无限循环,你只需要同时按下Ctrl和C键就可以。
在我们开始学习循环前,我们先学习一点其他的内容来使后面的学习更加容易一些。
一点逻辑知识
让我们再回顾一下我们第一个分支程序。假如我妻子回到家看到这个程序跑了一下程序,程序没有告诉她有一个美丽可爱的名字?好吧……可能她不一定太在乎这个,但是我在乎啊!因此让我们重写一下:
puts 'Hello, what\'s your name?'
name = gets.chomp
puts 'Hello, ' + name + '.'
if name == 'Chris'
puts 'What a lovely name!'
else
if name == 'Katy'
puts 'What a lovely name!'
end
end
运行无误……但并不太完美。有什么问题吗?好吧,我在这些年的编程中学到的最好的规则是DRY规则:不要重复你自己!( Don't Repeat Yourself)我甚至可以写一本讨论DRY规则为什么如此有效的书。在我们的程序中我们重复写了两遍'What a lovely name!'的命令,你可能会问这样也不太重要吧?好吧,假如我第二遍写的过程中有拼写错误呢?假如我想将两行中的‘lovely’都改成‘beautiful’呢?要知道我很懒的,因此如果我想要程序在遇到‘Chris’或‘Katy’时做相同的事,它的确应该运行下面相同的命令:
puts 'Hello, what\'s your name?'
name = gets.chomp
puts 'Hello, ' + name + '.'
if (name == 'Chris' or name == 'Katy')
puts 'What a lovely name!'
end
完美!上面程序中为了使程序顺利运行我用到了or这个逻辑运算符,还有两个逻辑运算符是and和not.当用到它们时最明智的做法是与括号一起用,下面让我们来看看它们是如何使用的:
iAmChris = true
iAmPurple = false
iLikeFood = true
iEatRocks = false
puts (iAmChris and iLikeFood)
puts (iLikeFood and iEatRocks)
puts (iAmPurple and iLikeFood)
puts (iAmPurple and iEatRocks)
puts
puts (iAmChris or iLikeFood)
puts (iLikeFood or iEatRocks)
puts (iAmPurple or iLikeFood)
puts (iAmPurple or iEatRocks)
puts
puts (not iAmPurple)
puts (not iAmChris )
output
其中可能骗到你的是or这个运算符。在英语中我们通常用or表示“这一个或者那一个,但不包含两个”。比如你妈妈说:“你可以吃pie或者cake作为餐后甜点.”她并不是说你可以两个都做甜点一起吃掉!但是在计算机中用or表示“这一个或者那一个,或者两个都包含”(或者说至少包含一个),这样来看计算机比你们的妈妈宽容多了。
牛刀小试
-
写一个程序来输出经典歌曲“99 bottles of beer”的歌词
-
写一个聋外婆的程序:不论你对外婆说什么(不论你键入什么内容)她总会用“HUH?! SPEAK UP, SONNY!”回应,除非你大声对她说(键入的内容都大写);当你大声说外婆能够听见你(至少她自己认为能听到)然后回应“NO, NOT SINCE 1938!”为了使程序更加可信,每次外婆都会说出不同的年份,可以是1930至1950年中随机的一年(这部分是可选的,如果你在天外有天(4)数字迷宫中学了随机数会相对容易解决)。你只能喊出‘BYE’才能结束和外婆的对话。
提示1
:不要忘了chomp!‘BYE’加上回车与‘BYE’是不同的
提示2
:试着想清楚你的程序应该在哪部分开始循环,这部分应该在while
循环中 -
扩展你的聋外婆程序:假如你的外婆不想你离开怎么办?当你喊‘BYE’,她可能假装没听见你。修改一下你的程序使你不得不一次性喊3次。测试你的程序确保如果你喊3次但不是在一行,你应该仍然和你外婆聊着天。
-
写一个闰年程序:这个程序将问你一个开始年份和结束年份,之后它会输出之间的闰年(如果开始和结束年份也是闰年的话,也要输出来)。闰年是年份可以被4整除的(比如1984和2004),但能够被100整除的年份不是闰年(比如1800和1900)除非它们能被400整除(比如1600和2000是闰年)。(这里有些许让人困惑,但是还比不上存在着7月是冬天这样让人困惑的事,而这确实会发生)
当你完成了这些程序,让自己放松一下!你已经学了许多,祝贺你!你会惊讶于你已经可以让电脑去做如此多的事情了!再学习几个章节,你就能够编出任何程序了,这是真的!回顾一下你能够写的所有程序,现在你已经离不开循环和分支程序了。
下期我们将了解一种新的对象阵列,它对于处理其他对象的列表很有帮助。