版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Date: 04 August 2022C語言程序設計案例教程(三)第1頁,共131頁。Date: 04 八月 2022第三章結(jié) 構(gòu) 化 程 序 設 計第2頁,共131頁。授課要點循環(huán)的嵌套結(jié)構(gòu)第3頁,共131頁。問題:打印如下圖案123456789123456789123456789123456789123456789112123123412345第4頁,共131頁。問題解答1#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=9;j+)printf(%d,j);printf(n);第5頁,共131頁。問題解答2#include void
2、 main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(%d,j);printf(n);第6頁,共131頁。問題:打印如下圖案* * * * *第7頁,共131頁。問題解答3#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“*);printf(n);第8頁,共131頁。問題解答4#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf( );for(j=1;j=i;j+)printf(*);
3、printf(n);第9頁,共131頁。問題:打印如下圖案 * * * *第10頁,共131頁。問題解答5#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf( );for(j=1;j=2*i-1;j+)printf(*);printf(n);第11頁,共131頁。模仿練習* * * * * * * * *第12頁,共131頁。小組討論并總結(jié)循環(huán)嵌套的執(zhí)行過程“控制流程”編碼中的常見錯誤。第13頁,共131頁。結(jié)論1循環(huán)嵌套的執(zhí)行過程執(zhí)行順序:1、語句12、判斷表達式:如果為假,執(zhí)行語句5;如果為真執(zhí)行另一個循環(huán)語
4、句塊3、執(zhí)行語句24、判斷表達式2:如果為假,執(zhí)行語句4,轉(zhuǎn)回表達式1;如果為真,循環(huán)執(zhí)行語句3第14頁,共131頁。結(jié)論2“控制流程”中常見錯誤ifelse不配對switch中表達式類型與case語句的值不匹配 無結(jié)束條件,死循環(huán)循環(huán)次數(shù)不清楚誤用break和continue第15頁,共131頁。學以致用尋找你身邊的一個實際問題,構(gòu)造出解決問題的表達式,描述解決問題的算法,以及編寫解決問題的程序。例如:假設你在某公司工作,老板要你打印一張表,買主可以用它來購買多個特定部件的費用。單個部件的價格從1元到9元不等。N件東西的費用就是單價與數(shù)量相乘得出。因此,你要打印一張像下面這樣的數(shù)字表: 某公
5、司部件費用明細表 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 2007年4月7日 第16頁,共131頁。作業(yè)【練習1】將1、2、3、9打印15行?!揪毩?】打印如下圖案: * * * * * * *第17頁,共131頁。【練習3】打印九九乘法表,如圖所示第18頁,共131頁。Date: 04 八月 2022第三章結(jié) 構(gòu) 化 程 序 設 計第19頁,共131頁。授課要點循環(huán)的嵌套結(jié)構(gòu)嵌套結(jié)構(gòu)的轉(zhuǎn)換第20頁,共131頁。問題:輸入一個數(shù)n,求其階乘分析規(guī)律:1!=
6、12!=2*1=2*1!3!=3*2*1 =3*2!4!=4*3*2*1=4*3!n!=n*(n-1)*(n-2)*3*2*1=n*(n-1)!利用循環(huán)結(jié)構(gòu)來實現(xiàn)第21頁,共131頁。編程思路(1)用變量n保存待計算階乘數(shù)的數(shù)據(jù),用p保存逐項累乘的結(jié)果,初值為1;(2)循環(huán)變量i的初值為1;(3)如果i超過n值,循環(huán)結(jié)束,轉(zhuǎn)(6);(4)每次循環(huán),將變量i與p相乘,結(jié)果保留到p中;(5)循環(huán)變量i增加1,轉(zhuǎn)回到(3);(6)輸出累乘結(jié)果p,結(jié)束運行。第22頁,共131頁。流程圖及代碼int n;/*存儲計算階乘的n值*/scanf(“%d”,&n); /*取得輸入值n*/int j; /*循環(huán)
7、變量j*/int p; /*累乘結(jié)果p*/for(j=1;j=n;j+)p=p*j; /*累乘,結(jié)果放到p中*/printf(“%d”,p);/*輸入累乘結(jié)果*/第23頁,共131頁。問題:求1!+2!+3!+20!的值分析:1、1-20分別求階乘(p1,p2,p20),然后求各個階乘的和。2、兩重循環(huán)解決問題內(nèi)重循環(huán):n!123n的實現(xiàn)外重循環(huán):p1+p2+p3+p4+ +p20的實現(xiàn)第24頁,共131頁。嵌套循環(huán)流程圖第25頁,共131頁。循環(huán)嵌套雙重循環(huán)兩個while循環(huán)嵌套while()while()語句;內(nèi)重循環(huán)外重循環(huán)兩個for循環(huán)嵌套for()for()語句;第26頁,共131頁
8、。雙重循環(huán)代碼分解/*內(nèi)重循環(huán)代碼*/int j; /*循環(huán)變量*/p=1;for(j=1;j=i;j+)p*=j;/*外重循環(huán)代碼*/int i; /*循環(huán)變量*/int sum=0;/*求和結(jié)果*/for(i=1;i=20;i+)sum=sum+p; /*累加*/printf(“%d”,sum);給出一個個i值得到p值第27頁,共131頁。雙重循環(huán)代碼塊while雙重循環(huán)int i=1;int sum=0;while(i=20) int j=1; int p=1; while(j=i)p=p*j; /*累乘積*/j+;i=i+1;sum=sum+p;相應的for雙重循環(huán)int i,j,su
9、m=0;int p=1;for(int i=1; i=20; i+)for(int j=1;j=i;j+)p=p*j;/*累乘積*/sum=sum+p;第28頁,共131頁。問題擴展在問題中,采用的是兩個while和for循環(huán)的嵌套。能不能換成兩個dowhile循環(huán)的嵌套?能不能換成for、dowhile、while的混合型嵌套?第29頁,共131頁。for循環(huán)和dowhile循環(huán)互換int i=1;int p=1;while(i=20)int j=1; for(int j=1;j=i;j+) p=p*j; i=i+1; sum=sum+p;int i=p=1;while(i=20)int j
10、=1;dop=p*j;j+;while(j=i);i=i+1;sum=sum+p;第30頁,共131頁。問題:搬運磚塊假設有36塊磚,共需36個人搬,男人可搬4塊,女人可搬3塊,小孩兩人搬1塊,要求一次全部搬完,問男、女、小孩人數(shù)的可能組合。思路:男人的可能值是08;女人的可能值是011;小孩的取值是(36男人女人)。第31頁,共131頁。問題:求100200之間的全部素數(shù)什么是素數(shù)?如何判斷m是否是素數(shù)?思路:讓m被2到根號m除,如果m能被其中任何一個整數(shù)整除,則m不是素數(shù)。第32頁,共131頁。小組討論并總結(jié)循環(huán)主菜單是如何跳出循環(huán)的?第33頁,共131頁。結(jié)論3循環(huán)主菜單如何跳出循環(huán)?v
11、oid main()int input;scanf(“%d”,&input);switch(input)case 1:/*語句*/break;/*跳出循環(huán)*/case 2:/*語句*/break; /*跳出循環(huán)*/使用break語句第34頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第35頁,共131頁。授課要點什么是結(jié)構(gòu)化程序設計函數(shù)的定義、聲明、調(diào)用無參無返回值的函數(shù)無參有返回值的函數(shù)第36頁,共131頁。什么是結(jié)構(gòu)化程序設計?自上而下逐步細化的模塊化程序設計方法結(jié)構(gòu)化程序設計的好處是什么?復雜問題簡單化便于多人協(xié)作完成一個大的任務提高程序可維護性、可讀性
12、模塊復用C語言中如何實現(xiàn)結(jié)構(gòu)化程序設計?模塊化在C語言中用函數(shù)實現(xiàn)結(jié)構(gòu)化程序設計第37頁,共131頁。#include #include main() /主函數(shù) int iNo,b;printf(“input a number:n”);/輸出函數(shù)scanf(“%d”,&iNo); /輸入函數(shù)b=sqrt(iNo); /求平方根函數(shù)printf(“%d”,b); /輸出函數(shù)初識函數(shù)1第38頁,共131頁。/*從鍵盤輸入3個數(shù),求和并輸出。*/#include #include int myAdd(int x,int y,int z)int s;s=x+y+z;return s;main() /主
13、函數(shù)int iNo1,iNo2,iNo3,sum;printf(input 3 numbers:n);/輸出函數(shù)scanf(%d%d%d,&iNo1,&iNo2,&iNo3); /輸入函數(shù)sum=myAdd(iNo1,iNo2,iNo3); /用戶自定義函數(shù)printf(sum=%d,sum); /輸出函數(shù)初識函數(shù)2第39頁,共131頁。函數(shù):一段函數(shù)就是一段實現(xiàn)一定功能的代碼,就像一臺具有某種功能機器。因此函數(shù)的調(diào)用就類似啟動一臺機器來完成某個任務。C語言中,函數(shù)是實現(xiàn)模塊化的工具。什么是函數(shù)?第40頁,共131頁。用函數(shù)解決問題輸入若干個學生的學號、某門課程的平時成績和期末成績,計算出總評
14、成績。其中, 總評成績 = 50%*平時成績50*期末成績最后,從鍵盤輸入一個學生的學號,查詢該生的平時成績、期末成績和總評成績。第41頁,共131頁。用函數(shù)解決的思路定義若干具有不同功能的函數(shù),在main函數(shù)中分別調(diào)用它們,用以解決這個問題。如:main() /定義必要的變量 inputScore(); /輸入學生學號及成績信息 computeTotalScore();/計算每個學生的總成績 searchByNo(); /按學號查找某個學生的信息 printSearchInfo();/輸出查找到的學生信息main函數(shù)只負責解決問題的流程;具體子問題的實現(xiàn)交給不同的函數(shù)去處理。第42頁,共13
15、1頁。函數(shù)的定義除了系統(tǒng)提供的函數(shù)外,我們都需要對函數(shù)進行定義。函數(shù)定義的通用形式為: 返回值數(shù)據(jù)類型 函數(shù)名稱(參數(shù)數(shù)據(jù)類型 參數(shù)1 , 參數(shù)數(shù)據(jù)類型 參數(shù)2, ) 函數(shù)首部函數(shù)體第43頁,共131頁。函數(shù)定義示例(1)無參數(shù)無返回值的函數(shù)如:定義printStar函數(shù),用以在屏幕上輸出5個*符號。void printStar( ) int star; for(star=1; star=5; star+) printf(*); printf(n) ;函數(shù)無返回值時使用的數(shù)據(jù)類型第44頁,共131頁。 函數(shù)的調(diào)用無參的調(diào)用形式:函數(shù)名();第45頁,共131頁。無參數(shù)無返回值的函數(shù)的調(diào)用#in
16、clude main( ) printStar( );/函數(shù)調(diào)用void printStar( ) int star; for(star=1; star=5; star+) printf(*); printf(n) ;第46頁,共131頁。自定義函數(shù)的聲明在程序的開頭加上對應函數(shù)的聲明,就不會出現(xiàn)函數(shù)未定義(或重復定義)的錯誤。函數(shù)聲明的形式: 返回值類型 函數(shù)名稱(參數(shù)類型 參數(shù)1, ) ; 其中前面的與函數(shù)定義時的首部完全一樣,但末尾必須加“;”。如對printStar函數(shù)的聲明為: void printStar( );第47頁,共131頁。無參數(shù)無返回值的函數(shù)的聲明#include vo
17、id printStar( ); /函數(shù)聲明main( ) printStar( ); /函數(shù)調(diào)用void printStar( ) /函數(shù)定義(首部) int star; for(star=1; star=5; star+) printf(*); printf(n) ;第48頁,共131頁。 問題:過年回家,車票難買,到處托人。假如你先把車票錢給幫你買車票的朋友, 那么返回給你的應該是一張車票(當然要順利的話)。 同理,在C語言中,函數(shù)的調(diào)用有時候也是有返回值的,那么如何理解?第49頁,共131頁。分析 對應到函數(shù)上,你的朋友就是函數(shù),車票錢是函數(shù)輸入,車票就是函數(shù)的返回值,而你就是調(diào)用函數(shù)
18、的主程序。 第50頁,共131頁。 函數(shù)的返回值函數(shù)的返回值返回語句形式: return(表達式); 或 return 表達式; 或 return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù)第51頁,共131頁。函數(shù)定義示例(2)無參數(shù)有返回值的函數(shù)如定義函數(shù)sum_100,用以求1+2+3+100的和,并將結(jié)果返回給調(diào)用它的函數(shù)。 int sum_100( ) int s=0, i; for(i=1; i=100; i+)s=s+i; return s; /用return返回一個值給主調(diào)函數(shù) 第52頁,共131頁。無參數(shù)有返回值的函數(shù)示例 #include int
19、sum_100( ); /函數(shù)聲明 main( ) int s1; s1 = sum_100( ); /函數(shù)調(diào)用 printf(和值為:%dn, s1); int sum_100( ) /函數(shù)定義(首部) int s=0, i; for(i=1; i=100; i+)s=s+i; return s; /返回值給主調(diào)函數(shù) 第53頁,共131頁。模仿練習無參無返回值函數(shù)編寫:1、自定義函數(shù)myPrint1(),在屏幕上輸出如下圖形(每行10個$符號),并在主函數(shù)中調(diào)用myPrint1()函數(shù)。 $ $ $第54頁,共131頁。模仿練習無參無返回值函數(shù)編寫:2、自定義函數(shù)myPrint2(),在屏幕
20、上輸出如下圖形,并在主函數(shù)中調(diào)用myPrint2()函數(shù)。 第55頁,共131頁。模仿練習無參有返回值函數(shù)編寫:3、自定義函數(shù)myFac(),計算10!,將計算結(jié)果返回給調(diào)用者。然后在主函數(shù)中調(diào)用myFac()函數(shù),輸出該結(jié)果。4、自定義函數(shù)myMax(),實現(xiàn)功能:從鍵盤輸入3個數(shù),求最大數(shù)并在主函數(shù)中調(diào)用myMax()函數(shù),輸出該結(jié)果。第56頁,共131頁。小組討論并總結(jié)1、為什么使用函數(shù)?2、如何理解函數(shù)調(diào)用與函數(shù)定義的不同?3、空函數(shù)在程序結(jié)構(gòu)設計中有什么作用?第57頁,共131頁。學以致用尋找你身邊的一個實際問題,編寫解決問題的程序,用到函數(shù)定義和調(diào)用。例、電視是我們?nèi)粘I钪兴煜?/p>
21、的,我們通過遙控器選擇不同的頻道,就可以播放相應的頻道。請定義一個函數(shù)tvPlay( int channel) ,模擬根據(jù)遙控器的輸入的頻道號碼,播放相應的頻道。然后給出調(diào)用的例子,比如,遙控器上選擇 5, 則播放CCTV-5體育頻道。第58頁,共131頁。作業(yè)每人必做1 、編寫一個函數(shù)sum(n),計算1+2+n 之和,根據(jù)n值的不同,得到不同的值。要求分別計算n50,n80,n100的情況。2、 將自己的“學生成績管理系統(tǒng)”(循環(huán)菜單)以模塊化的形式進行處理,具體實施方案:主菜單的顯示和選擇部分可定義函數(shù)menu_select()來調(diào)用,“編輯子菜單”可定義editmenu()來調(diào)用,“查
22、找”可定義serachmenu()來調(diào)用。第59頁,共131頁。作業(yè)小組必做尋找你身邊的一個實際問題,構(gòu)造出解決問題的表達式,描述解決問題的算法,以及編寫解決問題的程序。例如,MP3可以播放不同的歌曲,請編寫一個MP3模擬函數(shù),根據(jù)輸入不同的歌曲代號,可以顯示相應的歌曲名。然后,調(diào)用該函數(shù)。第60頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第61頁,共131頁。授課要點有參無返回值的函數(shù)有參有返回值的函數(shù)第62頁,共131頁。函數(shù)定義示例(3)有參數(shù)無返回值的函數(shù)如定義printStar_n()函數(shù),用以在屏幕的一行上輸出n個*號。其中n的值是由調(diào)用該函數(shù)的
23、函數(shù)傳遞過來的。 void printStar_n( int n) int star; for(star=1; star=n; star+)printf(*); printf(n); 函數(shù)參數(shù)(稱為形參)第63頁,共131頁。 函數(shù)調(diào)用有參函數(shù)的調(diào)用形式:函數(shù)名(實參);實參與形參:個數(shù)相等類型一致按順序一一對應第64頁,共131頁。有參數(shù)無返回值的函數(shù)調(diào)用 #include void printStar2(int n); /函數(shù)聲明 main( ) int starNum; scanf(%d, &starNum); printStar_n(starNum); /函數(shù)調(diào)用 void print
24、Star_n( int n) /函數(shù)定義(首部) int star; for(star=1; star=n; star+)printf(*); printf(n); 函數(shù)參數(shù)(稱為形參)調(diào)用時傳遞的參數(shù)(稱為實參)第65頁,共131頁。函數(shù)定義示例(4)有參數(shù)有返回值的函數(shù)如定義函數(shù)sum_n(),用以求1+2+3+n的和,并將結(jié)果返回給調(diào)用它的函數(shù)。 int sum_n( int n ) int s=0, i; for(i=1; i=n; i+)s=s+i;return s; /通過return返回一個值 函數(shù)參數(shù)(稱為形參)第66頁,共131頁。 #include int sum_n( i
25、nt n ); /函數(shù)聲明 main( ) int s1, n; scanf(%d, &n); s1 = sum_n( n ); /函數(shù)調(diào)用 printf(和值為:%dn, s1); int sum_n( n ) /函數(shù)定義 (首部) int s=0, i; for(i=1; i=n; i+) s=s+i; return s; /返回一個值給主調(diào)函數(shù) 有參數(shù)有返回值的函數(shù)調(diào)用第67頁,共131頁。 函數(shù)的調(diào)用1、語句調(diào)用方式2、函數(shù)表達式3、函數(shù)參數(shù) 第68頁,共131頁。 函數(shù)的調(diào)用調(diào)用方式語句調(diào)用: 例 printmsg(); printf(“打印成功!n”);函數(shù)表達式調(diào)用: 例 res
26、ult=aver(totalscore, stuno);函數(shù)參數(shù)調(diào)用: 例 printf(“%f”,aver(totalscore, stuno); 第69頁,共131頁。隨堂實踐有參無返回值函數(shù)編寫:1、自定義函數(shù)myprint_n(),在屏幕的一行上輸出n個$符號。在主函數(shù)中調(diào)用myprint_n()函數(shù),輸出如下圖形(每行上的符號個數(shù)由調(diào)用它的函數(shù)傳遞過來) 。函數(shù)首部為:void myprint_n( int n) $(5個$) $(10個) $(15個) $(20個)2、修改以上程序,實現(xiàn)以下功能:打印個數(shù)由用戶輸入決定,支持用戶循環(huán)輸入,當用戶輸入0時結(jié)束程序。第70頁,共131頁
27、。有參有返回值函數(shù)編寫:3、自定義函數(shù)myfac_n(),求n!,并在主函數(shù)中調(diào)用myfac_n()函數(shù),輸出結(jié)果。 函數(shù)首部為: int myfac_n( int n)4、自定義函數(shù)mypower(),求x的y次冪,并在主函數(shù)中調(diào)用mypower()函數(shù),輸出結(jié)果。 函數(shù)首部為:double mypower( double x, int y)5、自定義函數(shù)circleArea(),用于計算圓的面積,其中半徑作為參數(shù)傳入。然后在主函數(shù)中調(diào)用它,并輸出結(jié)果。函數(shù)首部為: double circleArea(double radius) 隨堂實踐第71頁,共131頁。小組討論并總結(jié)1、函數(shù)的功能應
28、該盡量保持相對獨立還是依賴 函數(shù)外的數(shù)據(jù)為好 ?2、怎樣使一個函數(shù)具有更大的通用性? 3、函數(shù)參數(shù)的值傳遞有哪些特點?第72頁,共131頁。學以致用尋找你身邊的一個實際問題,編寫解決問題的程序,要求用到函數(shù)調(diào)用、參數(shù)傳遞。例如:踢足球的時候,裁判要求換人,比如要用8號換下18號,請用函數(shù)模擬換人,并在主函數(shù)中調(diào)用。 第73頁,共131頁。作業(yè)每人必做 將“控制流程”階段完成的“小型計算器”功能改寫為函數(shù),并在主函數(shù)中調(diào)用,注意參數(shù)的類型定義及傳參過程。第74頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第75頁,共131頁。授課要點復習,評講模擬練習參數(shù)的值傳
29、遞實訓第76頁,共131頁。函數(shù)的值傳遞方式#include void main() void swap(int a,int b); /*swap函數(shù)的聲明*/ int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); /*調(diào)用swap函數(shù)*/ printf(x=%d,ty=%dn,x,y);void swap(int a,int b) /*定義swap函數(shù)*/ int temp; temp=a; a=b; b=temp; 輸出結(jié)果:x=7, y=11 swapped: x=7, y=11第77頁,共131頁。 結(jié)
30、論:值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞第78頁,共131頁。 結(jié)論:函數(shù)參數(shù)的傳遞方式還有另一種-地址傳遞方式其傳遞的參數(shù)為地址而不是值,具體內(nèi)容將在數(shù)組章節(jié)中學習.第79頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第80頁,共131頁。授課要點作業(yè)評講變量的存儲類別第81頁,共131頁。問題#include void prt();main() int x; for(x=1; x=5; x+)prt();void prt()stat
31、ic int y=0; y+;printf(%d, y);輸出結(jié)果:12345去掉static后的結(jié)果為多少?第82頁,共131頁。問題分析動態(tài)存儲變量和靜態(tài)存儲變量動態(tài)變量:用auto關鍵字表示如auto int p, f; /p,f為兩個動態(tài)變量在C中,默認的變量定義就是定義為動態(tài)變量即上述的p,f變量定義與 int p, f; 是完全等價的。靜態(tài)變量:在程序生存期內(nèi)一直有效。注意,如果靜態(tài)變量出現(xiàn)在函數(shù)中,不會因為函數(shù)的調(diào)用結(jié)束而丟失這個變量的值第83頁,共131頁。變量的生存期int a,b,c; /外部變量定義main() int x, y; /內(nèi)部變量 float f; /內(nèi)部變量
32、 /其他語句int sum(int n) int s=0, i; /內(nèi)部變量 /語句x, y, f的有效區(qū)域s,i的有效區(qū)域a, b, c的有效區(qū)域內(nèi)部變量與外部變量的作用區(qū)域是不一樣的。第84頁,共131頁。1變量的存儲類型 計算機的存儲器分為內(nèi)存和外存。還有一個小小的臨時存儲器稱為寄存器,用以存儲一些反復被加工的數(shù)據(jù)。C語言允許程序員區(qū)分是在主存還是在寄存器中開辟變量的存儲空間。2變量的生存期(1)在編譯時分配存儲單元。這種變量的生存期為程序執(zhí)行的整個過程,在該過程中占有固定的存儲空間,稱為永久存儲。(2)只在程序執(zhí)行的某一段時間內(nèi)存在。比如在函數(shù)的執(zhí)行過程中存在。這種存儲方式稱為動態(tài)存儲
33、。小結(jié)第85頁,共131頁。小結(jié)3變量的可用域 變量的可用域也分為全局可用和局部可用。 C語言中,用“存儲屬性”來表示以上三個方面的屬性,如表所示。名稱寄存器變量自動變量靜態(tài)變量外部變量存儲屬性registerautostaticextern存儲位置寄存器主存生存期動態(tài)生存期永久生存 期作用域局部局部或全局全局第86頁,共131頁。模仿練習1、寫出以下程序的運行結(jié)果:int fun(int a)/*a為形參,自動型局部變量*/ auto int b=0;/*b是自動型局部變量*/ static int c=3; /*c是靜態(tài)型局部變量,初始化僅進行一次*/ b+=1; c=c+1; retur
34、n a+b+c;main() int a=2,i; /*a和i都是自動型局部變量*/ for(i=0;i3;i+) printf(%dt,fun(a);第87頁,共131頁。模仿練習2、寫出以下程序的運行結(jié)果:int sum(int n); /函數(shù)聲明int a=4,b=5,c=6; /外部變量定義main() int x=1, y=2; float f=3.0; x=sum(10); printf(x=%d,y=%d,f=%fn, x, y, f); printf(a=%d,b=%d,c=%dn, a, b, c); /printf(s=%d, i=%dn, s, i);int sum(in
35、t n) int s=0, i; for(i=1; i=n; i+) s = s+i; printf(s=%d, i=%dn, s, i); printf(a=%d,b=%d,c=%dn, a, b, c); /printf(x=%d,y=%d,f=%fn, x, y, f); return s;第88頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第89頁,共131頁。授課要點函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用第90頁,共131頁。函數(shù)的嵌套調(diào)用f1() f2(); f2() f3(); f3() 第91頁,共131頁。函數(shù)的嵌套調(diào)用舉例1main() int a=
36、3,b=5,s; s=cal(a,b); printf(“%d”,s);int cal(int x,int y) int result,s1,s2; s1=powl(x,y); s2=pow(y,x); result=s1+s2; return result;int pow(int m,int n) int i,res=1; for(i=0;in;i+) res *=m; return res;求 3 5 。53第92頁,共131頁。函數(shù)的嵌套調(diào)用舉例2 自定義函數(shù)mymax2(),求出2個參數(shù)的最大值,然后定義函數(shù) mymax3(),調(diào)用mymax2()求出3個參數(shù)中的最大值,將值返回給主函
37、數(shù),輸出該結(jié)果。函數(shù)首部為: float mymax3(float x, float y, float z) 第93頁,共131頁。模仿練習1、自定義函數(shù)mymax (),求出3個參數(shù)的最大值; 自定義函數(shù) mymin(),求出3個參數(shù)的最小值; 自定義函數(shù)mysub(),調(diào)用mymax()和mymin()求出3個參數(shù)的最大值與最小值的差; 在主函數(shù)中調(diào)用mysub(),輸出結(jié)果。函數(shù)首部為: float mymax (float x, float y,float z) float mymin(float x,float y,float z) float mysub (float x,floa
38、t y,float z)2、計算s=1k+2k+3k+N k函數(shù)首部為:long f1(int n,int k)/*計算n的k次方*/ long f2(int n,int k)/*計算1到n的k次方之累加和*/ 第94頁,共131頁。案例解答#define K 4#define N 5long f1(int n,int k)/*計算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power;long f2(int n,int k)/*計算1到n的k次方之累加和*/ long sum=0; int i; for(i=1
39、;i=n;i+) sum += f1(i, k); return sum;main() printf(Sum of %d powers of integers from 1 to %ld = ,K,N); printf(%dn,f2(N,K);第95頁,共131頁。函數(shù)的遞歸調(diào)用C語言的函數(shù)調(diào)用允許直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。含有直接或間接調(diào)用自己的函數(shù)稱為遞歸函數(shù)。函數(shù)f調(diào)用函數(shù)f函數(shù)f1調(diào)用函數(shù)f2調(diào)用函數(shù)f1函數(shù)f2直接調(diào)用本身間接調(diào)用本身第96頁,共131頁。函數(shù)的遞歸調(diào)用舉例用遞歸函數(shù)求4!4! = 4*3! ;3! = 3*2! ;2! = 2*1! ;1! =
40、 1 ;n! = n*(n-1)! 1! = 1第97頁,共131頁。函數(shù)的遞歸調(diào)用舉例例:用遞歸函數(shù)求n! n! = n * (n-1)! int myFac( int n) if (n=1) return 1; /遞歸的結(jié)束條件 return n*myFac(n-1); myFac(n)就是求n!myFac(n-1)就是求(n-1)!第98頁,共131頁。函數(shù)的遞歸調(diào)用舉例fac(3)*4fac(2)*3fac(1)*2reutrn(1)reutrn(1*2)reutrn(2*3)return(6*4)調(diào)用過程返回過程fac(4)reutrn(24)用遞歸函數(shù)求4!第99頁,共131頁。函
41、數(shù)的遞歸調(diào)用舉例例:用遞歸函數(shù)求n!的完整程序#include int myFac(int n);main() int f, n;scanf(%d, &n);f = myFac(n);printf(%d!=%dn, n, f);int myFac( int n) int s; if (n=1) s= 1; /遞歸的結(jié)束條件 else s= n*myFac(n-1); return s;單步調(diào)試,理解遞歸程序的執(zhí)行流程第100頁,共131頁。函數(shù)的遞歸調(diào)用舉例遞歸算法的組成:遞歸終止條件:當滿足一定條件時,遞歸調(diào)用必須可以結(jié)束,否則會無限地遞歸調(diào)用而導致程序無法結(jié)束。例如n!中當n=1時,令結(jié)果
42、為1則可以結(jié)束遞歸調(diào)用,否則它將繼續(xù)調(diào)用(0)!而無限繼續(xù)下去。對于由多個通項表示的情況,則需要給出最后一個遞歸調(diào)用的所有項的值。如an = an-1 + an-2 ,要給出n=1時的結(jié)果以及n=2時結(jié)果才可以結(jié)束遞歸調(diào)用。遞歸表達式,如fac(n)=n*fac(n-1)第101頁,共131頁。函數(shù)的遞歸調(diào)用舉例求下數(shù)列的第20項的值。1,2,3,5,8,13,21,34a1=1;a2=2;a3=a1+a2;an=an-1 + an-2; 第102頁,共131頁。函數(shù)的遞歸調(diào)用舉例求下數(shù)列的第20項的值。1,2,3,5,8,13,21,34f(1)=1;f(2)=2;f(n)=f(n-1)+f
43、(n-2); 第103頁,共131頁。函數(shù)的遞歸調(diào)用舉例main() int a; a=f(20); printf(“%d”,a); int f(int n) int s; if(n=1) s= 1; else if(n=2) s= 2; else s= f(n-1)+f(n-2); return s; 第104頁,共131頁。模仿練習遞歸函數(shù)的編寫:1、 用遞歸方法編寫函數(shù)求n!。 函數(shù)定義如下: int recFac(int n)2、用遞歸函數(shù)的方法編寫函數(shù)求 斐波納契(Fibonacci)數(shù)列的第20項的值。函數(shù)定義如下: int Fib (int n) 其中n為該數(shù)列中的第n項。 1,
44、1,2,3,5,8,13第105頁,共131頁。模仿練習遞歸函數(shù)的編寫:3、用遞歸算法,計算:1 2 3 n 2222第106頁,共131頁。Date: 04 八月 2022第四章模 塊 化 程 序 設 計第107頁,共131頁。授課要點數(shù)組的概念一維數(shù)組的定義和引用一維數(shù)組的初始化和賦值數(shù)組元素的遍歷第108頁,共131頁。這樣做好嗎?如果題目改為10個數(shù)、100個數(shù)該怎么做?問題1:從鍵盤輸入5個整數(shù),逆序輸出這5個數(shù)。main()int a0,a1,a2,a3,a4;scanf(“%d”,&a0); scanf(“%d”,&a1);scanf(“%d”,&a2);scanf(“%d”,&
45、a3);scanf(“%d”,&a4);printf(“%dn”,a4);printf(“%dn”,a3);printf(“%dn”,a2);printf(“%dn”,a1);printf(“%dn”,a0);第109頁,共131頁。在“學生成績管理系統(tǒng)”中,我們需要對多個學生進行處理,比如100個學生,是否必須定義100個變量呢?Student stu1;Student stu2;Student stu3;Student stu100;定義多個變量,在定義、輸入、輸出、處理的時候非常不方便。如果需要處理5000個學生的成績,情況就更糟。問題2第110頁,共131頁。以上兩個例子有什么共同之處
46、?問題2具有相同的數(shù)據(jù)類型!第111頁,共131頁。數(shù)組的概念 數(shù)組是一組變量,滿足下列條件:(1)具有相同的名字(2)具有相同的數(shù)據(jù)類型(3)在存儲器中連續(xù)存放每個變量名字相同下標不同,稱為“數(shù)組元素”“數(shù)組名”代表整個數(shù)組,其值是這組變量在內(nèi)存中所占連續(xù)存儲空間的首地址。數(shù)組要先定義后使用。數(shù)組名不能與相同作用域的其他變量名重名第112頁,共131頁。問題如何定義數(shù)組?如何為數(shù)組元素賦值?如何引用數(shù)組元素?第113頁,共131頁。一維數(shù)組的定義一維數(shù)組:只有一個下標的數(shù)組定義形式為:類型說明符 數(shù)組名常量表達式例如:int a10;說明數(shù)組名為a數(shù)組中每個元素的數(shù)據(jù)類型為int類型10個數(shù)
47、組元素 內(nèi)是常量表達式,不能為變量第114頁,共131頁。1、定義100個整型變量2、定義50個浮點型變量3、定義1000個“學生”變量,“學生”類型定義如下:typedef structchar acNum10;char acName15;Student;模仿練習第115頁,共131頁。以下一維數(shù)組的定義是否正確?int a ;#define SIZE 100float bSIZE;int n=10;char cn;int 2a10;錯誤,沒有指明數(shù)組的大小int a10;正確 ,SIZE是常量,相當于 float b100;錯誤,數(shù)組的大小不能是變量,應為 int a10;錯誤,數(shù)組名2a
48、 不符合標識符的命名規(guī)則第116頁,共131頁。數(shù)組元素的引用數(shù)組就是一組變量的集合,每個數(shù)組元素相當于是一個變量數(shù)組元素的表示: 數(shù)組名下標如:int a5;所定義的數(shù)組就是五個變量的集合,分別是: a0, a1,a2, a3, a4int aN; 下標的取值范圍:0N-1 ,其中N為數(shù)組的大小下標是整型值,可以是整型常量、整型變量或整型表達式 如:ai a3+1 a2*i-1注意:下標不能越界,否則可能覆蓋其他數(shù)據(jù),造成嚴重后果第117頁,共131頁。定義數(shù)組之后,與普通變量一樣,數(shù)組是沒有初始值的,各存儲單元的值都是不定的。初始化:定義數(shù)組的同時賦初值語法: 數(shù)據(jù)類型說明符 數(shù)組名長度=
49、數(shù)值1,數(shù)值2,; 如 : int data10=0,1,2,3,4,5,6,7,8,9;一維數(shù)組的初始化第118頁,共131頁。1、定義并初始化一個float型數(shù)組,包含5個元素。2、定義并初始化一個字符型數(shù)組,包含6個元素。3、定義一個全0的整形數(shù)組,包含15個元素。模仿練習第119頁,共131頁。初始化注意事項:(1) 允許初始化一部分元素,其他沒有賦初值的元素初值為0; int a10=0,1,2,3,4,5; 相當于 int a10=0,1,2,3,4,5,0,0,0,0;(2)允許初始化時省略數(shù)組的長度,數(shù)組的長度為賦初值的個數(shù); int a=1,2,3,4,5; 相當于 int a5=1,2,3,4,5; (3)不能對整個數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球初級沖擊式破碎機行業(yè)調(diào)研及趨勢分析報告
- 座次禮儀健康管理系施怡寧講解
- 2025個人借款樓房抵押合同范本
- 2025標準材料采購合同范本
- 打灰工班組承包合同
- 生活污水處理合同書范本年
- 墻面廣告租賃合同
- 提高人際溝通與協(xié)調(diào)的技巧
- 建筑工程施工總承包合同
- 活動板房工程合同范本
- 《民航服務溝通技巧》教案第16課民航服務人員平行溝通的技巧
- 深圳市物業(yè)專項維修資金管理系統(tǒng)操作手冊(電子票據(jù))
- 2023年鐵嶺衛(wèi)生職業(yè)學院高職單招(數(shù)學)試題庫含答案解析
- 呆死帳的發(fā)生與預防課件
- 10000中國普通人名大全
- 起重機械安裝吊裝危險源辨識、風險評價表
- 華北理工兒童口腔醫(yī)學教案06兒童咬合誘導
- 中國建筑項目管理表格
- 高一3班第一次月考總結(jié)班會課件
- 公共政策分析導論教學課件匯總完整版電子教案
- 我國油菜生產(chǎn)機械化技術(shù)(-119)
評論
0/150
提交評論