【blockly教程】第五章 循环结构
在這里,我們將介紹一個新游戲--Pond Tutor
在Pond Tutor(https://blockly-games.appspot.com/pond-tutor)這個游戲中,我們將扮演黃色的鴨子,通過不斷的發(fā)炮彈去攻擊紅色的鴨子,當(dāng)紅色的鴨子血條減為0時則玩家獲勝。
在這個游戲中為我們提供了四個功能模塊:
Swim模塊:向給定方向游動;
Scan模塊:向給定方向掃描,掃描到敵方時返回二者相距的距離;
Cannon模塊:向給定方向和距離發(fā)射炮彈;
Stop模塊:配合swim模塊,使我方停止。
通過結(jié)合這幾個模塊,我們可以想到:首先我們需要朝敵方游動,同時不斷的進(jìn)行掃描;當(dāng)掃描到敵方時,我們應(yīng)該停止,同時用掃描到的距離設(shè)定炮口的攻擊距離。
這里唯一的問題是如何重復(fù)不斷的進(jìn)行掃描,所以也就牽出了我們接下來要講的問題--循環(huán)。
?循環(huán)是一種基本的程序結(jié)構(gòu),凡是需要通過不斷重復(fù)執(zhí)行才能得到答案的許多問題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。因此熟練掌握選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的概念及使用是程序設(shè)計的最基本的要求。本章將介紹四種形式的循環(huán),都是程序中基本的用于表示重復(fù)動作的結(jié)構(gòu)。在本章學(xué)習(xí)結(jié)束后,學(xué)生應(yīng)當(dāng)具備的能力有:分析一個循環(huán)的重復(fù)執(zhí)行次數(shù)和終止條件,并能在自己的程序中應(yīng)用到重復(fù)次數(shù),重復(fù),步長,列表循環(huán)循環(huán)。
5.1 基本概念
迭代:通過包括重復(fù)序列允許通過一個簡短的程序來代替一系列的重復(fù)的步驟程序中重復(fù)執(zhí)行的一段指令叫做循環(huán)。
每一個循環(huán)由兩部分組成:
條件: 控制循環(huán)重復(fù)次數(shù) ?循環(huán)體: 循環(huán)執(zhí)行時始終運行的代碼段。 ?我們稱一個無休止運行的程序為死循環(huán),下圖所示的就是一個典型的死循環(huán)塊。死循環(huán)將會阻止一個程序完成其執(zhí)行,所以含有死循環(huán)的程序通常是不可取的。 在瀏覽器內(nèi),一個死循環(huán)甚至可以導(dǎo)致程序?qū)κ髽?biāo)點擊失去響應(yīng)或無限輸出對話框,因此要避免出現(xiàn)死循環(huán),控制循環(huán)執(zhí)行次數(shù)的程序必須編寫正確。
5.2 重復(fù)次數(shù)模塊
?重復(fù)次數(shù)模塊用來實現(xiàn)計數(shù)循環(huán),通過在模塊中修改次數(shù)來規(guī)定重復(fù)執(zhí)行的次數(shù)。
例如我們要循環(huán)三次輸出“Hello World”,則只要在重復(fù)次數(shù)模塊的數(shù)字塊中寫入“3”即可。
5.3 重復(fù)模塊
重復(fù)模塊中包含了兩種不同類型的循環(huán)模式:重復(fù)-當(dāng)和重復(fù)-直到。
重復(fù)-當(dāng)模塊用來實現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu),只要程序的執(zhí)行條件為真,就會重復(fù)執(zhí)行語句的一系列程序。在未運行前,實際的重復(fù)次數(shù)是未知的。
?它需要與邏輯語句組合使用,當(dāng)條件滿足時它將重復(fù)不斷的執(zhí)行直到條件不滿足,所以可能出現(xiàn)的情況是:由于一個邏輯錯誤,循環(huán)將相應(yīng)代碼段重復(fù)運行無數(shù)次,這對初學(xué)者來說是很常見的。
當(dāng)檢查一個循環(huán)條件時循環(huán)將會執(zhí)行。如果循環(huán)條件為真,將執(zhí)行循環(huán)體中的代碼并重復(fù)執(zhí)行這些步驟,在每次循環(huán)前將額外檢查循環(huán)條件。條件為假時退出循環(huán)。
循環(huán)程序都包涵了三個內(nèi)容:
一個清晰的起始條件
一個循環(huán)條件,指示程序是否應(yīng)該繼續(xù)執(zhí)行循環(huán)部分
*一個條件改變最終導(dǎo)致循環(huán)條件變?yōu)榧佟?br />例如,我們使用重復(fù)-當(dāng)模塊來實現(xiàn)一個非常常見的問題:從1一直加到100。對于這問題同學(xué)們一定不陌生,甚至能有多種不同的技巧去解這個問題。但在這里,我們使用循環(huán)就可以用最笨的方法:從1一個一個的加起來,一直加到100。
?而對于重復(fù)-直到這個模塊來說則與重復(fù)-當(dāng)模塊剛好相反:它是當(dāng)條件滿足時就結(jié)束循環(huán)。
?所以同樣針對上面從1加到100的例子,我們只需要將條件i<=100改為i>100即可。
5.4 步長循環(huán)模塊
?步長循環(huán)模塊使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以替代重復(fù)模塊。
?在固定增量下有著固定循環(huán)次數(shù)的一段程序使用步長循環(huán)模塊為宜。下面的循環(huán)將輸出三次單詞“Hello”。
?如果你已經(jīng)接觸過一些高級程序設(shè)計語言如:C/C++/Java等,你會發(fā)現(xiàn)步長循環(huán)模塊其實就是其中的For循環(huán)語句。
?步長循環(huán)模塊中“使用”后的k為循環(huán)的控制變量,這個k可以自己命名并且可以在循環(huán)塊內(nèi)充當(dāng)變量使用;“從范圍”后的數(shù)字代表循環(huán)控制變量k的初始值;“到”后的數(shù)值表示循環(huán)的結(jié)束條件:當(dāng)k大于這個值時退出循環(huán);“每隔”后的數(shù)字為k的步長,表示每循環(huán)一次,k增加多少。以上所有的數(shù)值都是可以根據(jù)自己的實際需要進(jìn)行修改的。
?下面我們大家都很熟悉的一道應(yīng)用題來使用步長模塊:一球從100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地時,共經(jīng)過多少米?第10次反彈多高?
?在這里我們并沒有從第一次下落開始就使用循環(huán),而是以落點-上升-落點為過程進(jìn)行的,由于落點-上升這一過程與上升-落點的過程所經(jīng)過的距離相同,所以總路程直接加二倍的反彈距離;而反彈距離直接除2即可直接變?yōu)樵瓉淼囊话搿?/p>
5.5 列表循環(huán)模塊
?列表循環(huán)模塊是對列表(list)中每一個元素進(jìn)行循環(huán)迭代的模塊,也可以稱為是對列表元素的遍歷。所謂列表,是相同數(shù)據(jù)類型的元素按一定順序排列的集合。使用列表循環(huán)模塊的循環(huán)在達(dá)到列表的最后一個值后將自動結(jié)束。所以使用列表循環(huán)模塊是不太可能錯誤地寫成死循環(huán)的,或許唯一可以的方式是為循環(huán)使用一個含有無限元素的列表!
如下圖所示,通過使用列表循環(huán)模塊可以輸出列表numList中的每一個元素。
?雖然使用重復(fù)、步長模塊也能實現(xiàn)循環(huán)輸出每一個元素,但用這種方法不但需要知道列表的長度,而且無法像列表循環(huán)模塊一樣直接就定義好了變量去代表列表的元素。
例如求一個列表中的最大元素,我們可以用列表循環(huán)模塊來實現(xiàn):
在這里我們定義了一個變量tmp去保存最大的值,將tmp初始化為0保證tmp剛開始為最小,之后用列表循環(huán)模塊循環(huán)拿出列表中的元素不斷的與tmp相比較,一旦當(dāng)前值大于tmp則修改tmp為這個值。最終在tmp中的值將是最大的值。
5.6 中斷/繼續(xù)模塊
?中斷模塊可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句。
?中斷模塊適用于當(dāng)我們不知道循環(huán)次數(shù),只有在程序執(zhí)行過程中滿足一定條件的情況下要結(jié)束循環(huán)的時候。
我們現(xiàn)在嘗試使用循環(huán)和中斷模塊來寫一個程序:輸入一個數(shù),判斷這個數(shù)是否為素數(shù)。
?在這里我們讓m被2到根號m除,如果m能被2到根號m之中的任何一個整數(shù)整除,則提前結(jié)束循環(huán),此時i必然小于或等于k(即根號m);如果m不能被2到k(即根號m)之間的任一整數(shù)整除,則在完成最后一次循環(huán)后,i還要加1,因此i=k+1,然后才終止循環(huán)。在循環(huán)之后判別i的值是否大于或等于k+1,若是,則表明未曾被2到k之間任一整數(shù)整除過,因此輸出“是素數(shù)”。
?繼續(xù)模塊其作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。
?繼續(xù)模塊與中斷模塊的區(qū)別是:繼續(xù)模塊只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。而中斷模塊則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。
如把100-200之間的不能被3整除的數(shù)輸出來:
當(dāng)n能被3整除時,執(zhí)行繼續(xù)模塊,結(jié)束本次循環(huán)(即跳過print模塊),只有n不能被3整除時才執(zhí)行print模塊輸出數(shù)字。
5.7 嵌套循環(huán)
一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。各種語言中關(guān)于循環(huán)的嵌套的概念都是一樣的。
四種循環(huán)(重復(fù)次數(shù),重復(fù),步長,列表循環(huán))可以互相嵌套,當(dāng)循環(huán)嵌套在循環(huán)中,一個程序可以創(chuàng)建一個重復(fù)的重復(fù)。
5.7.1 內(nèi)循環(huán)和外循環(huán)
當(dāng)使用嵌套循環(huán)時,內(nèi)外循環(huán)扮演著不同的角色:
外循環(huán)是先開始后結(jié)束的運行順序。它在程序運行中開始一次結(jié)束一次。內(nèi)循環(huán)是比外循環(huán)后開始先結(jié)束的運行。它可以反復(fù)地重復(fù)運行。
內(nèi)循環(huán)快速運行,每一次外循環(huán),都會完成一個完整的內(nèi)循環(huán)。外循環(huán)循環(huán)的偏慢。
內(nèi)部和外部的循環(huán)類似時鐘指針的運轉(zhuǎn)。例如,一個時鐘的秒針就像內(nèi)部循環(huán)同時分針就像外循環(huán).對于每一次分針的轉(zhuǎn)動,秒針都需要轉(zhuǎn)一圈,轉(zhuǎn)動60整秒.當(dāng)分針轉(zhuǎn)動一整個小時時,秒針將轉(zhuǎn)動60*60 = 3600秒。里程表和日歷的都是用這樣相似的工作方式。
5.7.2 非獨立的內(nèi)循環(huán)
?有時,內(nèi)部循環(huán)的工作方式取決于外部循環(huán)的哪一步運行。例如,創(chuàng)建一個程序打印在一年中所有的日期,您可以使用嵌套循環(huán)去打印月份的每天,但內(nèi)部循環(huán)的次數(shù)取決于外部循環(huán),這是因為每個月有不同的天數(shù)。
?在這里,內(nèi)部循環(huán)重復(fù)的是不同的次數(shù),這取決于它在哪個月份上,因為它的結(jié)束條件是 j<days[i].
對于月份,我們繪制了一個依賴于存放每一月的天數(shù)的數(shù)組的內(nèi)循環(huán),但是對于給一個非獨立內(nèi)循環(huán)構(gòu)思一個規(guī)則需要更加的泛化:這樣一個程序員需要考慮使用的特殊情況,同時要嘗試泛化這個規(guī)則。
由于內(nèi)部循環(huán)和外部循環(huán)的關(guān)系,嵌套循環(huán)可以使具有挑戰(zhàn)性的程序正確。設(shè)計嵌套循環(huán)的一個很好的策略是在一個例子中仔細(xì)地找出你想要的運行效果,然后找到一個方法來歸納它。
課后練習(xí)
?1. 寫一個判斷素數(shù)的函數(shù),在主函數(shù)輸入一個整數(shù),輸出是否是素數(shù)。
2. 設(shè)計定義一個自己的工具塊。
3. 編寫函數(shù),給出年、月、日,計算該日是該年的第n天,并嘗試將其導(dǎo)出的代碼在其他語言環(huán)境中調(diào)試運行。
知識梳理
轉(zhuǎn)載于:https://www.cnblogs.com/scratch8/p/9637243.html
總結(jié)
以上是生活随笔為你收集整理的【blockly教程】第五章 循环结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer重构二叉树 给出二叉树的前
- 下一篇: NSNull