第2章 程序的靈魂-算法
前面的話:
這是給幾個(gè)高中的興趣班講解譚浩強(qiáng)的《C程序設(shè)計(jì)》第三版的講義之節(jié)選,實(shí)際講解時(shí)使用了10個(gè)道具盒子演示計(jì)算過(guò)程。另外,例子的解釋選取了2.1、2.3、2.4這3個(gè)比較典型的,最后用譚浩強(qiáng)先生書上的幾個(gè)簡(jiǎn)單的例子給出了關(guān)于什么是結(jié)構(gòu)化的程序設(shè)計(jì)方法的解釋
例2.1
例2.3
去掉了s2后,算法的功能保持不變哦!!!!!!!
例2.4




面向過(guò)程的結(jié)構(gòu)化程序設(shè)計(jì)的一般性解題方法:
假想現(xiàn)在你是一個(gè)老師,希望讓你的小學(xué)學(xué)生為你完成一個(gè)題目的計(jì)算,但是, 并不想告訴他解決的是什么問(wèn)題,你,可以把題目分解成簡(jiǎn)單到只有+ - x / 步驟的命令表,讓他照表上的命令從頭到尾執(zhí)行完,把結(jié)果給你。這時(shí),他并不知道這個(gè)命令表的目的,但你的結(jié)果拿到了。。。。。,這就是程序設(shè)計(jì)。
給編程序打個(gè)比方:
一個(gè)只會(huì)加減乘除的小學(xué)生,現(xiàn)在你要讓他幫助你求某些數(shù)字的最大公約數(shù).
有幾種辦法可選
1.教會(huì)他求最大公約數(shù)的方法
2.把求解方法分解成他現(xiàn)在就能馬上能計(jì)算的若干步,讓他按照步驟作,不用告他在求解什么,只要正確的按步驟求解出結(jié)果就可以了.
顯然,方法2這個(gè)小學(xué)生更容易上手.
對(duì)于機(jī)器而言,你只能選擇方法2,因此,在讓機(jī)器運(yùn)算以前,你必須對(duì)計(jì)算的每一步十分了解,并確保正確,因此,你必須首先具體到機(jī)器能理解的每一步,這也是學(xué)習(xí)程序設(shè)計(jì)方法的精髓所在.........
電腦就是機(jī)器,它的智力并不能理解上面求某些數(shù)字的最大公約數(shù)的例子,同時(shí)也不會(huì)理解諸如: 給出一個(gè)百分制成績(jī),要求輸出成績(jī)等級(jí),A,B,C,D,E. 90以上為A,80-89為B,70-79為C,60-69為D,60以下為E的問(wèn)題。。。。。。,但是我們可以將求解的過(guò)程分解成它能理解并執(zhí)行的+、-、X、/、比大小等命令的列表,如何分解成這樣的列表呢?
看一下下面給成績(jī)分級(jí)的例子,求解它的機(jī)器命令列表生成的全過(guò)程。
例子: 給出一個(gè)百分制成績(jī)score,要求輸出成績(jī)等級(jí),A,B,C,D,E. 90以上為A,80-89為B,70-79為C,60-69為D,60以下為E.
1、 好,現(xiàn)在,我給你一個(gè)分?jǐn)?shù)95 ,你能判斷的出他的成績(jī)等級(jí)嗎? 當(dāng)然 ,是A。
2、 好,現(xiàn)在,我給你一個(gè)分?jǐn)?shù)85 ,你能判斷的出他的成績(jī)等級(jí)嗎? 當(dāng)然 ,是B。
3、 好,現(xiàn)在,我給你任一個(gè)分?jǐn)?shù) ,你能判斷的出他的成績(jī)等級(jí),并寫在黑板上嗎? 當(dāng)然,那么,告訴我你是如何做的?
你會(huì),這樣描述給我:
設(shè),有一個(gè)分?jǐn)?shù)變量
當(dāng)給定此變量一個(gè)百分制分?jǐn)?shù)時(shí)
如果 分?jǐn)?shù)<=100 同時(shí) 分?jǐn)?shù)>=90 寫下 A
否則 如果 分?jǐn)?shù)>=80 寫下 B
否則 如果 分?jǐn)?shù)>=70 寫下 C
否則 如果 分?jǐn)?shù)>=60 寫下 D
否則 如果 分?jǐn)?shù)>=0 寫下 E
否則 寫下 給錯(cuò)分?jǐn)?shù)了
4、 好,現(xiàn)在把上面的這段話翻譯成英文:
float score
input a float data -----> score
if score<=100 and score>=90 then write A
else if score>=80 then write B
else if score>=70 then write C
else if score>=60 then write D
else if score>=0 then write E
else write down "input data Error!!!!!!!!!!!"
這個(gè)時(shí)候的表達(dá),已經(jīng)很接近計(jì)算機(jī)可以理解的C程序了(畢竟計(jì)算機(jī)是起源于美國(guó),他能理解的東西更接近英語(yǔ))。
5、由于計(jì)算機(jī)C語(yǔ)言的write是printf,因此繼續(xù)進(jìn)行語(yǔ)法規(guī)范如下:
float score; /*設(shè)有一個(gè)變量score*/
scanf("%f",&score); /*給出一個(gè)百分制成績(jī)score的值*/
if (score<=100&&score>=90) printf("A");
else if (score>=80) printf("B");
else if (score>=70) printf("C");
else if (score>=60) printf("D");
else if (score>=60) printf("D");
else if (score>=0) printf("E");
else printf("input data Error!!!!!!!!!!!");/* 輸入數(shù)據(jù)錯(cuò)誤>100或<0 */
這個(gè)時(shí)候的表達(dá),已經(jīng)是計(jì)算機(jī)可以理解的C程序了。
6、在加上計(jì)算機(jī)可理解的簡(jiǎn)單程序所須的格式:
開(kāi)頭是: #include<stdio.h>
void main(){
結(jié)尾是: }
最終程序如下:
#include<stdio.h>
void main(){
float score; /*設(shè)有一個(gè)變量score*/
scanf("%f",&score); /*給出一個(gè)百分制成績(jī)score的值*/
if (score<=100&&score>=90) printf("A");
else if (score>=80) printf("B");
else if (score>=70) printf("C");
else if (score>=60) printf("D");
else if (score>=60) printf("D");
else if (score>=0) printf("E");
else printf("input data Error!!!!!!!!!!!");/* 輸入數(shù)據(jù)錯(cuò)誤>100或<0 */
}
最終的程序完成了,這就是計(jì)算機(jī)可以理解的命令列表-------程序,其中只含有計(jì)算機(jī)可以理解執(zhí)行的簡(jiǎn)單的命令。
從上面可以得出計(jì)算機(jī)程序設(shè)計(jì)的一般性的編程解題方法:
1、你自己先解題目,就象上面的1、2步。
這個(gè)步驟達(dá)到的目的是:讓你充分的了解題目,也就是對(duì)它的求解過(guò)程的全面接觸
2、 記錄下你解決問(wèn)題的過(guò)程的每一步并整理,就象上例中的第3步(最重要的步驟)
盡量只使用 + - x / 和比較大小以及所需數(shù)據(jù)的輸入和輸出命令。
這個(gè)步驟達(dá)到了一個(gè)重要的目的:
你寫下的解題步驟,交給任何一個(gè)識(shí)字并且會(huì)比大小的人,比如一個(gè)小學(xué)生,他不理解這些步驟的最終目的,但是只要嚴(yán)格按照步驟進(jìn)行,就能得出正確的最后結(jié)果。
3、接下來(lái)的第4、5、6步,就是翻譯成英語(yǔ)和規(guī)范成C語(yǔ)言了。
注意:綠色的大大的過(guò)程兩個(gè)字,傳達(dá)了一個(gè)信息,編制程序的出發(fā)點(diǎn)和目標(biāo)就是發(fā)現(xiàn)并記錄下你自己在解決問(wèn)題時(shí)采用的步驟的全部,即解決問(wèn)題的全過(guò)程,對(duì)編程序再次做一個(gè)簡(jiǎn)單的比喻:你見(jiàn)過(guò)擺骨牌的嗎?設(shè)定好全部前后順序,然后推倒第一個(gè)骨牌, 你就不用管了,剩下的事情它自己完成,編程序就象是從頭到尾擺骨牌。執(zhí)行程序就象是推倒第一個(gè)骨牌,而程序就象是骨牌倒下的全過(guò)程,結(jié)果就是最后呈現(xiàn)在你面前的骨牌圖案。計(jì)算機(jī)的智能是極其有限的,各種程序就是我們?nèi)说乃枷朐谟?jì)算機(jī)中的再現(xiàn),這種再現(xiàn)能指揮計(jì)算機(jī)工作。你的任務(wù)就是再現(xiàn)要完成的任務(wù)的全部過(guò)程。
因此我們編制小型程序就是在尋找這個(gè)過(guò)程,找到了它,你的任務(wù)也就差不多完成了,這就叫面向過(guò)程。

作者:
RDIF
出處:
http://www.rzrgm.cn/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手機(jī)號(hào))
框架官網(wǎng):
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.rzrgm.cn/huyong
國(guó)思RDIF開(kāi)發(fā)框架
,
給用戶和開(kāi)發(fā)者最佳的.Net框架平臺(tái)方案,為企業(yè)快速構(gòu)建跨平臺(tái)、企業(yè)級(jí)的應(yīng)用提供強(qiáng)大支持。
關(guān)于作者:系統(tǒng)架構(gòu)師、信息系統(tǒng)項(xiàng)目管理師、DBA。專注于微軟平臺(tái)項(xiàng)目架構(gòu)、管理和企業(yè)解決方案,多年項(xiàng)目開(kāi)發(fā)與管理經(jīng)驗(yàn),曾多次組織并開(kāi)發(fā)多個(gè)大型項(xiàng)目,在面向?qū)ο蟆⒚嫦蚍?wù)以及數(shù)據(jù)庫(kù)領(lǐng)域有一定的造詣。現(xiàn)主要從事基于
RDIF
框架的技術(shù)開(kāi)發(fā)、咨詢工作,主要服務(wù)于金融、醫(yī)療衛(wèi)生、鐵路、電信、物流、物聯(lián)網(wǎng)、制造、零售等行業(yè)。
如有問(wèn)題或建議,請(qǐng)多多賜教!
本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,如有問(wèn)題,可以通過(guò)微信、郵箱、QQ等聯(lián)系我,非常感謝。

浙公網(wǎng)安備 33010602011771號(hào)