第四章:程序的控制結(jié)構(gòu)

程序的流程圖

程序的流程圖


a程序的基本結(jié)構(gòu)


程序由三種基本結(jié)構(gòu)組成:

順序結(jié)構(gòu)

分支結(jié)構(gòu)

循環(huán)結(jié)構(gòu)

這些基本結(jié)構(gòu)都有一個(gè)入口和一個(gè)出口。任何程序都由這三種基本結(jié)構(gòu)組合而成。

1.,順序結(jié)構(gòu)是程序按照線性順序依次執(zhí)行的一種運(yùn)行方式。其中“語(yǔ)句塊1”和“語(yǔ)句塊2”表示一個(gè)或一組順序執(zhí)行的語(yǔ)句。

順序結(jié)構(gòu)

2.分支結(jié)構(gòu)是程序根據(jù)條件判斷結(jié)果而選擇不同向前執(zhí)行路徑的一種運(yùn)行方式。包括:

? ??????單分支結(jié)構(gòu)

????????二分支結(jié)構(gòu)

? ??????多分支結(jié)構(gòu)

分支結(jié)構(gòu)。

3.循環(huán)結(jié)構(gòu)是程序根據(jù)條件判斷結(jié)果向后反復(fù)執(zhí)行的一種運(yùn)行方式。根據(jù)循環(huán)體觸發(fā)條件不同,包括:

條件循環(huán)結(jié)構(gòu)

遍歷循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)


程序的基本結(jié)構(gòu)實(shí)例

IPO描述

IPO描述主要用于區(qū)分程序的輸入輸出關(guān)系,重點(diǎn)在于結(jié)構(gòu)劃分,算法主要采用自然語(yǔ)言描述。


輸入:圓半徑R

處理:

????????圓面積:S = π*R*R

????????圓周長(zhǎng):L = 2*π*R

輸出:

????????圓面積S、

????????周長(zhǎng)L


流程圖描述

流程圖描述側(cè)重于描述算法的具體流程關(guān)系,流程圖的結(jié)構(gòu)化關(guān)系相比自然語(yǔ)言描述更進(jìn)一步,有助于闡述算法的具體操作過(guò)程。

流程圖描述


Python代碼方式描述

Python代碼描述最終的程序產(chǎn)出,最為細(xì)致。

代碼方式描述


b、程序的分支結(jié)構(gòu)


Python中,if 語(yǔ)句的語(yǔ)法格式如下:

if 語(yǔ)句的語(yǔ)法格式??

語(yǔ)句塊是 if 條件滿足后執(zhí)行的一個(gè)或多個(gè)語(yǔ)句序列

語(yǔ)句塊中語(yǔ)句通過(guò)與 if 所在行形成縮進(jìn)表達(dá)包含關(guān)系

if語(yǔ)句首先評(píng)估<條件>的結(jié)果值

如果結(jié)果為True,則執(zhí)行語(yǔ)句塊里的語(yǔ)句序列,然后控制轉(zhuǎn)向程序的下一條語(yǔ)句。

如果結(jié)果為False,語(yǔ)句塊里的語(yǔ)句會(huì)被跳過(guò)。

然后Python依次評(píng)估尋找第一個(gè)結(jié)果為T(mén)rue的條件,執(zhí)行該條件下的語(yǔ)句塊,同時(shí)結(jié)束后跳過(guò)整個(gè)if-elif-else結(jié)構(gòu),執(zhí)行后面的語(yǔ)句。

如果沒(méi)有任何條件成立,else下面的語(yǔ)句塊被執(zhí)行。else子句是可選的。


If 語(yǔ)句中<條件>部分可以使用任何能夠產(chǎn)生True或False的語(yǔ)句--布爾表達(dá)式,為bool類型

對(duì)于數(shù)字(整型和浮點(diǎn)型):零值被認(rèn)為是false;任何非零值都是true

對(duì)于序列類型:一個(gè)空序列被解釋為false;而任何非空序列被解釋為true

布爾運(yùn)算符and(和)和or(或者)用于組合兩個(gè)布爾表達(dá)式,并產(chǎn)生一個(gè)布爾結(jié)果

not運(yùn)算符是一個(gè)一元運(yùn)算符,用來(lái)計(jì)算一個(gè)布爾表達(dá)式的反

優(yōu)先級(jí):從高分到低分依次是not、and最低是or


單分支結(jié)構(gòu)

單分支結(jié)構(gòu)

多分支結(jié)構(gòu)

多分支結(jié)構(gòu)


實(shí)例:身體質(zhì)量指數(shù)BMI

BMI的定義如下:

BMI = 體重(kg)÷身高2(m2)

例如:一個(gè)人身高1.75米、體重75公斤,他的BMI值為24.49。

BMI?

例一

例一

例二

例二


c、程序的循環(huán)結(jié)構(gòu)


break:終止此循環(huán)結(jié)構(gòu)

continue:終止本次循環(huán)


1.遍歷循環(huán):for語(yǔ)句

根據(jù)循環(huán)執(zhí)行次數(shù)的確定性,循環(huán)可以分為確定次數(shù)循環(huán)非確定次數(shù)循環(huán)。

確定次數(shù)循環(huán)(遍歷循環(huán))指循環(huán)體對(duì)循環(huán)次數(shù)有明確的定義,循環(huán)次數(shù)采用遍歷結(jié)構(gòu)中元素個(gè)數(shù)來(lái)體現(xiàn)。

Python通過(guò)保留字for實(shí)現(xiàn)“遍歷循環(huán)”:

for?<循環(huán)變量>?in? <遍歷結(jié)構(gòu)>:

???<語(yǔ)句塊>?

遍歷結(jié)構(gòu)可以是字符串、文件、組合數(shù)據(jù)類型或range()函數(shù):

遍歷循環(huán)還有一種擴(kuò)展模式,使用方法如下:

for <循環(huán)變量>

in <遍歷結(jié)構(gòu)>:

???<語(yǔ)句塊1>

else:

???<語(yǔ)句塊2>

當(dāng)for循環(huán)正常執(zhí)行之后,程序會(huì)繼續(xù)執(zhí)行else語(yǔ)句中內(nèi)容。else語(yǔ)句只在循環(huán)正常執(zhí)行之后才執(zhí)行并結(jié)束。

因此可以在<語(yǔ)句塊2>中放置判斷循環(huán)執(zhí)行情況的語(yǔ)句。

for

不執(zhí)行else,繼續(xù)循環(huán)


缺點(diǎn):

程序開(kāi)始時(shí)必須提供輸入數(shù)字總數(shù)

大規(guī)模數(shù)字求平均值需要用戶先數(shù)清楚個(gè)數(shù)

for循環(huán)是需要提供固定循環(huán)次數(shù)的循環(huán)方式

Python提供了另一種循環(huán)模式:無(wú)限循環(huán),不需要提前知道循環(huán)次數(shù),也叫條件循環(huán)


2.無(wú)限循環(huán):while語(yǔ)句

continue:跳出本次循環(huán)

無(wú)限循環(huán)(條件循環(huán))一直保持循環(huán)操作直到特定循環(huán)條件不滿足才結(jié)束,不需要提前知道確定循環(huán)次數(shù)。

Python通過(guò)保留字while實(shí)現(xiàn)無(wú)限循環(huán)。

Python通過(guò)保留字while實(shí)現(xiàn)無(wú)限循環(huán),使用方法如下:

while?<條件>:

<語(yǔ)句塊>

條件和if語(yǔ)句的判斷條件一樣,是布爾表達(dá)式。

語(yǔ)句塊是一條或多條語(yǔ)句。

條件總是在循環(huán)頂部被判斷,即在循環(huán)體(語(yǔ)句塊)執(zhí)行之前,這種結(jié)構(gòu)又被稱為前測(cè)循環(huán)。

無(wú)限循環(huán)也有一種使用保留字else的擴(kuò)展模式:

while?<條件>:

???<語(yǔ)句塊1>

else:

???<語(yǔ)句塊2>

如果循環(huán)體忘記累加計(jì)數(shù)器idx,條件判斷一直為真,循環(huán)體將一直執(zhí)行,這就是所謂的死循環(huán)程序

這時(shí)通常使用<Ctrl>+c來(lái)終止一個(gè)程序

continue


3.?continue和break

continue:跳出本次循環(huán)

break:終止此循環(huán)結(jié)構(gòu)

continue和break

4. 交互循環(huán)

交互式循環(huán)是無(wú)限循環(huán)的一種

允許用戶通過(guò)交互的方式重復(fù)程序的特定部分

以交互循環(huán)的視角重新審視求平均數(shù)程序,偽碼如下:

初始化sum為0

初始化count為0

初始化moredata為"yes"

當(dāng)moredata值為"yes"時(shí)

輸入數(shù)字x

將x加入sum

count值加1

詢問(wèn)用戶是否還有moredata需要處理

輸出


5. 哨兵循環(huán)

執(zhí)行循環(huán)直到遇到特定的值,循環(huán)語(yǔ)句才終止執(zhí)行的循環(huán)結(jié)構(gòu)設(shè)計(jì)方法

哨兵循環(huán)是求平均數(shù)的更好方案,思路如下:

設(shè)定一個(gè)哨兵值作為循環(huán)終止的標(biāo)志

任何值都可以做哨兵,但要與實(shí)際數(shù)據(jù)有所區(qū)別

偽碼如下:

接收第一個(gè)數(shù)據(jù)

while這個(gè)數(shù)據(jù)不是哨兵

程序執(zhí)行相關(guān)語(yǔ)句

接收下一個(gè)數(shù)據(jù)項(xiàng)

在求考試分?jǐn)?shù)平均數(shù)的程序中,可以設(shè)定負(fù)數(shù)為哨兵


6.文件循環(huán)

之前求平均數(shù)的數(shù)字都是用戶輸入的,如果幾百個(gè)數(shù)求平均,輸入困難且容易出錯(cuò)

面向文件的方法是數(shù)據(jù)處理的典型應(yīng)用

可以事先將數(shù)據(jù)錄入到文件中,然后將這個(gè)文件作為程序的輸入,避免人工輸入的麻煩,便于編輯修改


d、random庫(kù)的使用


random庫(kù)概述

隨機(jī)數(shù)在計(jì)算機(jī)應(yīng)用中十分常見(jiàn),Python內(nèi)置random庫(kù)主要用于產(chǎn)生各種分布的偽隨機(jī)數(shù)序列。random庫(kù)采用梅森旋轉(zhuǎn)算法(Mersenne twister)生成偽隨機(jī)數(shù)序列,可用于除隨機(jī)性要求更高的加解密算法外的大多數(shù)工程應(yīng)用

使用random庫(kù)主要目的是生成隨機(jī)數(shù),因此,讀者只需要查閱該庫(kù)的隨機(jī)數(shù)生成函數(shù),找到符合使用場(chǎng)景的函數(shù)使用即可。

這個(gè)庫(kù)提供了不同類型的隨機(jī)數(shù)函數(shù),所有函數(shù)都是基于最基本的random.random()函數(shù)擴(kuò)展而來(lái)。

random庫(kù)

對(duì)random庫(kù)的引用方法與math庫(kù)一樣,采用下面兩種方式實(shí)現(xiàn):

from random import *

import random

random庫(kù)
random庫(kù)


e、π的計(jì)算


應(yīng)用蒙特卡羅方法求解π的基本步驟如下:

1.隨機(jī)向單位正方形和圓結(jié)構(gòu),拋灑大量“飛鏢”點(diǎn)

2.計(jì)算每個(gè)點(diǎn)到圓心的距離從而判斷該點(diǎn)在圓內(nèi)或者圓外

3.用圓內(nèi)的點(diǎn)數(shù)除以總點(diǎn)數(shù)就是π/4值。

隨機(jī)點(diǎn)數(shù)量越大,越充分覆蓋整個(gè)圖形,計(jì)算得到的π值越精確。實(shí)際上,這個(gè)方法的思想是利用離散點(diǎn)值表示圖形的面積,通過(guò)面積比例來(lái)求解π值。

π的計(jì)算


π計(jì)算問(wèn)題的IPO表示如下:

1.輸入:拋點(diǎn)的數(shù)量

2.處理:對(duì)于每個(gè)拋灑點(diǎn),計(jì)算點(diǎn)到圓心的距離,通過(guò)距離判斷該點(diǎn)在圓內(nèi)或是圓外。統(tǒng)計(jì)在圓內(nèi)點(diǎn)的數(shù)量

3.輸出:π值。


Python代碼

Python代碼
精度和時(shí)間
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容