【blockly教程】第五章 循環結構

在這里,我們將介紹一個新游戲--Pond Tutor

在Pond Tutor(https://blockly-games.appspot.com/pond-tutor)這個游戲中,我們將扮演黃色的鴨子,通過不斷的發炮彈去攻擊紅色的鴨子,當紅色的鴨子血條減為0時則玩家獲勝。
在這個游戲中為我們提供了四個功能模塊:
Swim模塊:向給定方向游動;
Scan模塊:向給定方向掃描,掃描到敵方時返回二者相距的距離;
Cannon模塊:向給定方向和距離發射炮彈;
Stop模塊:配合swim模塊,使我方停止。
通過結合這幾個模塊,我們可以想到:首先我們需要朝敵方游動,同時不斷的進行掃描;當掃描到敵方時,我們應該停止,同時用掃描到的距離設定炮口的攻擊距離。
這里唯一的問題是如何重復不斷的進行掃描,所以也就牽出了我們接下來要講的問題--循環。

?循環是一種基本的程序結構,凡是需要通過不斷重復執行才能得到答案的許多問題中需要用到循環控制。循環結構是結構化程序設計的基本結構之一,它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。因此熟練掌握選擇結構和循環結構的概念及使用是程序設計的最基本的要求。本章將介紹四種形式的循環,都是程序中基本的用于表示重復動作的結構。在本章學習結束后,學生應當具備的能力有:分析一個循環的重復執行次數和終止條件,并能在自己的程序中應用到重復次數,重復,步長,列表循環循環。

5.1 基本概念

迭代:通過包括重復序列允許通過一個簡短的程序來代替一系列的重復的步驟程序中重復執行的一段指令叫做循環。
每一個循環由兩部分組成:
條件: 控制循環重復次數 ?循環體: 循環執行時始終運行的代碼段。 ?我們稱一個無休止運行的程序為死循環,下圖所示的就是一個典型的死循環塊。死循環將會阻止一個程序完成其執行,所以含有死循環的程序通常是不可取的。 在瀏覽器內,一個死循環甚至可以導致程序對鼠標點擊失去響應或無限輸出對話框,因此要避免出現死循環,控制循環執行次數的程序必須編寫正確。

5.2 重復次數模塊

?重復次數模塊用來實現計數循環,通過在模塊中修改次數來規定重復執行的次數。

例如我們要循環三次輸出“Hello World”,則只要在重復次數模塊的數字塊中寫入“3”即可。

5.3 重復模塊

重復模塊中包含了兩種不同類型的循環模式:重復-當和重復-直到。

重復-當模塊用來實現“當型”循環結構,只要程序的執行條件為真,就會重復執行語句的一系列程序。在未運行前,實際的重復次數是未知的。

?它需要與邏輯語句組合使用,當條件滿足時它將重復不斷的執行直到條件不滿足,所以可能出現的情況是:由于一個邏輯錯誤,循環將相應代碼段重復運行無數次,這對初學者來說是很常見的。
當檢查一個循環條件時循環將會執行。如果循環條件為真,將執行循環體中的代碼并重復執行這些步驟,在每次循環前將額外檢查循環條件。條件為假時退出循環。
循環程序都包涵了三個內容:
一個清晰的起始條件
一個循環條件,指示程序是否應該繼續執行循環部分
*一個條件改變最終導致循環條件變為假。
例如,我們使用重復-當模塊來實現一個非常常見的問題:從1一直加到100。對于這問題同學們一定不陌生,甚至能有多種不同的技巧去解這個問題。但在這里,我們使用循環就可以用最笨的方法:從1一個一個的加起來,一直加到100。

?而對于重復-直到這個模塊來說則與重復-當模塊剛好相反:它是當條件滿足時就結束循環。

?所以同樣針對上面從1加到100的例子,我們只需要將條件i<=100改為i>100即可。

5.4 步長循環模塊

?步長循環模塊使用最為靈活,不僅可以用于循環次數已經確定的情況,而且可以用于循環次數不確定而只給出循環結束條件的情況,它完全可以替代重復模塊。

?在固定增量下有著固定循環次數的一段程序使用步長循環模塊為宜。下面的循環將輸出三次單詞“Hello”。

?如果你已經接觸過一些高級程序設計語言如:C/C++/Java等,你會發現步長循環模塊其實就是其中的For循環語句。
?步長循環模塊中“使用”后的k為循環的控制變量,這個k可以自己命名并且可以在循環塊內充當變量使用;“從范圍”后的數字代表循環控制變量k的初始值;“到”后的數值表示循環的結束條件:當k大于這個值時退出循環;“每隔”后的數字為k的步長,表示每循環一次,k增加多少。以上所有的數值都是可以根據自己的實際需要進行修改的。
?下面我們大家都很熟悉的一道應用題來使用步長模塊:一球從100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地時,共經過多少米?第10次反彈多高?

?在這里我們并沒有從第一次下落開始就使用循環,而是以落點-上升-落點為過程進行的,由于落點-上升這一過程與上升-落點的過程所經過的距離相同,所以總路程直接加二倍的反彈距離;而反彈距離直接除2即可直接變為原來的一半。

5.5 列表循環模塊

?列表循環模塊是對列表(list)中每一個元素進行循環迭代的模塊,也可以稱為是對列表元素的遍歷。所謂列表,是相同數據類型的元素按一定順序排列的集合。使用列表循環模塊的循環在達到列表的最后一個值后將自動結束。所以使用列表循環模塊是不太可能錯誤地寫成死循環的,或許唯一可以的方式是為循環使用一個含有無限元素的列表!

如下圖所示,通過使用列表循環模塊可以輸出列表numList中的每一個元素。

?雖然使用重復、步長模塊也能實現循環輸出每一個元素,但用這種方法不但需要知道列表的長度,而且無法像列表循環模塊一樣直接就定義好了變量去代表列表的元素。
例如求一個列表中的最大元素,我們可以用列表循環模塊來實現:

在這里我們定義了一個變量tmp去保存最大的值,將tmp初始化為0保證tmp剛開始為最小,之后用列表循環模塊循環拿出列表中的元素不斷的與tmp相比較,一旦當前值大于tmp則修改tmp為這個值。最終在tmp中的值將是最大的值。

5.6 中斷/繼續模塊

?中斷模塊可以用來從循環體內跳出循環體,即提前結束循環,接著執行循環下面的語句。

?中斷模塊適用于當我們不知道循環次數,只有在程序執行過程中滿足一定條件的情況下要結束循環的時候。
我們現在嘗試使用循環和中斷模塊來寫一個程序:輸入一個數,判斷這個數是否為素數。

?在這里我們讓m被2到根號m除,如果m能被2到根號m之中的任何一個整數整除,則提前結束循環,此時i必然小于或等于k(即根號m);如果m不能被2到k(即根號m)之間的任一整數整除,則在完成最后一次循環后,i還要加1,因此i=k+1,然后才終止循環。在循環之后判別i的值是否大于或等于k+1,若是,則表明未曾被2到k之間任一整數整除過,因此輸出“是素數”。
?繼續模塊其作用為結束本次循環,即跳過循環體中下面尚未執行的語句,接著進行下一次是否執行循環的判定。

?繼續模塊與中斷模塊的區別是:繼續模塊只結束本次循環,而不是終止整個循環的執行。而中斷模塊則是結束整個循環過程,不再判斷執行循環的條件是否成立。
如把100-200之間的不能被3整除的數輸出來:

當n能被3整除時,執行繼續模塊,結束本次循環(即跳過print模塊),只有n不能被3整除時才執行print模塊輸出數字。

5.7 嵌套循環

一個循環體內又包含另一個完整的循環結構,稱為循環的嵌套。內嵌的循環中還可以嵌套循環,這就是多層循環。各種語言中關于循環的嵌套的概念都是一樣的。
四種循環(重復次數,重復,步長,列表循環)可以互相嵌套,當循環嵌套在循環中,一個程序可以創建一個重復的重復。

5.7.1 內循環和外循環

當使用嵌套循環時,內外循環扮演著不同的角色:
外循環是先開始后結束的運行順序。它在程序運行中開始一次結束一次。內循環是比外循環后開始先結束的運行。它可以反復地重復運行。
內循環快速運行,每一次外循環,都會完成一個完整的內循環。外循環循環的偏慢。
內部和外部的循環類似時鐘指針的運轉。例如,一個時鐘的秒針就像內部循環同時分針就像外循環.對于每一次分針的轉動,秒針都需要轉一圈,轉動60整秒.當分針轉動一整個小時時,秒針將轉動60*60 = 3600秒。里程表和日歷的都是用這樣相似的工作方式。

5.7.2 非獨立的內循環

?有時,內部循環的工作方式取決于外部循環的哪一步運行。例如,創建一個程序打印在一年中所有的日期,您可以使用嵌套循環去打印月份的每天,但內部循環的次數取決于外部循環,這是因為每個月有不同的天數。

?在這里,內部循環重復的是不同的次數,這取決于它在哪個月份上,因為它的結束條件是 j<days[i].
對于月份,我們繪制了一個依賴于存放每一月的天數的數組的內循環,但是對于給一個非獨立內循環構思一個規則需要更加的泛化:這樣一個程序員需要考慮使用的特殊情況,同時要嘗試泛化這個規則。
由于內部循環和外部循環的關系,嵌套循環可以使具有挑戰性的程序正確。設計嵌套循環的一個很好的策略是在一個例子中仔細地找出你想要的運行效果,然后找到一個方法來歸納它。

課后練習

?1. 寫一個判斷素數的函數,在主函數輸入一個整數,輸出是否是素數。
2. 設計定義一個自己的工具塊。
3. 編寫函數,給出年、月、日,計算該日是該年的第n天,并嘗試將其導出的代碼在其他語言環境中調試運行。

知識梳理

轉載于:https://www.cnblogs.com/scratch8/p/9637243.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451333.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據的PB級別是什么?

PB是數據存儲容量的單位&#xff0c;它等于2的50次方個字節&#xff0c;或者在數值上大約等于1000個TB。”一提到數據量級&#xff0c;人們通常會聯想到美國國會圖書館&#xff0c;德勤、麥肯錫、IBM、Gartner和移動廣告公司。Adfonic的數據專家向TechTarget記者介紹了PB級數據…

js 獲取字符串最后一位的4種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 方法一&#xff1a;運用String對象下的charAt方法 charAt() 方法可返回指定位置的字符。 復制代碼代碼如下:str.charAt(str.length – …

360董事長周鴻祎跨足手機市場是福還是禍?

編者按&#xff1a;奇虎360董事長周鴻祎做的這個“思考了半年”的決定&#xff1a;進軍智能手機&#xff0c;是于5月4日夜10時45分。他所發布新浪微博稱&#xff1a;“現在每個人都想擁有高性能的智能手機&#xff0c;高富帥白富美人手一iPhone&#xff0c;難道吊絲只能買便宜低…

3 .6 .5 優化Ad-Hoc工作負載

執行計劃生成后會存儲在plan cache中&#xff0c;以便重用&#xff0c;如果計劃緩存從來都沒有被重用 過&#xff0c;將會造成內存資源的浪費&#xff0c;這有可能是由于非參數化的Ad-hoc (即席查詢&#xff09;引起的。 當執行代碼時&#xff0c;會產生一個hash值&#xff0c;…

LightOJ - 1422 (區間DP)

題意&#xff1a;有t組數據&#xff0c;對于每組&#xff0c;有n個聚會需要參加&#xff0c;下面依次是參加各個聚會需要的衣服編號&#xff0c;要求所需要的衣服一定穿在外面&#xff0c;在操作的時候&#xff0c;可以選擇穿上一件衣服或脫下一件衣服&#xff0c;脫下的衣服不…

python判斷字典,列表,元組為空的方法。

m1 []m2 ()m3 {}判斷他們為空的方法是什么&#xff1f; if m1:非空else:空if not m2: 空 else:非空False,0,,[],{},()都可以視為假

解決 JSP 頁面報錯 equal symbol expected

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.報錯&#xff1a;org.apache.jasper.JasperException: /WEB-INF/jsp/op/settlement/spRateModify.jsp(368,110) equal symbol expecte…

表單隱藏域與display:none

有時候前端進行表單填寫是分步驟的&#xff0c;每一步的時候其他步驟相關的表單視圖不可見&#xff1b; 針對"不可見"&#xff0c;以下有兩種處理方式&#xff1a; ①display&#xff1a;none 這種方式呢&#xff0c;比較簡單&#xff0c;就是將三個步驟分3個div&…

視頻領域的Instagram:Viddy用戶突破2600萬

北京時間5月9日消息&#xff0c;據TheNextWeb報道&#xff0c;視頻分享應用Viddy的注冊用戶數量已經達到2600萬&#xff0c;而上個月的用戶數量還是650萬。日均增長用戶超過50萬&#xff0c;成績斐然&#xff0c;投資者對Viddy目前的增長表示很滿意。 Viddy是如何達到這樣的成…

log 的 debug()、 error()、 info()方法的區別

軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志&#xff0c;不管用什么&#xff0c;這些東東大多是大同小異的&#xff0c;一般都提供了這樣5個日志級別&#xff1a; Debug Info Warn Error Fatal 一個等級比一個高&#xff0c;但…

存儲容量(空間)換算公式(B、KB、MB、GB、TB、PB、EB)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 <strong>存儲容量&#xff1a;是該存儲設備上可以存儲數據的最大數量&#xff0c;通常使用千字節&#xff08;kb kilobyte&#x…

如何防止表單的重復提交

表單重復提交是在多用戶Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重復提交問題&#xff0c;比如&#xff1a; (1)點擊提交按鈕兩次。 (2)點擊刷新按鈕。 (3)使用瀏覽器后退按鈕重復之前的操作&#xff0c;導致重復提交表單。 (4)使用瀏覽器歷史記錄重…

GDB調試精粹及使用實例

一&#xff1a;列文件清單 1&#xff0e; List (gdb) list line1,line2 二&#xff1a;執行程序 要想運行準備調試的程序&#xff0c;可使用run命令&#xff0c;在它后面可以跟隨發給該程序的任何參數&#xff0c;包括標準輸入和標準輸出說明符(<和>)和外殼通配符&a…

如何使用log.debug()

log4j是一個開源的日志&#xff0c;共分為六個等級&#xff1a;LOG、DEBUG、INFO、WARN、ERROR、和FATAL。 DEBUG是其中的一種日志級別。一般我們用這個方法的時候都是這樣的&#xff1a; if(log.isDebugEnabled()){log.debug("debug&#xff01;"); } 意思是&am…

寫給大數據開發初學者的話

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 導讀&#xff1a; 第一章&#xff1a;初識Hadoop 第二章&#xff1a;更高效的WordCount第三章&#xff1a;把別處的數據搞到Hadoop上第…

2018年7月份,python上傳自己的包庫到pypi官網的方法

最近pypi官網進行了更新&#xff0c;老的上傳網址作廢了。記錄下上傳到pypi的方法 0、去pypi官網注冊賬號&#xff0c;沒賬號是不可能上傳的&#xff0c;想想也是那不亂套了嗎&#xff0c;注冊后會收到一個郵件需要點擊然后重新登錄 1、目錄就是這樣 &#xff0c;我要上傳muli…

linux系統C語言學習總結

引言   盡管 C 語言問世已近 30 年&#xff0c;但它的魅力仍未減退。C 語言繼續吸引著眾多的開發者&#xff0c;他們為了編寫、移植或維護應用程序而必須學習新技能。   本文是為了滿足對C語言初學者或想提高自身C語言修為的開發人員的需要而寫的。希望對您的學習和工作有…

redis 刪除操作

Redis 鍵(key) Redis 鍵命令用于管理 redis 的鍵。 語法 Redis 鍵命令的基本語法如下&#xff1a; redis 127.0.0.1:6379> COMMAND KEY_NAME 實例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1 在以上實例中 DEL 是…

寫給大數據開發初學者的話2

見 : http://lxw1234.com/archives/2016/11/782.htm 如果你已經按照《寫給大數據開發初學者的話》中第一章和第二章的流程認真完整的走了一遍&#xff0c;那么你應該已經具備以下技能和知識點&#xff1a; 0和Hadoop2.0的區別&#xff1b;MapReduce的原理&#xff08;還是那個…

Pandas的結構和應用

Pandas處理以下三個數據結構 - 系列(Series)----一維ndarray   特點&#xff1a;帶有標簽&#xff0c;可以使用標簽作為索引&#xff0c;大小不能改變&#xff0c;內部數據可以改變。 屬性&#xff1a;與NumPy類似&#xff0c;多了一個軸標簽axis lables 數據…