版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
09程序設(shè)計(jì)語(yǔ)言初步第四章二09程序設(shè)計(jì)語(yǔ)言初步第四章二14.1算法的概念4.2算法的三種基本結(jié)構(gòu)4.3算法的描述方法4.4結(jié)構(gòu)化程序設(shè)計(jì)方法4.5算法設(shè)計(jì)實(shí)例研究提綱24.1算法的概念提綱2最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件3最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件4最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件5最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件6最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件7最新09程序設(shè)計(jì)語(yǔ)言初步第四章二課件8例1求1×2×…×9×10,即10!第一種算法:S1(求2!):先求2×1,得到結(jié)果2并賦值給變量p;即:2×1→p;S2(求3!):將步驟S1得到的乘積p(p=2)再乘以3,得結(jié)果6并 賦值給變量p;即:3
×p→p;S3(求4!):將p(p=6)再乘以4,得24并賦值給變量p;即: 4×p→p;S4(求5!):將p(p=24)再乘以5,得120并賦值給變量p;即: 5×p→p;…S9(求10!):將p(p=362880)乘以10,得3628800,10×p→p;9例1求1×2×…×9×10,即10!第一種算法:S1(#include<stdio.h>main(){intp;p=2*1;//求2!賦值給pp=3*p;//求3!賦值給pp=4*p;p=5*p;p=6*p;p=7*p;p=8*p;p=9*p;
p=10*p;
//求10!賦值給pprintf("%d",p);system("pause");return0;}
評(píng)價(jià):求10!需要寫(xiě)9個(gè)賦值操作,算法過(guò)于繁瑣!試想:求1000!的算法10#include<stdio.h>評(píng)價(jià):求10!需要寫(xiě)9個(gè)賦對(duì)算法進(jìn)行抽象: 核心操作就是兩數(shù)相乘i×p→p,反復(fù)相乘10-1=9次,i初始值為2,p初始值為1,每相乘一次i的值加1。根據(jù)上述分析,本題可利用循環(huán)結(jié)構(gòu)求解: 第1次循環(huán)用于求2!,第2次循環(huán)在第1次循環(huán)基礎(chǔ)上求3!,…,第9次循環(huán)在第8次循環(huán)基礎(chǔ)上求10!例1求1×2×…×9×10,即10!11對(duì)算法進(jìn)行抽象:例1求1×2×…×9×10,即10!1定義兩個(gè)變量p和i,p代表階乘結(jié)果,i代表本次循環(huán)要求的是i!;
循環(huán)條件:i<=10循環(huán)體:p=i*p;(求i!)i=i+1;i!(i-1)!例1求1×2×…×9×10,即10!初始化:i=2;p=1由于本次循環(huán)求得的i*p的值將作為下次循環(huán)p的值,故本次循環(huán)將i*p賦值給p,為下一次循環(huán)做準(zhǔn)備。12定義兩個(gè)變量p和i,p代表階乘結(jié)果,i代表本次循環(huán)要求的是iS1:使i=2
;S2:使p=1
;/*變量初始化*/S3:執(zhí)行i×p,乘積仍放在變量p中,即i×p=>p;S4:使i的值加1,即i+1=>i;S5:如果i<=10,返回重新執(zhí)行步驟S3以及其后的步驟S4和S5;否則,算法結(jié)束。最后得到p的值就是10!的值。
求1×2×…×9×10算法思路:“迭代”和“循環(huán)”
:在程序設(shè)計(jì)中,重復(fù)執(zhí)行同樣操作的過(guò)程稱為“迭代”。程序中被重復(fù)執(zhí)行的程序段稱為“循環(huán)”。13S1:使i=2;求1×2×…×9×10算法思路:“迭代”和例1源程序#include<stdio.h>main(){
intn,i,p;//n:存儲(chǔ)要求階乘的數(shù);p:存儲(chǔ)求得的階乘; printf("inputn:\n"); scanf("%d",&n);
i=2;p=1;while(i<=n){ p=i*p;i=i+1;} printf("%d!=%d",n,p); system("pause");return0;}14例1源程序#include<stdio.h>14練習(xí)1:輸入十個(gè)整數(shù),求出最大值、最小值。算法思路:采用迭代計(jì)算的方法以求最大值為例,即:Max(N1)=N1Max(N2,N1)=N1if
N2<N1 =N2ifN2>=N1Max(N3,N2,N1)=Max(N3,Max(N2,N1))….Max(Nn,Nn-1,…,N2,N1)= Max(Nn,Max(Nn-1,…,N2,N1))定義變量max來(lái)存儲(chǔ)前n-1個(gè)整數(shù)的最大值。第n個(gè)數(shù)將和max比較,決定前n個(gè)數(shù)的最大值。整個(gè)問(wèn)題就被轉(zhuǎn)變?yōu)榍?次兩個(gè)數(shù)的最大值。每一次都是讀入一個(gè)數(shù),和之前求得的最大數(shù)再去比較。15練習(xí)1:輸入十個(gè)整數(shù),求出最大值、最小值。定義變量max來(lái)存循環(huán)條件:i<=10循環(huán)體:
讀入第i個(gè)整數(shù)n;如果n>max,則max=n;否則,如果n<min,則min=n;i=i+1;循環(huán)初始化:讀入一整數(shù)n;min=n;max=n;i=2;請(qǐng)寫(xiě)出本題源程序16循環(huán)條件:i<=10循環(huán)體:循環(huán)初始化:請(qǐng)寫(xiě)出本題源程序16源程序:輸入十個(gè)整數(shù),求出最大值、最小值#include<stdio.h>#defineCOUNT10
main(){inti,n,max,min;//i:循環(huán)計(jì)數(shù);n:讀取的數(shù); //max:當(dāng)前最大值;min:當(dāng)前最小值
scanf("%d",&n);max=n;//將第一個(gè)數(shù)作為最大值和最小值min=n;i=2;//代表接下去要讀取的是第2個(gè)數(shù)
17源程序:輸入十個(gè)整數(shù),求出最大值、最小值#include<s源程序:輸入十個(gè)整數(shù),求出最大值、最小值(續(xù))while(i<=COUNT){scanf(“%d”,&n);//讀取第i個(gè)數(shù)if(n>max)//求最大數(shù)max=n;elseif(n<min)//求最小數(shù)min=n;
i=i+1;}
printf("maxnumberis%d",max);printf("minnumberis%d",min);system("pause");return0;}18源程序:輸入十個(gè)整數(shù),求出最大值、最小值(續(xù))whil例2輸入120個(gè)學(xué)生的學(xué)號(hào)和成績(jī),要求將他們之中成績(jī)?cè)?0分以上者的學(xué)號(hào)和成績(jī)打印出來(lái)。循環(huán)結(jié)束條件:已經(jīng)處理了120個(gè)學(xué)生的信息。為了計(jì)數(shù)當(dāng)前輸入的是第幾個(gè)學(xué)生的信息,可以引入變量i,用于表示當(dāng)前處理的學(xué)生順序。循環(huán)體:1:讀入第i個(gè)學(xué)生的學(xué)號(hào)和成績(jī)(抽象出變量num和score);2:如果score≥60,則打印num和score,否則不打印;3:i+1=>i;問(wèn)題分析:就是反復(fù)輸入處理每一個(gè)學(xué)生的信息,處理120次。19例2輸入120個(gè)學(xué)生的學(xué)號(hào)和成績(jī),要求將他們之中成績(jī)?cè)?輸入120個(gè)學(xué)生的學(xué)號(hào)和成績(jī),要求將他們之中成績(jī)?cè)?0分以上者的學(xué)號(hào)和成績(jī)打印出來(lái)。S1:1=>i;S2:讀入第i個(gè)學(xué)生的學(xué)號(hào)和成績(jī)分別到變量num和score中;S3:如果score≥60,則打印num和score;S4:i+1=>i;S5:如果i≤120,則返回S2,繼續(xù)執(zhí)行;否則,算法結(jié)束。循環(huán)處理模式: 處理本次循環(huán)要做的任務(wù); 為下一次循環(huán)做準(zhǔn)備;20輸入120個(gè)學(xué)生的學(xué)號(hào)和成績(jī),要求將他們之中成績(jī)?cè)?0分以上4.1算法的概念練習(xí)2:請(qǐng)寫(xiě)出本題對(duì)應(yīng)的程序
214.1算法的概念練習(xí)2:請(qǐng)寫(xiě)出本題對(duì)應(yīng)的程序214.1算法的概念#include<stdio.h>main(){intno,total,count;//no:學(xué)號(hào)。total:總學(xué)生數(shù)。count:計(jì)數(shù)
floatscore; //成績(jī)
printf("howmanyintnumbersdoyouwanttoinput:\n"); scanf("%d",&total);
count=1; while(count<=total){//進(jìn)入循環(huán)體之前的count代表下一個(gè)要讀取的是第幾個(gè)學(xué)生信息
printf("inputnoandscore(no,score):\n"); scanf("%d,%f",&no,&score); if(score>60) printf("no:%d\tscore:%f\n",no,score);
count=count+1; } system("pause");return0;}224.1算法的概念#include<stdio.h>例3一個(gè)大于或等于3的正整數(shù),判斷它是否為一個(gè)素?cái)?shù)(質(zhì)數(shù))
。所謂質(zhì)數(shù),是指除了1和該數(shù)本身外,不能被其他任何整數(shù)整除的數(shù)。例如,13是素?cái)?shù)(質(zhì)數(shù))。因?yàn)樗荒鼙?,3,4,…,12整除。由于素?cái)?shù)在當(dāng)代的密碼學(xué)中扮演了中心的作用,所以該問(wèn)題具有重要意義。判斷一個(gè)數(shù)n(n≥3)是否為質(zhì)數(shù):將n作為被除數(shù),將2到(n-1)各個(gè)整數(shù)依次作為除數(shù),如果都不能被整除,則n為素?cái)?shù)。4.1算法的概念23例3一個(gè)大于或等于3的正整數(shù),判斷它是否為一個(gè)素?cái)?shù)(質(zhì)數(shù)判斷質(zhì)數(shù)看n能否被2到(n-1)之間的各個(gè)整數(shù)整除:
變量抽象:n:存放被判斷的整數(shù);i:存放除 數(shù),取值為[2,n-1];r:存放n/i得到的余數(shù)循環(huán)體:n被i除,得余數(shù)r;即nmodi=>r;如果r=0,表示n能被i整除,則打印 n“不是素?cái)?shù)”,算法結(jié)束;否則i+1=>i;循環(huán)條件:
i<=n-1循環(huán)初始化:
i=2問(wèn)題:當(dāng)r為0時(shí)如何退出循環(huán),結(jié)束算法?24判斷質(zhì)數(shù)看n能否被2到(n-1)之間的各個(gè)整數(shù)整除:判斷質(zhì)數(shù)設(shè)置一個(gè)標(biāo)記變量isPrim,初始值為0,當(dāng)r為0時(shí)使isPrim值為1,在循環(huán)條件中加入對(duì)該變量值的判斷,以決定是否提前退出循環(huán)循環(huán)體:n被i除,得余數(shù)r;即nmodi=>r;如果r=0,表示n能被i整除,則打印 n“不是素?cái)?shù)”,令isPrim=1;否則i+1=>i;循環(huán)條件:
i<=n-1&&isPrim==0循環(huán)初始化:
i=2;isPrim=0;25判斷質(zhì)數(shù)設(shè)置一個(gè)標(biāo)記變量isPrim,初始值為0,當(dāng)r為0時(shí)S1:輸入n的值;S2:i=2;/*i是除數(shù)*/S3:n被i除,得余數(shù)r;即nmodi=>rS4:如果r=0,表示n能被i整除,則打印 n“不是素?cái)?shù)”,算法結(jié)束;否則執(zhí)行 S5;S5:i+1=>i;S6:如果i≤n-1,返回S3;否則,打印n“是素?cái)?shù)”,算法結(jié)束。n:被判斷的整數(shù);i:被除數(shù);
r:存放n/i得到的余數(shù)事實(shí)上,i只需2到之間的整數(shù)整除即可。26S1:輸入n的值;n:被判斷的整數(shù);i:被除數(shù);
r:存放n4.1算法的概念4.2算法的三種基本結(jié)構(gòu)4.3算法的描述方法4.4結(jié)構(gòu)化程序設(shè)計(jì)方法4.5算法設(shè)計(jì)實(shí)例研究提綱274.1算法的概念提綱274.2算法的三種基本結(jié)構(gòu)三種控制結(jié)構(gòu)(Bohra和Jacopini) 順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)
順序結(jié)構(gòu)
按書(shū)寫(xiě)順序執(zhí)行的語(yǔ)句構(gòu)成的程序段。284.2算法的三種基本結(jié)構(gòu)三種控制結(jié)構(gòu)(Bohra和選擇結(jié)構(gòu)根據(jù)給定的表達(dá)式是否成立而選擇執(zhí)行操作A或操作B。如果表達(dá)式成立,則執(zhí)行操作A;如果表達(dá)式不成立,則執(zhí)行操作B。操作B可以為空。4.2算法的三種基本結(jié)構(gòu)29選擇結(jié)構(gòu)根據(jù)給定的表達(dá)式是否成立而選擇執(zhí)行操作A或操作B。
當(dāng)型循環(huán)結(jié)構(gòu)4.2算法的三種基本結(jié)構(gòu)C語(yǔ)言無(wú)直到型循環(huán)結(jié)構(gòu)。比較:直到型循環(huán)結(jié)構(gòu)和C語(yǔ)言中的do-while結(jié)構(gòu)?
直到型循環(huán)結(jié)構(gòu)30當(dāng)型循環(huán)結(jié)構(gòu)4.2算三種控制結(jié)構(gòu)的共同點(diǎn)
只有一個(gè)入口(a處)只有一個(gè)出口(b處)結(jié)構(gòu)內(nèi)的每一個(gè)部分都有機(jī)會(huì)被執(zhí)行到結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無(wú)終止的循環(huán))4.2算法的三種基本結(jié)構(gòu)由這三種基本結(jié)構(gòu)順序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜問(wèn)題!31三種控制結(jié)構(gòu)的共同點(diǎn)4.2算法的三種基本結(jié)構(gòu)由這三種基本4.1算法的概念4.2算法的三種基本結(jié)構(gòu)4.3算法的描述方法4.4結(jié)構(gòu)化程序設(shè)計(jì)方法4.5算法設(shè)計(jì)實(shí)例研究提綱324.1算法的概念提綱324.3算法的描述方法
用自然語(yǔ)言描述用流程圖描述用N-S流程圖描述用偽碼描述用計(jì)算機(jī)語(yǔ)言描述334.3算法的描述方法334.3算法的描述方法-自然語(yǔ)言文字冗長(zhǎng);不嚴(yán)格,易產(chǎn)生歧義(二義性);不方便描述分支和循環(huán)結(jié)構(gòu);344.3算法的描述方法-自然語(yǔ)言344.3算法的描述方法-流程圖流程圖的基本元素(ANSI規(guī)定)
起止框輸入/出框判斷框處理框流程線連接點(diǎn)注釋框354.3算法的描述方法-流程圖流程圖的基本元素(ANSI4.3算法的描述方法-流程圖流程圖描述的選擇結(jié)構(gòu)364.3算法的描述方法-流程圖流程圖描述的選擇結(jié)構(gòu)36
當(dāng)型循環(huán)結(jié)構(gòu)
直到型循環(huán)結(jié)構(gòu)流程圖描述的循環(huán)結(jié)構(gòu)4.3算法的描述方法-流程圖37當(dāng)型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)流程圖描述的循連接點(diǎn)(小圓圈):用于將畫(huà)在不同地方的流程線連接起來(lái)38連接點(diǎn)(小圓圈):用于將畫(huà)在不同地方的流程線連接起來(lái)38求10!流程圖使用當(dāng)型循環(huán)結(jié)構(gòu)描述39求10!流程圖使用當(dāng)型循環(huán)結(jié)構(gòu)描述39打印學(xué)生序號(hào)及成績(jī)流程圖40打印學(xué)生序號(hào)40判斷質(zhì)數(shù)的流程圖使用直到型循環(huán)結(jié)構(gòu)描述判斷r是否為0條件成立則跳出循環(huán)41判斷質(zhì)數(shù)的流程圖使用直到型循環(huán)結(jié)構(gòu)描述判斷r是否為0條件成立練習(xí):將以上流程圖改成用當(dāng)型循環(huán)結(jié)構(gòu)表示。該流程圖中循環(huán)結(jié)構(gòu)有兩個(gè)出口!違反單入單出原則!如何改進(jìn)?42練習(xí):將以上流程圖改成用當(dāng)型循環(huán)結(jié)構(gòu)表示。該流程圖中循環(huán)結(jié)構(gòu)改進(jìn)后的流程圖:?jiǎn)稳雴纬鲈O(shè)置標(biāo)志位isPrim43改進(jìn)后的流程圖:?jiǎn)稳雴纬鲈O(shè)置標(biāo)志位isPrim43傳統(tǒng)流程圖的弊端
對(duì)流程線的使用沒(méi)有嚴(yán)格限制,閱讀困難;
不能保證算法結(jié)構(gòu)的單入單出特性;
占用篇幅較多;
4.3算法的描述方法-N-S流程圖必須限制箭頭的濫用,讓流程只能順序執(zhí)行下去!保證結(jié)構(gòu)化原則的流程描述工具-N-S圖44傳統(tǒng)流程圖的弊端4.3算法的描述方法-N-S流程圖必須
基本結(jié)構(gòu)4.3算法的描述方法-N-S流程圖p、p1表示的是判斷條件;A、B框是操作;注意:A、B框可以是一個(gè)簡(jiǎn)單的操作(如讀入數(shù)據(jù)或打印輸出等),也可以是三種基本結(jié)構(gòu)之一順序結(jié)構(gòu)選擇結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)45基本結(jié)構(gòu)4.3算法的描述方法-N-S流程圖p、p1例1求10!的N-S流程圖4.3算法的描述方法-N-S流程圖46例1求10!的N-S流程圖4.3算法的描述方法-N-例2打印學(xué)生成績(jī)N-S流程圖4.3算法的描述方法-N-S流程圖47例2打印學(xué)生成績(jī)N-S流程圖4.3算法的描述方法-N-例3判斷質(zhì)數(shù)的N-S流程圖4.3算法的描述方法-N-S流程圖48例3判斷質(zhì)數(shù)的N-S流程圖4.3算法的描述方法-N-S4.3算法的描述方法-偽碼描述流程圖和N-S圖畫(huà)起來(lái)比較費(fèi)事,適合于表示算法,而在算法設(shè)計(jì)中使用不是很理想。偽碼用介于自然語(yǔ)言和程序設(shè)計(jì)語(yǔ)言之間的文字和符號(hào)來(lái)描述算法?!痉祷亍?/p>
IFxispositiveTHENprintx
ELSEprintyWHILEi<=120{inputscore;
IFscore>60THEN printscorei加1}494.3算法的描述方法-偽碼描述流程圖和N-S圖畫(huà)起來(lái)比較4.3算法的描述方法例4:利用泰勒級(jí)數(shù):-LLLL+--++-+-=+)!12()1(!7!5!3sin121753nxxxxxxnn計(jì)算正弦的值,直到最后一項(xiàng)絕對(duì)值小于10-6時(shí)為止。被除數(shù)除數(shù)符號(hào)n=1n=2n=3分析:求n項(xiàng)和的算法思路Sum(a1)=a1Sum(a1,a2)=Sum(a1)+a2=a1+a2Sum(a1,a2,a3)=Sum(a1,a2)+a3Sum(a1,a2,…,an)=Sum(a1,a2,…,an-1)+an504.3算法的描述方法例4:利用泰勒級(jí)數(shù):-LLLL+--4.3算法的描述方法算法的核心操作是求兩數(shù)之和,其中第一個(gè)操作數(shù)是前一次求得的和。如何求第二個(gè)操作數(shù)?算法1:n決定了第n項(xiàng)因子的值,即第二個(gè)操作數(shù);因此每一次可根據(jù)當(dāng)前n的值計(jì)算出第二個(gè)操作數(shù)。請(qǐng)用N-S圖描述出算法1。514.3算法的描述方法算法的核心操作是求兩數(shù)之和,其中第一求sin(x)算法1i代表下一個(gè)p是第幾項(xiàng),因此初值是1變量抽象:
x:存儲(chǔ)未知數(shù)x的值;sum:存儲(chǔ)和;p:存儲(chǔ)當(dāng)前待加的因子;i:當(dāng)前待加的是第幾個(gè)因子52求sin(x)算法1i代表下一個(gè)p是第幾項(xiàng),因此初值是1變量問(wèn)題:任何數(shù)據(jù)類型只能表示一定范圍內(nèi)的數(shù),當(dāng)試圖往變量中存儲(chǔ)在范圍之外的數(shù),數(shù)據(jù)無(wú)法正確存儲(chǔ)。求x的n次方和(2n-1)!時(shí)可能會(huì)導(dǎo)致結(jié)果太大而溢出。解決方法:1.用浮點(diǎn)型變量來(lái)保存(2n-1)!的結(jié)果2.改進(jìn)算法—算法253問(wèn)題:任何數(shù)據(jù)類型只能表示一定范圍內(nèi)的數(shù),當(dāng)試圖往變量中存儲(chǔ)4.3算法的描述方法=---)!32()1(32ixii=---+)!12()1(121ixii-LLLL+--++-+-=+)!12()1(!7!5!3sin121753nxxxxxxnn算法2:設(shè)第i項(xiàng)因子表示為,考察和 的關(guān)系。=*(-1)*x2/((2i-1)*(2i-2))544.3算法的描述方法=---)!32()1(32ixii請(qǐng)用N-S圖描述算法2。4.3算法的描述方法【源程序演示】i代表下一個(gè)p是第幾項(xiàng),因此初值是155請(qǐng)用N-S圖描述算法2。4.3算法的描述方法【源程序演示#include<stdio.h>#include<math.h>main(){ inti; floatx; doublesum,p;//p用于存放待加的那一項(xiàng)
printf("inputx:"); scanf("%f",&x);
/*變量初始化*/ sum=0.0; i=1; p=x; /*求解*/ while(fabs(p)>1e-8){ sum=sum+p;i=i+1; p=-p*x*x/((2*i-2)*(2*i-1));}
printf("sin(%f)=%lf\n",x,sum);
system("pause");return0;}56#include<stdio.h>564.1算法的概念4.2算法的三種基本結(jié)構(gòu)4.3算法的描述方法4.4結(jié)構(gòu)化程序設(shè)計(jì)方法4.5算法設(shè)計(jì)實(shí)例研究提綱574.1算法的概念提綱57源自于對(duì)goto語(yǔ)句的爭(zhēng)論goto語(yǔ)句詳見(jiàn)《程序設(shè)計(jì)教程》436頁(yè)4.4結(jié)構(gòu)化程序設(shè)計(jì)方法58源自于對(duì)goto語(yǔ)句的爭(zhēng)論4.4結(jié)構(gòu)化程序設(shè)計(jì)方法58#include<stdio.h>main(){intcount=1;
start://標(biāo)號(hào),是跟有冒號(hào)的標(biāo)識(shí)符if(count>10)gotoend;printf("%d",count);count=count+1;gotostart;
end:printf("\n");system("pause");return0;}12345678910請(qǐng)按任意鍵繼續(xù)...運(yùn)行效果:59#include<stdio.h>1234564.4結(jié)構(gòu)化程序設(shè)計(jì)方法用三種基本結(jié)構(gòu)組成的程序必然是結(jié)構(gòu)化的程序,這種程序便于編寫(xiě)、閱讀、修改和維護(hù)。結(jié)構(gòu)化程序設(shè)計(jì)強(qiáng)調(diào)程序設(shè)計(jì)風(fēng)格和程序結(jié)構(gòu)的規(guī)范化,提倡清晰的結(jié)構(gòu)。結(jié)構(gòu)化程序設(shè)計(jì)方法的基本思想:采用分而治之的方法,將一個(gè)復(fù)雜問(wèn)題分解為相對(duì)簡(jiǎn)單的一些子問(wèn)題,然后針對(duì)這些子問(wèn)題進(jìn)行求解。如果某個(gè)子問(wèn)題仍然是比較復(fù)雜的,再進(jìn)一步分解為子-子問(wèn)題,直到所有問(wèn)題都能夠求解。求解問(wèn)題的過(guò)程是分階段進(jìn)行的,每個(gè)階段處理的問(wèn)題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)(6~7個(gè)之內(nèi))。604.4結(jié)構(gòu)化程序設(shè)計(jì)方法用三種基本結(jié)構(gòu)組成的程序必然是結(jié)4.4結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)方法自頂向下;逐步細(xì)化;模塊化設(shè)計(jì)(函數(shù));結(jié)構(gòu)化編碼(三種基本結(jié)構(gòu))。614.4結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)方法61例4.13利用輾轉(zhuǎn)相除法求兩個(gè)正整數(shù)的最大公約數(shù)。輾轉(zhuǎn)相除法求最大公約數(shù)的數(shù)學(xué)定義如下:GCD(x,y)={y|x>yandxMODy=0GCD(y,xMODy)|x>yandxMODy≠0;}
說(shuō)明:先判斷x能否被y整除,若可以,則最大公約數(shù)就是除數(shù)y;否則,則將y作為被除數(shù),xMODy作為除數(shù)繼續(xù)上面的操作,直到x能否被y整除為止。
GCD(6,4)GCD(4,2)==2=GCD(124,6)最大公約數(shù)為2例如:求GCD(124,6)的過(guò)程為:62例4.13利用輾轉(zhuǎn)相除法求兩個(gè)正整數(shù)的最大公約數(shù)。GCD算法1xyr231交換變量x和y的值:自頂向下,逐步細(xì)化63算法1xyr231交換變量x和y的值:自頂向下,逐步細(xì)化63最終算法1算法設(shè)計(jì)任務(wù)結(jié)束的標(biāo)準(zhǔn)是各步驟已精細(xì)到能用語(yǔ)句描述,即滿足算法的5大特征標(biāo)志算法設(shè)計(jì)任務(wù)結(jié)束。64最終算法1算法設(shè)計(jì)任務(wù)結(jié)束的標(biāo)準(zhǔn)是各步驟已精細(xì)到能用語(yǔ)句描述算法2思考:能否不借助于變量r,而是x←y;y←
x%y?或者y←
x%y;x←
y65算法2思考:能否不借助于變量r,而是x←y;y←x%y練習(xí)3:設(shè)計(jì)算法,求一個(gè)正整數(shù)的長(zhǎng)度。算法1:例如num=12345,求num的長(zhǎng)度第1步:去掉最低位,num=1234,長(zhǎng)度len=1第2步:去掉最低位,num=123,長(zhǎng)度len=2第3步:去掉最低位,num=12,長(zhǎng)度len=3第4步:去掉最低位,num=1,長(zhǎng)度len=4第5步:去掉最低位,num=0,長(zhǎng)度len=5算法中每一步的核心操作是從num中去掉最低位,長(zhǎng)度len加166練習(xí)3:設(shè)計(jì)算法,求一個(gè)正整數(shù)的長(zhǎng)度。算法中每一步的核心操作6767假設(shè)num長(zhǎng)度不超過(guò)8,例如num=12345,求num的長(zhǎng)度算法2:試探能被10的幾次方除后商不為0第1步:num/107==0第2步:num/106==0第3步:num/105==0第4步:num/104!=0,說(shuō)明長(zhǎng)度為4+1=5算法中每一步的核心操作是試探:num除10i后商是否068假設(shè)num長(zhǎng)度不超過(guò)8,例如num=12345,求num的長(zhǎng)增加對(duì)輸入為0的判斷進(jìn)一步細(xì)化69增加對(duì)輸入為0的判斷進(jìn)一步細(xì)化69練習(xí)4:輸入一個(gè)不超過(guò)8位的正整數(shù),要求把這個(gè)整數(shù)分解為單個(gè)數(shù)字,然后打印出每一個(gè)數(shù)字(每一個(gè)數(shù)字之間用兩個(gè)空格分開(kāi))。例如用戶輸入了4200,程序打印結(jié)果為:4200。設(shè)計(jì)算法。第1步:得到num最高位4并輸出,num=200第2步:得到num最高位2并輸出,num=0第3步:得到num最高位0并輸出,num=9第4步:得到num最高位0并輸出,num=070練習(xí)4:輸入一個(gè)不超過(guò)8位的正整數(shù),要求把這個(gè)整數(shù)分解為單個(gè)7171練習(xí)5:設(shè)計(jì)算法,判斷一個(gè)正整數(shù)是否是回文數(shù)。回文數(shù)是指正讀和反讀都一樣的數(shù)。算法1:比較第1位和倒數(shù)第1位比較第2位和倒數(shù)第2位…算法2:反著讀,假設(shè)讀得的數(shù)為reverseNum,判斷num和reverseNum是否相等72練習(xí)5:設(shè)計(jì)算法,判斷一個(gè)正整數(shù)是否是回文數(shù)。回文數(shù)是指正讀以求a0a1a2a3的逆數(shù)為例,假設(shè)reverse實(shí)現(xiàn)逆著讀reverse(a3)=a3reverse(a2a3)=a3a2=a3*10+a2=
reverse(a3)*10+a2reverse(a1a2a3)=a3a2a1=a3a2*10+a1
=reverse(a2a3)*10+a1reverse(a0a1a2a3)=a3a2a1a0=a3a2a1*10+a0
=reverse(a1a2a3)*10+a073以求a0a1a2a3的逆數(shù)為例,假設(shè)reverse實(shí)現(xiàn)逆著讀判斷回文數(shù)-算法174判斷回文數(shù)-算法174判斷回文數(shù)-算法275判斷回文數(shù)-算法275#include<stdio.h>main(){intnum;//存放輸入的整數(shù)
intnum1;/*循環(huán)中處理的數(shù),每循環(huán)一次,右邊少一位,假設(shè)num為1234,則num1初始值為1234,然后是123,然后是12......;*/intreverse;/*是用分解出來(lái)的數(shù)字組成的新數(shù)*/intm;/*m:存放每一個(gè)分解出來(lái)的數(shù)字;*/
printf("請(qǐng)輸入一個(gè)小于8位的正整數(shù):");//讀取要判斷的整數(shù)
scanf("%d",&num);
/*從右到左依次取出各個(gè)數(shù)字組裝成一個(gè)新的整數(shù)保持到reverse中*/num1=num;reverse=0;while(num1!=0){ m=num1%10;/*取出num1的最低位*/ reverse=reverse*10+m;/*將最低位組裝到reverse中*/ num1=num1/10;/*去掉num1的最低位*/}
if(num==reverse)printf("%d是回文數(shù)\n",num); elseprintf("%d不是回文數(shù)\n",num);
system("PAUSE");return0;}
76#include<stdio.h>76總結(jié):循環(huán)結(jié)構(gòu)解題很多題目都需要循環(huán)結(jié)構(gòu)進(jìn)行求解。當(dāng)一時(shí)難以整理出每次循環(huán)(迭代)所做的事情時(shí),可以先看一下如果這件事情交給人做的話,一步一步是怎么做的。在上一步基礎(chǔ)上抽象出循環(huán)結(jié)構(gòu)的四個(gè)方面。77總結(jié):循環(huán)結(jié)構(gòu)解題很多題目都需要循環(huán)結(jié)構(gòu)進(jìn)行求解。77總結(jié):循環(huán)結(jié)構(gòu)解題2和3一般沒(méi)有絕對(duì)的先后順序。在分析清楚2和3后,才分析4(為什么?)。一般將1放在最后分析在4中,要對(duì)出現(xiàn)在2和3中的某些變量進(jìn)行修改,為下次循環(huán)做好準(zhǔn)備,并使得循環(huán)能最終結(jié)束。思考上述四項(xiàng)工作有無(wú)先后順序?應(yīng)該是什么順序?78總結(jié):循環(huán)結(jié)構(gòu)解題2和3一般沒(méi)有絕對(duì)的先后順序。在4中,要對(duì)總結(jié):對(duì)一批數(shù)進(jìn)行處理的模式循環(huán)次數(shù)未知循環(huán)次數(shù)已知79總結(jié):對(duì)一批數(shù)進(jìn)行處理的模式循環(huán)次數(shù)未知循環(huán)次數(shù)已知794.1算法的概念4.2算法的三種基本結(jié)構(gòu)4.3算法的描述方法4.4結(jié)構(gòu)化程序設(shè)計(jì)方法4.5算法設(shè)計(jì)實(shí)例研究提綱804.1算法的概念提綱80例4.14設(shè)計(jì)交通車輛觀測(cè)統(tǒng)計(jì)算法。問(wèn)題描述:在一個(gè)路口設(shè)置一個(gè)探測(cè)器,通過(guò)通信線路連接到后臺(tái)的計(jì)算機(jī)。路口每通過(guò)一輛汽車,探測(cè)器向計(jì)算機(jī)發(fā)出一個(gè)車輛信號(hào)‘1’,探測(cè)器每隔1秒鐘向計(jì)算機(jī)發(fā)出一個(gè)時(shí)鐘信號(hào)‘0’,觀測(cè)結(jié)束向計(jì)算機(jī)發(fā)出結(jié)束信號(hào)‘?!R笤谟?jì)算機(jī)上設(shè)計(jì)一個(gè)程序,能夠接收探測(cè)器發(fā)出的信號(hào),統(tǒng)計(jì)出觀測(cè)的時(shí)長(zhǎng)、在觀測(cè)時(shí)長(zhǎng)內(nèi)通過(guò)的車輛總數(shù)、以及兩輛車之間最大的時(shí)間間隔。問(wèn)題分析:探測(cè)器向計(jì)算機(jī)發(fā)出的信號(hào)可以認(rèn)為是一個(gè)任意長(zhǎng)的字符序列(以‘#’結(jié)束),比如:“011011000111101#”,這樣設(shè)計(jì)程序?qū)嶋H上演變?yōu)樽x取該字符序列,然后進(jìn)行相關(guān)的操作?!?’4.5算法設(shè)計(jì)實(shí)例研究觀測(cè)時(shí)長(zhǎng):字符序列中’0’的個(gè)數(shù)(6秒);車輛總數(shù):字符序列中’1’的個(gè)數(shù)(9輛);兩車間最大時(shí)間間隔:兩個(gè)’1’之間的最大連續(xù)’0’的個(gè)數(shù)(3秒);探測(cè)器81例4.14設(shè)計(jì)交通車輛觀測(cè)統(tǒng)計(jì)算法。問(wèn)題分析:探測(cè)器向計(jì)計(jì)算觀測(cè)時(shí)長(zhǎng)(‘0’的個(gè)數(shù))和車輛總數(shù)(‘1’的個(gè)數(shù))是容易實(shí)現(xiàn)的,但是如何計(jì)算最大時(shí)間間隔需要進(jìn)一步考慮。在對(duì)一個(gè)比較復(fù)雜的問(wèn)題進(jìn)行分析時(shí),我們應(yīng)該采用分而治之的方法,將復(fù)雜的問(wèn)題分解為相對(duì)比較簡(jiǎn)單的問(wèn)題,再針對(duì)該較簡(jiǎn)單問(wèn)題進(jìn)行求解。我們首先設(shè)計(jì)算法主體框架?!?000110100011010#”!注意:2006年9月出版的教材假設(shè)接收到的信號(hào)總是以‘1’開(kāi)始,因此算法會(huì)有所簡(jiǎn)化82計(jì)算觀測(cè)時(shí)長(zhǎng)(‘0’的個(gè)數(shù))和車輛總數(shù)(‘1’的個(gè)數(shù))是容易“0000110100011010#”signal!=‘#’待細(xì)化83“0000110100011010#”signal!=‘#’8484Level1層算法設(shè)計(jì)第0層算法第1層算法85Level1層算法設(shè)計(jì)第0層算法第1層算法85“0000110100011010#”分析:處理時(shí)鐘信號(hào)‘0’觀測(cè)時(shí)長(zhǎng)seconds加1;兩種情況。如果此前已接收到車輛信號(hào)‘1’
(如何判斷?),則間隔時(shí)長(zhǎng)interval加1;否則不做任何處理。86“0000110100011010#”分析:處理時(shí)鐘信號(hào)‘0“0000110100011010#”分析:處理車輛信號(hào)‘1’第一種:“0000110100011010#”(這是第一個(gè)‘1’)車輛總數(shù)vehicles加1第二種:“0000110100011010#”(不是第一個(gè)‘1’,且前一個(gè)信號(hào)也是‘1’)車輛總數(shù)vehicles加1第三種:“0000110100011010#”(不是第一個(gè)‘1’,且前一個(gè)信號(hào)是‘0’)車輛總數(shù)vehicles加1處理是否要更新最長(zhǎng)時(shí)間間隔(interval:兩車之間的時(shí)間間隔,longest:兩車之間的最長(zhǎng)時(shí)間間隔)87“0000110100011010#”分析:處理車輛信號(hào)‘1“0000110100011010#”分析:處理車輛信號(hào)‘1’vehicles=vehicles
+1;情況1:第一個(gè)‘1’判斷式:vehicles
==1情況2:不是第一個(gè)‘1’,且前一個(gè)信號(hào)也是‘1’判斷式:vehicles>1&&interval==0情況3:不是第一個(gè)‘1’,且前一個(gè)信號(hào)是‘0’:判斷式:vehicles>1&&interval>0處理:1)若interval>longest 則longest=interval。2)interval=0。情況1情況3情況288“0000110100011010#”分析:處理車輛信號(hào)‘1“0000110100011010#”驗(yàn)證算法【程序演示】89“0000110100011010#”驗(yàn)證算法【程序演示】8#include<stdio.h>main(){intvehicles;//記錄車輛信號(hào)總數(shù)
intseconds;//記錄時(shí)鐘信號(hào)總數(shù)
intlongest;//記錄最長(zhǎng)時(shí)間間隔
intinterval;//記錄時(shí)間間隔
charsignal;//存放讀取的信號(hào)
/*初始化設(shè)置*/vehicles=0;seconds=0;longest=0;interval=0;printf("pleaseinputsignal:\n");scanf("%c",&signal); /*讀入第一個(gè)信號(hào)*/90#include<stdio.h>90
/*循環(huán)結(jié)構(gòu)處理輸入信號(hào)的字符序列,邊讀取邊處理*/while(signal!='#'){if(signal=='1'){/*處理車輛信號(hào)*/vehicles=vehicles+1;if(vehicles>1&&interval>0){if(interval>longest)longest=interval;interval=0;}}else{/*處理時(shí)鐘信號(hào)*/seconds=seconds+1;if(vehicles>0)interval=interval+1;}scanf("%c",&signal);}
91/*循環(huán)結(jié)構(gòu)處理輸入信號(hào)的字符序列,邊讀取邊處理*/9/*輸出結(jié)果*/printf("%dvehiclespassedin%dseconds\n",vehicles,seconds);printf("thelongestgapwas%dseconds\n",longest);
system("PAUSE");return0;}92/*輸出結(jié)果*/92練習(xí):將一個(gè)由數(shù)字字符組成的字符串轉(zhuǎn)換為整數(shù)或者小數(shù)并輸出。如: 輸入:134.567#輸出:134.56793練習(xí):將一個(gè)由數(shù)字字符組成的字符串轉(zhuǎn)換為整數(shù)或者小數(shù)并輸出。#include<stdio.h>main(){charch;intnum;//存放小數(shù)點(diǎn)前面的字符轉(zhuǎn)換后得到的整數(shù)floatfnum;//存放小數(shù)點(diǎn)后面的字符轉(zhuǎn)換后得到的浮點(diǎn)數(shù)intn;//存放字符對(duì)應(yīng)的數(shù)字intp;//存放小數(shù)點(diǎn)后面的字符轉(zhuǎn)換后得到的數(shù)字對(duì)應(yīng)的基數(shù)1/p。小數(shù)點(diǎn)后第一位數(shù)的基數(shù)是1/10intflag;//用于表示輸入的字符中是否有小數(shù)點(diǎn)。若有,則flag值為1;否則為0num=0;fnum=0;p=10;flag=0;printf("pleaseinputthestring:");算法1:讀情況對(duì)字符進(jìn)行處理94#include<stdio.h>算法1:讀情況對(duì)字符進(jìn)行
scanf("%c",&ch);while(ch!='#'){if(ch=='.')flag=1;//flag為1,表示輸入了小數(shù)點(diǎn)
else{//處理小數(shù)點(diǎn)之前的字符n=ch-'0';if(flag==0){//若輸入的是小數(shù)點(diǎn)之前的數(shù)
num=num*10+n;}else{//處理小數(shù)點(diǎn)之后的字符fnum=fnum+(float)n/p;//必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,否則n/p結(jié)果為0p=p*10;}}scanf("%c",&ch);}95scanf("%c",&ch);95
if(flag==0)printf("theresultis:%d\n",num);elseprintf("theresultis:%f\n",num+fnum);system("pause");return0;}96if(flag==0)96
#include<stdio.h>main(){charch;intnum;floatfnum;intn;intp;
printf("pleaseinputthestring:");//處理整數(shù)部分
num=0;;scanf("%c",&ch);while(ch!='.'&&ch!='#'){n=ch-'0';num=num*10+n;scanf("%c",&ch);}算法2:先循環(huán)處理小數(shù)點(diǎn)前面的字符,再循環(huán)處理小數(shù)點(diǎn)后面的字符97#include<stdio.h>算法2:先循環(huán)處理小數(shù)點(diǎn)
if(ch=='.'){//處理小數(shù)部分
p=10;scanf("%c",&ch);while(ch!='#'){n=ch-'0';fnum=fnum+(float)n/p;//必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,否則n/p結(jié)果為0scanf("%c",&ch);p=p*10;}}
if(fnum>0)printf("theresultis:%d\n",num);elseprintf("theresultis:%f\n",num+fnum);
system("pause");return0;}98if(ch=='.'){98迭代算法迭代算法是用計(jì)算機(jī)解決問(wèn)題的一種基本方法。它利用計(jì)算機(jī)運(yùn)算速度快、適合做重復(fù)性操作的特點(diǎn),讓計(jì)算機(jī)對(duì)一組指令(或一定步驟)進(jìn)行重復(fù)執(zhí)行,在每次執(zhí)行這組指令(或這些步驟)時(shí),都從變量的原值推出它的一個(gè)新值。利用迭代算法解決問(wèn)題,需要做好以下三個(gè)方面的工作
①確定迭代變量ai。在可以用迭代算法解決的問(wèn)題中,至少存在一個(gè)直接或間接地不斷由舊值遞推出新值的變量,這個(gè)變量就是迭代變量。
②建立迭代關(guān)系式,即ai=f(ai-1)③對(duì)迭代過(guò)程進(jìn)行控制。迭代過(guò)程的控制通??煞譃閮煞N情況:一種是所需的迭代次數(shù)是個(gè)確定的值,可以計(jì)算出來(lái);另一種是所需的迭代次數(shù)無(wú)法確定。對(duì)于前一種情況,可以構(gòu)建一個(gè)固定次數(shù)的循環(huán)來(lái)實(shí)現(xiàn)對(duì)迭代過(guò)程的控制;對(duì)于后一種情況,需要進(jìn)一步分析出用來(lái)結(jié)束迭代過(guò)程的條件。99迭代算法迭代算法是用計(jì)算機(jī)解決問(wèn)題的一種基本方法。它利用計(jì)算例4.15猴子吃桃問(wèn)題:有一堆桃子不知數(shù)目,猴子第一天吃掉一半,覺(jué)得不過(guò)癮,又多吃了一只,第二天照此辦理,吃掉剩下桃子的一半另加一個(gè),天天如此,到第十天早上,猴子發(fā)現(xiàn)只剩一只桃子了,問(wèn)這堆桃子原來(lái)有多少個(gè)?
4.5算法設(shè)計(jì)實(shí)例研究100例4.15猴子吃桃問(wèn)題:有一堆桃子不知數(shù)目,猴子第一天吃掉分析:假設(shè)第一天早上吃前有桃子a1個(gè),第二天早上吃前有桃子a2個(gè),第三天早上吃前有桃子a3個(gè),以此類推,則a2=a1-(a1/2+1)=a1/2-1…a9=a8-(a8/2+1)=a8/2-1a10=a9-(a9/2+1)=a9/2-1=1
可見(jiàn),在已知a10的情況下,可以求得a9,已知a9可以求得a8……最終求得a1101分析:假設(shè)第一天早上吃前有桃子a1個(gè),第二天早上吃前有桃子a即:a9=2×(a10+1)a8=2×(a9+1)┇a1=2×(a2+1)
也就是:ai=2×(ai+1+1)i=9,8,7,6,...,1現(xiàn)在已知a10值為1,可以采用迭代法求得a1。102即:102103103依次計(jì)算出第9天、第8天……第1天吃前的桃子數(shù)current_day_count表示當(dāng)天的桃子數(shù),代表數(shù)學(xué)模型中的ai。初始值是1,代表第10天早上的桃子數(shù)是1。day_count表示第幾天,代表數(shù)學(xué)模型中的i。初始值為9,代表第一次循環(huán)求的是第9天早上的桃子數(shù)。【程序演示】104依次計(jì)算出第9天、第8天……第1天吃前的桃子數(shù)current#include<stdio.h>main(){intday;//表示當(dāng)前求解的是第幾天吃前的桃子數(shù)
intpeach;//示某一天的桃子數(shù)
day=9;//第一次循環(huán)求第9天吃前的桃子數(shù)
peach=1;//第10天吃前的桃子數(shù)是1
while(day>=1){peach=2*(peach+1);day=day-1;}
printf("桃子數(shù)是:%d",peach);system("pause");}105#include<stdio.h>105第一天:1534個(gè)桃子第二天:766個(gè)桃子第三天:382個(gè)桃子第四天:190個(gè)桃子第五天:94個(gè)桃子第六天:46個(gè)桃子第七天:22個(gè)桃子第八天:10個(gè)桃子第九天:4個(gè)桃子第十天:1個(gè)桃子106第一天:1534個(gè)桃子106CommonProblems:{Sentence1;Sentence2;…};(if,while,for…)main(),107CommonProblems:107逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式逗號(hào)運(yùn)算符,用于把幾個(gè)表達(dá)式串在一起。逗號(hào)表達(dá)式含有逗號(hào)運(yùn)算符的表達(dá)式,實(shí)現(xiàn)對(duì)各個(gè)表達(dá)式的順序求值,主要用于for語(yǔ)句中。執(zhí)行過(guò)程先計(jì)算表達(dá)式1,然后依次計(jì)算其后的各個(gè)表達(dá)式的值,并將最右邊那個(gè)表達(dá)式的值作為逗號(hào)表達(dá)式的值。表達(dá)式1,表達(dá)式2,…
,表達(dá)式ny=10;x=(y=y-5,30/y);//運(yùn)算后y=5,x=6。//逗號(hào)表達(dá)式優(yōu)先級(jí)比賦值表達(dá)式低,所以必須加括號(hào)108逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式表達(dá)式1,表達(dá)式2,…,表達(dá)式ny總結(jié):循環(huán)結(jié)構(gòu)解題很多題目都需要循環(huán)結(jié)構(gòu)進(jìn)行求解。當(dāng)一時(shí)難以整理出每次循環(huán)(迭代)所做的事情時(shí),可以先看一下如果這件事情交給人做的話,一步一步是怎么做的。在上一步基礎(chǔ)上抽象出循環(huán)結(jié)構(gòu)的四個(gè)方面。109總結(jié):循環(huán)結(jié)構(gòu)解題很多題目都需要循環(huán)結(jié)構(gòu)進(jìn)行求解。109總結(jié):循環(huán)結(jié)構(gòu)解題2和3一般沒(méi)有絕對(duì)的先后順序。在分析清楚2和3后,才分析4(為什么?)。一般將1放在最后分析在4中,要對(duì)出現(xiàn)在2和3中的某些變量進(jìn)行修改,為下次循環(huán)做好準(zhǔn)備,并使得循環(huán)能最終結(jié)束。思考上述四項(xiàng)工作有無(wú)先后順序?應(yīng)該是什么順序?110總結(jié):循環(huán)結(jié)構(gòu)解題2和3一般沒(méi)有絕對(duì)的先后順序。在4中,要對(duì)總結(jié):對(duì)一批數(shù)進(jìn)行處理的模式循環(huán)次數(shù)未知循環(huán)次數(shù)已知111總結(jié):對(duì)一批數(shù)進(jìn)行處理的模式循環(huán)次數(shù)未知循環(huán)次數(shù)已知111迭代算法迭代算法是用計(jì)算機(jī)解決問(wèn)題的一種基本方法。它利用計(jì)算機(jī)運(yùn)算速度快、適合做重復(fù)性操作的特點(diǎn),讓計(jì)算機(jī)對(duì)一組指令(或一定步驟)進(jìn)行重復(fù)執(zhí)行,在每次執(zhí)行這組指令(或這些步驟)時(shí),都從變量的原值推出它的一個(gè)新值。利用迭代算法解決問(wèn)題,需要做好以下三個(gè)方面的工作
①確定迭代變量ai。在可以用迭代算法解決的問(wèn)題中,至少存在一個(gè)直接或間接地不斷由舊值遞推出新值的變量,這個(gè)變量就是迭代變量。
②建立迭代關(guān)系式,即ai=f(ai-1)③對(duì)迭代過(guò)程進(jìn)行控制。迭代過(guò)程的控制通??煞譃閮煞N情況:一種是所需的迭代次數(shù)是個(gè)確定的值,可以計(jì)算出來(lái);另一種是所需的迭代次數(shù)無(wú)法確定。對(duì)于前一種情況,可以構(gòu)建一個(gè)固定次數(shù)的循環(huán)來(lái)實(shí)現(xiàn)對(duì)迭代過(guò)程的控制;對(duì)于后一種情況,需要進(jìn)一步分析出用來(lái)結(jié)束迭代過(guò)程的條件。112迭代算法迭代算法是用計(jì)算機(jī)解決問(wèn)題的一種基本方法。它利用計(jì)算練習(xí)6:一個(gè)皮球從100m高處落下,每次落地后反彈到原來(lái)高度的一半。編寫(xiě)程序,求20次反彈時(shí)彈起的高度?!境绦蜓菔尽糠治觯篴0=100a1=a0/2a2=a1/2…a20=a19/2113練習(xí)6:一個(gè)皮球從100m高處落下,每次落地后反彈到原來(lái)高度#include<stdio.h>#defineTIMES20main(){inttimes;//記錄是第幾次彈起
doubleheight;//記錄小球彈起時(shí)的高度
height=10000.0;/*height的單位是cm*/times=1;/*第一次循環(huán)求第1次彈起高度*/
while(times<=TIMES){height=height/2;/*除以2后的height表示第times次彈起的高度*/times=times+1;}
printf("第%d次小球彈起的高度是%f厘米",TIMES,height);
return0;}
114#include<stdio.h>114練習(xí)7:在許多情況下,知道一個(gè)數(shù)是否是素?cái)?shù)還不夠,有時(shí),還需要知道它的約數(shù)。每個(gè)大于1的正整數(shù)都能表示為素?cái)?shù)的乘積。這個(gè)因數(shù)分解是唯一的,被稱為素?cái)?shù)分解(primefactorization)。例如,數(shù)字60=2*2*3*5,799=17*47,其中每一個(gè)約數(shù)都是素?cái)?shù)。注意,同一個(gè)素?cái)?shù)在因數(shù)分解中可以出現(xiàn)多次。設(shè)計(jì)一個(gè)算法顯示數(shù)n的素?cái)?shù)分解。要求用自頂向下、逐步求精的方法設(shè)計(jì)算法。115練習(xí)7:在許多情況下,知道一個(gè)數(shù)是否是素?cái)?shù)還不夠,有時(shí),還需問(wèn)題分析:60=2*2*3*5f(p)=n*f(p/n),n是p的最小質(zhì)數(shù)因子對(duì)p進(jìn)行素?cái)?shù)分解,可以轉(zhuǎn)化為兩步:1:找到p的最小質(zhì)數(shù)因子n;2:對(duì)p/n繼續(xù)進(jìn)行素?cái)?shù)分解;116問(wèn)題分析:60=2*2*3*5116isPrim=1;j=2;當(dāng)j*j<=i而且isPrim==1i是否被j整除nyj++isPrim=0isPrim為1表示質(zhì)數(shù)。設(shè)置初始最小質(zhì)因數(shù)n=prePrim設(shè)置能否找到質(zhì)因數(shù)found為0當(dāng)n≤p而且found==0時(shí)判斷n是否是質(zhì)數(shù),結(jié)果存于isPrim中nyisPrim==1p整除nynfound=1i是最小的質(zhì)因數(shù)prePrim=in=n+1n=n+1素?cái)?shù)分解算法1:prePrim=2當(dāng)p!=1時(shí)求p的最小質(zhì)因數(shù)n輸出np=p/n輸入一個(gè)整數(shù)p每一次找質(zhì)因數(shù)都是從prePrim開(kāi)始試探117isPrim=1;j=2;當(dāng)j*j<=i而且isPrim==f(p)=n*f(p/n),
p從2開(kāi)始試探,逐漸變大(加1)。若試探過(guò)程中發(fā)現(xiàn)p能被n整除,則n肯定是素?cái)?shù)。原因分析:根據(jù)題意,任何合數(shù)均能分解為若干個(gè)素?cái)?shù)的乘積。假設(shè)n為6且p除以n余數(shù)為0,則n=6*……, 由于6=2*3,因此n=2*3*…,在分解出6之前早就已經(jīng)分解得到2*3了,所以p不可能為6。其他的合數(shù)也是如此。素?cái)?shù)分解算法2:118f(p)=n*f(p/n),p從2開(kāi)始試探,逐漸變大(加1窮舉法解題窮舉法解題解題思路:對(duì)可能是解的眾多候選解按某種順序進(jìn)行逐一枚舉和檢驗(yàn),從中找出那些符合要求的候選解作為問(wèn)題的解。如:打印所有除以11后所得商正好是它的各個(gè)數(shù)字平方和的三位數(shù)。119窮舉法解題窮舉法解題119窮舉法解題例1:編寫(xiě)程序,求出所有5、6、7組成的、且各位數(shù)字互不相同的三位數(shù)。
⑴明確所有的組合情況百位可以是5,6,7十位可以是5,6,7個(gè)位可以是5,6,7⑵檢查是否滿足約束條件百、十、個(gè)位互不相同對(duì)候選解進(jìn)行檢驗(yàn)并輸出120窮舉法解題例1:編寫(xiě)程序,求出所有5、6、7組成的、窮舉法解題算法優(yōu)化:【程序演示】121窮舉法解題算法優(yōu)化:【程序演示】1215、6、7組成的數(shù)#include<stdio.h>main(){inthigh,mid,low;//依次記錄最高位、中間位、最低位數(shù)字
intcount=0;
printf("5、6、7可組成的且各位數(shù)字互不相同的數(shù)有:\n");for(high=5;high<=7;high++)for(mid=5;mid<=7;mid++)if(high!=mid)for(low=5;low<=7;low++)if(low!=high&&low!=mid){count++; printf("%d\t",high*100+mid*10+low); if(count%3==0) printf("\n"); }
return0;}1225、6、7組成的數(shù)#include<stdio.h>122窮舉法解題例2:5位跳水高手將參加10m高臺(tái)跳水決賽,好事者讓5人據(jù)實(shí)力預(yù)測(cè)比賽結(jié)果。 A選手說(shuō):B第二,我第三; B選手說(shuō):我第二,E第四; C選手說(shuō):我第一,D第二; D選手說(shuō):C最后,我第三; E選手說(shuō):我第四,A第一。 決賽成績(jī)公布后,每位選手的預(yù)測(cè)都說(shuō)對(duì)了一半,即一對(duì)一錯(cuò)。請(qǐng)?jiān)O(shè)計(jì)算法求出比賽的實(shí)際名次。123窮舉法解題例2:5位跳水高手將參加10m高臺(tái)跳水決賽,好事者明確組合情況:A可以是第一、第二、第三、第四或者第五B可以是第一、第二、第三、第四或者第五C可以是第一、第二、第三、第四或者第五D可以是第一、第二、第三、第四或者第五E可以是第一、第二、第三、第四或者第五檢查是否滿足約束條件:A說(shuō):B第二,A第三;B說(shuō):B第二,E第四;C說(shuō):C第一,D第二;D說(shuō):C第五,D第三;E說(shuō):E第四,A第一。而且都只說(shuō)對(duì)了一半。窮舉法解題124明確組合情況:窮舉法解題124例2算法主體框架125例2算法主體框架125檢測(cè)條件:A說(shuō):B第二,A第三;B說(shuō):B第二,E第四;C說(shuō):C第一,D第二;D說(shuō):C第五,D第三;E說(shuō):E第四,A第一。而且都只說(shuō)對(duì)了一半。(b==2&&a!=3||b!=2&&a==3)&&(b==2&&e!=4||b!=2&&e==4)&&(c==1&&d!=2||c!=1&&d==2)&&(c==5&&d!=3||c!=5&&d==3)&&(e==4&&a!=1||e!=4&&a==1)countA=(b==2)+(a==3);countB=(b==2)+(e==4);countC=(c==1)+(d==2);countD=(c==5)+(d==3);countE=(e==4)+(a==1);if(countA==1&&countB==1&&countC==1&&countD==1&&countE==1)126檢測(cè)條件:A說(shuō):B第二,A第三;(b==2&&a!=3比賽名次-1main(){inta,b,c,d,e;//用于記錄A~E分別的名次
intcountA,countB,countC,countD,countE;//用于記錄A~E分別說(shuō)對(duì)的話個(gè)數(shù)
for(a=1;a<=5;a++)//a~e分別代表A~E選手的名次
for(b=1;b<=5;b++) if(a!=b)for(c=1;c<=5;c++) if(c!=a&&c!=b) for(d=1;d<=5;d++) if(d!=a&&d!=b&&d!=c) for(e=1;e<=5;e++) if(e!=a&&e!=b&&e!=c&&e!=d) if((b==2&&a!=3||b!=2&&a==3)&&(b==2&&e!=4||b!=2&&e==4)&&(c==1&&d!=2||c!=1&&d==2)&&(c==5&&d!=3||c!=5&&d==3)&&(e==4&&a!=1||e!=4&&a==1)){ printf("比賽名次是:\n"); printf("A:第%d名\nB:第%d名\nC:第%d名\nD:第%d名\nE:第%d名\n",a,b,c,d,e);}//if
return0; }127比賽名次-1main()127比賽名次-2main(){inta,b,c,d,e;//用于記錄A~E分別的名次
intcountA,countB,countC,countD,countE;//用于記錄A~E分別說(shuō)對(duì)的話個(gè)數(shù)
for(a=1;a<=5;a++)//a~e分別代表A~E選手的名次
for(b=1;b<=5;b++) if(a!=b)for(c=1;c<=5;c++) if(c!=a&&c!=b) for(d=1;d<=5;d++) if(d!=a&&d!=b&&d!=c) for(e=1;e<=5;e++) if(e!=a&&e!=b&&e!=c&&e!=d){ countA=(b==2)+(a==3);countB=(b==2)+(e==4); countC=(c==1)+(d==2); countD=(c==5)+(d==3); countE=(e==4)+(a==1); if(countA==1&&countB==1&&countC==1&&countD==1&&countE==1){ printf("比賽名次是:\n"); printf("A:第%d名\nB:第%d名\nC:第%d名\nD:第%d名\nE:第%d名\n",a,b,c,d,e); }//if }//ifreturn0; }128比賽名次-2main()128練習(xí):百雞問(wèn)題:用100元買(mǎi)100只雞,大公雞5元1只,母雞3元1只,小雞1元3只。問(wèn)各能買(mǎi)多少只?main(){intcock
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 體操用跳板產(chǎn)品供應(yīng)鏈分析
- 冷凍機(jī)器和設(shè)備的修理或維護(hù)行業(yè)經(jīng)營(yíng)分析報(bào)告
- 全險(xiǎn)保險(xiǎn)和再保險(xiǎn)經(jīng)紀(jì)行業(yè)營(yíng)銷策略方案
- 眼鏡片清洗溶液市場(chǎng)分析及投資價(jià)值研究報(bào)告
- 西洋跳棋游戲項(xiàng)目運(yùn)營(yíng)指導(dǎo)方案
- 冷鏈烘焙產(chǎn)品行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 藥用靈芝孢子粉市場(chǎng)分析及投資價(jià)值研究報(bào)告
- 家用基因檢測(cè)設(shè)備行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 苯胺印刷機(jī)市場(chǎng)發(fā)展前景分析及供需格局研究預(yù)測(cè)報(bào)告
- 用于驅(qū)蟲(chóng)的杉木項(xiàng)目運(yùn)營(yíng)指導(dǎo)方案
- 數(shù)字電子設(shè)計(jì)報(bào)告生理刺激反應(yīng)時(shí)間測(cè)試儀
- 5.32.4園路、廣場(chǎng)硬質(zhì)鋪裝工程檢驗(yàn)批質(zhì)量驗(yàn)收記錄
- 相逢在花季――青春期心理健康
- 市場(chǎng)監(jiān)管局執(zhí)法文書(shū)可編輯版現(xiàn)場(chǎng)檢查筆錄
- 布草洗滌程序
- 最新小學(xué)四年級(jí)部編語(yǔ)文上冊(cè)-第四單元考點(diǎn)梳理(含答案)
- IPC4552中文.doc
- 和泉PLC編程軟件
- 《Flash CC動(dòng)畫(huà)制作》教學(xué)大綱 課程標(biāo)準(zhǔn) 最全最新
- 高噴防滲技術(shù)交底
- 大班語(yǔ)言《風(fēng)在哪里》ppt課件[共12頁(yè)]
評(píng)論
0/150
提交評(píng)論