下面的小貼士能夠在你們寫分支程序中有所幫助掌实,同時也能運(yùn)用在其他的流程控制中:
循環(huán)Loop
我們經(jīng)常想讓電腦一遍又一遍得做相同的事--畢竟這正是電腦被認(rèn)為所擅長的。
當(dāng)你告訴你的電腦保持重復(fù)做某事時邦马,你也需要告訴它在何時停止做這件事。電腦從來不會為重復(fù)做某事而感到厭煩的滋将,如果不告訴它何時停止它就會無限重復(fù)這件事。在告訴電腦在某個特定條件是真時重復(fù)程序中某部分時耕渴,我們也要確保它不會無限重復(fù)下去拘悦。這與if條件語句很相似:
command = ''
while command != 'bye'
puts command
command = gets.chomp
end
puts 'Come again soon!'
上面就是一個循環(huán)(你可能注意到在輸出的開頭有一個空行础米,這是在我們輸入數(shù)據(jù)前程序的第一個輸出。你可以試試如何修改程序來去除第一行添诉,你的程序是不是能像上面程序一樣成功運(yùn)行?)
循環(huán)能夠讓我們做各種有趣的事栏赴,你們能想到的都能做到。然而如果你寫的程序有錯誤循環(huán)程序就會產(chǎn)生問題须眷,如果電腦運(yùn)行程序進(jìn)入了無限循環(huán)怎么辦竖瘾?不用太擔(dān)心花颗,如果你認(rèn)為程序已經(jīng)進(jìn)入無限循環(huán),你只需要同時按下Ctrl和C鍵就可以扩劝。
在我們開始學(xué)習(xí)循環(huán)前职辅,我們先學(xué)習(xí)一點(diǎn)其他的內(nèi)容來使后面的學(xué)習(xí)更加容易一些。
一點(diǎn)邏輯知識
讓我們再回顧一下我們第一個分支程序聂示。假如我妻子回到家看到這個程序跑了一下程序,程序沒有告訴她有一個美麗可愛的名字鱼喉?好吧……可能她不一定太在乎這個秀鞭,但是我在乎翱盖荨!因此讓我們重寫一下:
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
運(yùn)行無誤……但并不太完美旋圆。有什么問題嗎?好吧灵巧,我在這些年的編程中學(xué)到的最好的規(guī)則是DRY規(guī)則:不要重復(fù)你自己2蠼谩( Don't Repeat Yourself)我甚至可以寫一本討論DRY規(guī)則為什么如此有效的書刻肄。在我們的程序中我們重復(fù)寫了兩遍'What a lovely name!'的命令,你可能會問這樣也不太重要吧敏弃?好吧,假如我第二遍寫的過程中有拼寫錯誤呢麦到?假如我想將兩行中的‘lovely’都改成‘beautiful’呢绿饵?要知道我很懶的瓶颠,因此如果我想要程序在遇到‘Chris’或‘Katy’時做相同的事,它的確應(yīng)該運(yùn)行下面相同的命令:
puts 'Hello, what\'s your name?'
name = gets.chomp
puts 'Hello, ' + name + '.'
if (name == 'Chris' or name == 'Katy')
puts 'What a lovely name!'
end
完美粹淋!上面程序中為了使程序順利運(yùn)行我用到了or這個邏輯運(yùn)算符,還有兩個邏輯運(yùn)算符是and和not.當(dāng)用到它們時最明智的做法是與括號一起用桃移,下面讓我們來看看它們是如何使用的:
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 )
其中可能騙到你的是or這個運(yùn)算符。在英語中我們通常用or表示“這一個或者那一個借杰,但不包含兩個”过吻。比如你媽媽說:“你可以吃pie或者cake作為餐后甜點(diǎn).”她并不是說你可以兩個都做甜點(diǎn)一起吃掉第步!但是在計(jì)算機(jī)中用or表示“這一個或者那一個,或者兩個都包含”(或者說至少包含一個)粘都,這樣來看計(jì)算機(jī)比你們的媽媽寬容多了廓推。
牛刀小試
寫一個程序來輸出經(jīng)典歌曲“99 bottles of beer”的歌詞
寫一個聾外婆的程序:不論你對外婆說什么(不論你鍵入什么內(nèi)容)她總會用“HUH?! SPEAK UP, SONNY!”回應(yīng)翩隧,除非你大聲對她說(鍵入的內(nèi)容都大寫);當(dāng)你大聲說外婆能夠聽見你(至少她自己認(rèn)為能聽到)然后回應(yīng)“NO, NOT SINCE 1938!”為了使程序更加可信堆生,每次外婆都會說出不同的年份,可以是1930至1950年中隨機(jī)的一年(這部分是可選的淑仆,如果你在天外有天(4)數(shù)字迷宮中學(xué)了隨機(jī)數(shù)會相對容易解決)涝婉。你只能喊出‘BYE’才能結(jié)束和外婆的對話蔗怠。
提示1
:不要忘了chomp!‘BYE’加上回車與‘BYE’是不同的
提示2
:試著想清楚你的程序應(yīng)該在哪部分開始循環(huán)寞射,這部分應(yīng)該在while
循環(huán)中擴(kuò)展你的聾外婆程序:假如你的外婆不想你離開怎么辦渔工?當(dāng)你喊‘BYE’嚷掠,她可能假裝沒聽見你兄渺。修改一下你的程序使你不得不一次性喊3次。測試你的程序確保如果你喊3次但不是在一行旺韭,你應(yīng)該仍然和你外婆聊著天掏觉。
寫一個閏年程序:這個程序?qū)柲阋粋€開始年份和結(jié)束年份,之后它會輸出之間的閏年(如果開始和結(jié)束年份也是閏年的話履腋,也要輸出來)珊燎。閏年是年份可以被4整除的(比如1984和2004)遵湖,但能夠被100整除的年份不是閏年(比如1800和1900)除非它們能被400整除(比如1600和2000是閏年)。(這里有些許讓人困惑延旧,但是還比不上存在著7月是冬天這樣讓人困惑的事谋国,而這確實(shí)會發(fā)生)
當(dāng)你完成了這些程序迁沫,讓自己放松一下捌蚊!你已經(jīng)學(xué)了許多,祝賀你近弟!你會驚訝于你已經(jīng)可以讓電腦去做如此多的事情了!再學(xué)習(xí)幾個章節(jié)祷愉,你就能夠編出任何程序了窗宦,這是真的二鳄!回顧一下你能夠?qū)懙乃谐绦颍F(xiàn)在你已經(jīng)離不開循環(huán)和分支程序了订讼。
下期我們將了解一種新的對象陣列髓窜,它對于處理其他對象的列表很有幫助欺殿。