小白自學(xué)筆記之Python入門-第三章 內(nèi)置函數(shù) & 算法-2
本章就這么多內(nèi)容,簡單吧!下面舉個(gè)例子鞏固一下。
DIY做一做
1.編寫程序?qū)崿F(xiàn)輸入長方形的長和寬,計(jì)算長方形的面積。?
這個(gè)題目我猜你自己目前做不出來,因?yàn)槟氵€沒有學(xué)習(xí)一個(gè)非常重要的概念(故弄玄虛),除非你參考了網(wǎng)絡(luò)資料,那就要恭喜你,你會(huì)自學(xué)了,能自己解決問題了。
用計(jì)算機(jī)解決問題需要有方法,在咱們IT界有一個(gè)專門的名詞——“算法”。算法的定義為解決問題具體的方法和步驟,這個(gè)概念似乎不是那么高大上,似乎跟日常生活比較接近,但是在計(jì)算機(jī)中算法是一個(gè)非常重要的概念,我們有必要認(rèn)真研究一下。嚴(yán)肅起來?。?/p>
算法著名的一個(gè)例子就是古希臘數(shù)學(xué)家歐幾里得(Euclid)發(fā)現(xiàn)的求兩個(gè)正整數(shù) A 和 B 的最大公約數(shù)(Greatest Common Divisor,GCD)問題。描述如下:
第 1 步:比較 A 和 B 這兩個(gè)數(shù),將 A 設(shè)置為較大的數(shù),B 為較小的數(shù)。
第 2 步:A 除以 B,得余數(shù) R(Remainder)。
第 3 步:如果 R=0,則最大公約數(shù)就是 B;否則將 B 賦值給 A,R賦值給 B,重復(fù)進(jìn)行前兩步。
我們暫且不管為什么通過上面的算法就能求出最大公約數(shù),因?yàn)檫@是數(shù)學(xué)家研究的問題(數(shù)學(xué)很難的,特別是高數(shù)對(duì)吧?所以我們要避重就輕,冠冕堂皇的接著往下挑簡單的說),我們要做的是將算法轉(zhuǎn)換為計(jì)算機(jī)能夠理解的語句。
不管是復(fù)雜的算法還是簡單的算法,都具有5個(gè)特性:
①確定性。算法中的每個(gè)步驟都應(yīng)是確定的。就是你要描述清楚,想好到底要干啥,不要產(chǎn)生二義性。你不能跟計(jì)算機(jī)說如果電影好看我就去看,對(duì)于好看不好看每個(gè)人有每個(gè)人的理解,計(jì)算機(jī)不知道什么叫“電影好看”,應(yīng)該描述成“如果豆瓣評(píng)分大于9.9我就去看”。
②有窮性。算法中的步驟應(yīng)是有限的且在有限的時(shí)間內(nèi)能夠執(zhí)行完畢。如果執(zhí)行一個(gè)計(jì)算任務(wù)要數(shù)年才能做完,等的花兒都謝了,它就不是一個(gè)算法,不能子子孫孫無窮匱也。
③有效性。算法中的每個(gè)步驟都應(yīng)該被有效地執(zhí)行,并能得到一個(gè)明確的結(jié)果。比如數(shù)學(xué)里規(guī)定除數(shù)不能為零,如果在算法里出現(xiàn)了除數(shù)為零的情況就不符合有效性了。
④可有零個(gè)或多個(gè)輸入。針對(duì)具體問題,有時(shí)候需要輸入,有時(shí)不需要輸入的。
⑤有一個(gè)或多個(gè)輸出。輸出就是看問題是否被解決,算法必須有輸出,沒有輸出的算法是沒有意義的。這里的輸出不能簡單理解為屏幕輸出,只要問題解決了就是有輸出。
算法涉及的對(duì)象是數(shù)據(jù),算法有兩類:數(shù)值算法和非數(shù)值算法。數(shù)值算法是對(duì)數(shù)值進(jìn)行求解,是傳統(tǒng)意義上的計(jì)算。由于數(shù)值運(yùn)算的模型比較成熟,因此對(duì)數(shù)值算法的研究是比較深入的。非數(shù)值運(yùn)算包含的面很廣,如圖書管理、物流管理、信息系統(tǒng)等,其計(jì)算問題涉及更多的是“處理”,包括排序、檢索、變換和分析等,非數(shù)值運(yùn)算是整個(gè)計(jì)算任務(wù)的主要部分。
Dijkstra (荷蘭的計(jì)算機(jī)科學(xué)家)提出算法具有三種基本控制結(jié)構(gòu):順序、分支和循環(huán),這三種基本結(jié)構(gòu)能夠解決任何問題。順序結(jié)構(gòu)(Sequence)是算法中最簡單的一種結(jié)構(gòu),表示問題求解過程按照順序由上至下執(zhí)行。事實(shí)上,程序的主結(jié)構(gòu)都是順序的:從一個(gè)入口開始,到一個(gè)出口結(jié)束。順序結(jié)構(gòu)如下圖所示:

比如,把大象關(guān)進(jìn)冰箱一共分幾步?就是按照下面的步驟一步一步進(jìn)行,做完1接著2然后3。
⑴ 打開冰箱門
⑵ 把大象關(guān)進(jìn)去
⑶ 關(guān)上冰箱門
分支結(jié)構(gòu)(Alteration)也稱為條件結(jié)構(gòu)、判斷結(jié)構(gòu)、選擇結(jié)構(gòu),如下圖所示,若條件成立,則執(zhí)行分支 A,否則執(zhí)行 B。

比如有錢買什么?那得要看我有多少錢,如果我的錢小于1角,如果我的錢小于5角,如果我有一個(gè)億,所以需要看看哪個(gè)條件滿足,滿足哪個(gè)條件就做哪個(gè)價(jià)位的事情。所以我現(xiàn)在要想一想我的一個(gè)億怎么花了。
第三個(gè)控制結(jié)構(gòu)是循環(huán)(Loop)結(jié)構(gòu),算法中的重復(fù)操作通過循環(huán)結(jié)構(gòu)表示。循環(huán)有兩種結(jié)構(gòu):while 結(jié)構(gòu)和 do-while結(jié)構(gòu),如圖所示,A 是循環(huán)體(Loop Body),即重復(fù)操作的那部分。

比如每天早晨鍛煉跑3200米,在紅旗操場一圈一圈的跑,跑完一圈看看夠8圈了嗎?沒夠繼續(xù)跑,夠了就停下。每一次都是在做重復(fù)的操作,但是這個(gè)重復(fù)的操作不是沒完沒了的,只要滿足條件就可以停下來,否則還不得累死了。
Ok,到這兒介紹完了算法的概念,但是編程不僅要懂算法,在解決具體問題時(shí)還要理解程序設(shè)計(jì)的IPO模式,I是input,P是Process,O是output。在解決具體問題時(shí),首先要考慮問題的輸入是什么,然后考慮輸出是什么,對(duì)數(shù)據(jù)如何處理。不管用什么語言編程,前面講的算法和程序設(shè)計(jì)模式的原理都是通用的,不同編程語言的區(qū)別主要是語法不同而已。
?
以我們現(xiàn)在這個(gè)題目輸入長方形的長和寬,計(jì)算長方形的面積為例,這里明確說明了輸入是長和寬,輸出或者說計(jì)算結(jié)果是面積,處理是面積求法為長*寬。按照這個(gè)思路,查閱前面函數(shù)表,我們編寫程序如下,stop,自己想一想去編程吧。?
參考答案:
length = float(input('輸入長方形長: '))
width = float(input('輸入長方形寬: '))
# 計(jì)算面積
area = length * width
print('長方形的面積為', area)
2.編寫程序?qū)崿F(xiàn)輸入三邊長計(jì)算三角形面積。
思考:輸入是 ???三角形三邊長?? ??,輸出是 ??三角形面積? ??,處理是啥呢?怎么根據(jù)三角形的三條邊長計(jì)算面積,不會(huì)的話問問百度,或者我給個(gè)提示“海倫公式”。好了,自己編程去吧!
?參考答案:
a = float(input('輸入三角形第一邊長: '))
b = float(input('輸入三角形第二邊長: '))
c = float(input('輸入三角形第三邊長: '))
?
# 計(jì)算半周長
s = (a + b + c) / 2
?
# 計(jì)算面積
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print('三角形面積為 %0.2f' % area)
?
3.編寫程序?qū)崿F(xiàn)輸入分鐘數(shù)折算成小時(shí)和分鐘輸出,如輸入68分鐘,輸出1小時(shí)8分鐘。
思考:輸入是 ?????????????,輸出是 ????????????,處理是 ??????????。
我不再提示了,use your head!?
參考答案:
minutes=int(input("minutes:"))
hour=minutes//60
minute=minutes%60
print(hour,"小時(shí)",minute,"分鐘")
參照這個(gè)例題我們還可以試著做輸入用分表示的錢數(shù)(不到一元),輸出最小數(shù)目的硬幣數(shù)目。如輸入86分,輸出1個(gè)五角硬幣,3個(gè)一角硬幣,1個(gè)5分硬幣,1個(gè)1分硬幣。這里我們考慮硬幣類型為:五角、一角、5分、2分和1分這幾種類型。試著完成這個(gè)程序吧。
?參考答案:
The furthest distance in the world is not between life and death but when I stand in front of you yet you don't know that I love you.
Let life be beautiful like summer flowers and death like autumn leaves.
From Tagore
?
哈哈哈,這個(gè)參考答案是假的!自己動(dòng)手,迎接挑戰(zhàn),祝你成功!
好,本章內(nèi)容就到這里,到這里吧!
Quiz考一考
這里是通過學(xué)習(xí),自己總結(jié)知識(shí)點(diǎn)和要點(diǎn),設(shè)計(jì)3個(gè)本章內(nèi)容相關(guān)的題目并提供參考答案。題目類型編程題。
最好你設(shè)計(jì)的題目能夠有特點(diǎn)、夠經(jīng)典,這樣就有機(jī)會(huì)作為最后的考題。
?
編程題
1.編寫程序?qū)崿F(xiàn)輸入出生年月日,輸出年齡和幸運(yùn)數(shù)字。其中幸運(yùn)數(shù)字為月日的數(shù)字累加和。如輸入year=2000,month=8,day=12。則年齡20,幸運(yùn)數(shù)字計(jì)算方法為2+0+0+0+8+1+2=13? 1+3=4,最終幸運(yùn)數(shù)字為4。?
參考答案:
year=int(input("year:"))
month=int(input("month:"))
day=int(input("day:"))
y1=year//1000
y2=year%1000//100
y3=year%100//10
y4=year%10
sum=y1+y2+y3+y4+month//10+month%10+day//10+day%10
luckyNo=sum//10+sum%10
print("你2020年",2020-year,"歲了")
print("你的幸運(yùn)數(shù)字是..")
print("..............")
print("..............",luckyNo)?
2.還沒記住呢?現(xiàn)在該你了!
你的筆記



The end.