C語言程序設(shè)計(jì)案例教程(三)131_第1頁
C語言程序設(shè)計(jì)案例教程(三)131_第2頁
C語言程序設(shè)計(jì)案例教程(三)131_第3頁
C語言程序設(shè)計(jì)案例教程(三)131_第4頁
C語言程序設(shè)計(jì)案例教程(三)131_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Date:04May2023C語言程序設(shè)計(jì)案例教程(三)Date:04五月2023第三章結(jié)構(gòu)化程序設(shè)計(jì)授課要點(diǎn)循環(huán)的嵌套結(jié)構(gòu)問題:打印如以下圖案123456789123456789123456789123456789123456789112123123412345問題解答1#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=9;j++) printf("%d",j); printf("\n"); } }問題解答2#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=i;j++) printf("%d",j); printf("\n"); } }問題:打印如以下圖案******************************問題解答3#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=i;j++) printf(“*"); printf("\n"); } }問題解答4#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=5-i;j++) printf(""); for(j=1;j<=i;j++) printf("*"); printf("\n"); } }問題:打印如以下圖案*************************問題解答5#include<stdio.h>voidmain(){ inti,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"); } }模仿練習(xí)*******************************************************小組討論并總結(jié)循環(huán)嵌套的執(zhí)行過程“控制流程〞編碼中的常見錯(cuò)誤。結(jié)論1——循環(huán)嵌套的執(zhí)行過程執(zhí)行順序:1、語句12、判斷表達(dá)式:如果為假,執(zhí)行語句5;如果為真執(zhí)行另一個(gè)循環(huán)語句塊3、執(zhí)行語句24、判斷表達(dá)式2:如果為假,執(zhí)行語句4,轉(zhuǎn)回表達(dá)式1;如果為真,循環(huán)執(zhí)行語句3結(jié)論2——“控制流程〞中常見錯(cuò)誤if…else不配對(duì)switch中表達(dá)式類型與case語句的值不匹配無結(jié)束條件,死循環(huán)循環(huán)次數(shù)不清楚誤用break和continue學(xué)以致用尋找你身邊的一個(gè)實(shí)際問題,構(gòu)造出解決問題的表達(dá)式,描述解決問題的算法,以及編寫解決問題的程序。例如:假設(shè)你在某公司工作,老板要你打印一張表,買主可以用它來購置多個(gè)特定部件的費(fèi)用。單個(gè)部件的價(jià)格從1元到9元不等。N件東西的費(fèi)用就是單價(jià)與數(shù)量相乘得出。因此,你要打印一張像下面這樣的數(shù)字表: 某公司部件費(fèi)用明細(xì)表1234567892468101214161836912151821242748121620242832362007年4月7日作業(yè)【練習(xí)1】將1、2、3、…、9打印15行?!揪毩?xí)2】打印如以下圖案: * *** ***** ****************【練習(xí)3】打印九九乘法表,如下圖Date:04五月2023第三章結(jié)構(gòu)化程序設(shè)計(jì)授課要點(diǎn)循環(huán)的嵌套結(jié)構(gòu)嵌套結(jié)構(gòu)的轉(zhuǎn)換問題:輸入一個(gè)數(shù)n,求其階乘分析規(guī)律:1!=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)來實(shí)現(xiàn)編程思路〔1〕用變量n保存待計(jì)算階乘數(shù)的數(shù)據(jù),用p保存逐項(xiàng)累乘的結(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é)束運(yùn)行。流程圖及代碼intn; /*存儲(chǔ)計(jì)算階乘的n值*/scanf(“%d〞,&n);/*取得輸入值n*/intj; /*循環(huán)變量j*/intp; /*累乘結(jié)果p*/for(j=1;j<=n;j++){ p=p*j;/*累乘,結(jié)果放到p中*/}printf(“%d〞,p);/*輸入累乘結(jié)果*/問題:求1!+2!+3!+…+20!的值分析:1、1-20分別求階乘(p1,p2,…,p20),然后求各個(gè)階乘的和。2、兩重循環(huán)解決問題

內(nèi)重循環(huán):n!=1×2×3×…×n的實(shí)現(xiàn) 外重循環(huán):p1+p2+p3+p4+…+p20的實(shí)現(xiàn)嵌套循環(huán)流程圖循環(huán)嵌套——雙重循環(huán)兩個(gè)while循環(huán)嵌套while(…){while(…){

語句;}}內(nèi)重循環(huán)外重循環(huán)兩個(gè)for循環(huán)嵌套for(…){for(…){

語句;}}雙重循環(huán)代碼分解/*內(nèi)重循環(huán)代碼*/intj;/*循環(huán)變量*/p=1;for(j=1;j<=i;j++) p*=j;/*外重循環(huán)代碼*/inti; /*循環(huán)變量*/intsum=0;/*求和結(jié)果*/for(i=1;i<=20;i++){ sum=sum+p;/*累加*/}printf(“%d〞,sum);給出一個(gè)個(gè)i值得到p值雙重循環(huán)代碼塊while雙重循環(huán) inti=1; intsum=0; while(i<=20) { intj=1; intp=1; while(j<=i) { p=p*j;/*累乘積*/ j++; } i=i+1; sum=sum+p; }相應(yīng)的for雙重循環(huán) inti,j,sum=0; intp=1; for(inti=1;i<=20;i++) { for(intj=1;j<=i;j++) { p=p*j;/*累乘積*/ } sum=sum+p; }問題擴(kuò)展在問題中,采用的是兩個(gè)while和for循環(huán)的嵌套。能不能換成兩個(gè)do…while循環(huán)的嵌套?能不能換成for、do…while、while的混合型嵌套?for循環(huán)和do…while循環(huán)互換inti=1;intp=1;while(i<=20){

intj=1;for(intj=1;j<=i;j++){p=p*j;}

i=i+1;sum=sum+p;}inti=p=1;while(i<=20){ intj=1;

do { p=p*j; j++; }while(j<=i); i=i+1; sum=sum+p; }問題:搬運(yùn)磚塊假設(shè)有36塊磚,共需36個(gè)人搬,男人可搬4塊,女人可搬3塊,小孩兩人搬1塊,要求一次全部搬完,問男、女、小孩人數(shù)的可能組合。思路:男人的可能值是0~8;女人的可能值是0~11;小孩的取值是〔36-男人-女人〕。問題:求100~200之間的全部素?cái)?shù)什么是素?cái)?shù)?如何判斷m是否是素?cái)?shù)?思路:讓m被2到根號(hào)m除,如果m能被其中任何一個(gè)整數(shù)整除,那么m不是素?cái)?shù)。小組討論并總結(jié)循環(huán)主菜單是如何跳出循環(huán)的?結(jié)論3——循環(huán)主菜單如何跳出循環(huán)?voidmain(){intinput;scanf(“%d〞,&input);switch(input){case1: /*語句*/ break;/*跳出循環(huán)*/case2: /*語句*/ break;/*跳出循環(huán)*/ …}}使用break語句Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)什么是結(jié)構(gòu)化程序設(shè)計(jì)函數(shù)的定義、聲明、調(diào)用無參無返回值的函數(shù)無參有返回值的函數(shù)什么是結(jié)構(gòu)化程序設(shè)計(jì)? 自上而下逐步細(xì)化的模塊化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)的好處是什么? 復(fù)雜問題簡單化 便于多人協(xié)作完成一個(gè)大的任務(wù) 提高程序可維護(hù)性、可讀性 模塊復(fù)用C語言中如何實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)? 模塊化在C語言中用函數(shù)實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)#include<stdio.h>#include<math.h>main()//主函數(shù){ intiNo,b; printf(“inputanumber:\n〞);//輸出函數(shù) scanf(“%d〞,&iNo);//輸入函數(shù) b=sqrt(iNo);//求平方根函數(shù) printf(“%d〞,b);//輸出函數(shù)}初識(shí)函數(shù)1/*從鍵盤輸入3個(gè)數(shù),求和并輸出。*/#include<math.h>#include<stdio.h>intmyAdd(intx,inty,intz){ ints; s=x+y+z; returns;}main()//主函數(shù){ intiNo1,iNo2,iNo3,sum; printf("input3numbers:\n");//輸出函數(shù)

scanf("%d%d%d",&iNo1,&iNo2,&iNo3);//輸入函數(shù)

sum=myAdd(iNo1,iNo2,iNo3);//用戶自定義函數(shù)

printf("sum=%d",sum);//輸出函數(shù)}初識(shí)函數(shù)2函數(shù): 一段函數(shù)就是一段實(shí)現(xiàn)一定功能的代碼,就像一臺(tái)具有某種功能機(jī)器。因此函數(shù)的調(diào)用就類似啟動(dòng)一臺(tái)機(jī)器來完成某個(gè)任務(wù)。C語言中,函數(shù)是實(shí)現(xiàn)模塊化的工具。什么是函數(shù)?用函數(shù)解決問題 輸入假設(shè)干個(gè)學(xué)生的學(xué)號(hào)、某門課程的平時(shí)成績和期末成績,計(jì)算出總評(píng)成績。其中, 總評(píng)成績=50%*平時(shí)成績+50%*期末成績 最后,從鍵盤輸入一個(gè)學(xué)生的學(xué)號(hào),查詢?cè)撋钠綍r(shí)成績、期末成績和總評(píng)成績。用函數(shù)解決的思路 定義假設(shè)干具有不同功能的函數(shù),在main函數(shù)中分別調(diào)用它們,用以解決這個(gè)問題。如:main(){//定義必要的變量inputScore();//輸入學(xué)生學(xué)號(hào)及成績信息computeTotalScore();//計(jì)算每個(gè)學(xué)生的總成績searchByNo();//按學(xué)號(hào)查找某個(gè)學(xué)生的信息printSearchInfo();//輸出查找到的學(xué)生信息}main函數(shù)只負(fù)責(zé)解決問題的流程;具體子問題的實(shí)現(xiàn)交給不同的函數(shù)去處理。函數(shù)的定義除了系統(tǒng)提供的函數(shù)外,我們都需要對(duì)函數(shù)進(jìn)行定義。函數(shù)定義的通用形式為:返回值數(shù)據(jù)類型函數(shù)名稱([參數(shù)數(shù)據(jù)類型參數(shù)1[,參數(shù)數(shù)據(jù)類型參數(shù)2,…]])

{

…}函數(shù)首部函數(shù)體函數(shù)定義例如(1)無參數(shù)無返回值的函數(shù)如:定義printStar函數(shù),用以在屏幕上輸出5個(gè)*符號(hào)。voidprintStar(){intstar;for(star=1;star<=5;star++) printf("*");printf("\n");}函數(shù)無返回值時(shí)使用的數(shù)據(jù)類型函數(shù)的調(diào)用無參的調(diào)用形式:函數(shù)名();無參數(shù)無返回值的函數(shù)的調(diào)用#include<stdio.h>main(){

printStar();//函數(shù)調(diào)用}voidprintStar(){intstar;for(star=1;star<=5;star++) printf("*");printf("\n");}自定義函數(shù)的聲明 在程序的開頭加上對(duì)應(yīng)函數(shù)的聲明,就不會(huì)出現(xiàn)函數(shù)未定義(或重復(fù)定義)的錯(cuò)誤。函數(shù)聲明的形式:返回值類型函數(shù)名稱([參數(shù)類型參數(shù)1,…]);其中前面的與函數(shù)定義時(shí)的首部完全一樣,但末尾必須加“;〞。如對(duì)printStar函數(shù)的聲明為:voidprintStar();無參數(shù)無返回值的函數(shù)的聲明#include<stdio.h>voidprintStar();//函數(shù)聲明main(){printStar();//函數(shù)調(diào)用}voidprintStar()//函數(shù)定義(首部){intstar;for(star=1;star<=5;star++) printf("*");printf("\n");}問題:過年回家,車票難買,到處托人。假設(shè)你先把車票錢給幫你買車票的朋友,那么返回給你的應(yīng)該是一張車票〔當(dāng)然要順利的話〕。同理,在C語言中,函數(shù)的調(diào)用有時(shí)候也是有返回值的,那么如何理解?分析

對(duì)應(yīng)到函數(shù)上,你的朋友就是函數(shù),車票錢是函數(shù)輸入,車票就是函數(shù)的返回值,而你就是調(diào)用函數(shù)的主程序。

函數(shù)的返回值函數(shù)的返回值返回語句形式:return(表達(dá)式);或return表達(dá)式;或return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)函數(shù)定義例如(2)無參數(shù)有返回值的函數(shù) 如定義函數(shù)sum_100,用以求1+2+3+…+100的和,并將結(jié)果返回給調(diào)用它的函數(shù)。

intsum_100(){ints=0,i;for(i=1;i<=100;i++) s=s+i;

returns;

//用return返回一個(gè)值給主調(diào)函數(shù)

}無參數(shù)有返回值的函數(shù)例如

#include<stdio.h>

intsum_100();

//函數(shù)聲明

main(){ints1;

s1=sum_100();

//函數(shù)調(diào)用

printf("和值為:%d\n",s1);}intsum_100()//函數(shù)定義(首部){ints=0,i;for(i=1;i<=100;i++) s=s+i;

returns;

//返回值給主調(diào)函數(shù)

}模仿練習(xí)無參無返回值函數(shù)編寫:1、自定義函數(shù)myPrint1(),在屏幕上輸出如以下圖形(每行10個(gè)$符號(hào)),并在主函數(shù)中調(diào)用myPrint1()函數(shù)。$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$模仿練習(xí)無參無返回值函數(shù)編寫:2、自定義函數(shù)myPrint2(),在屏幕上輸出如以下圖形,并在主函數(shù)中調(diào)用myPrint2()函數(shù)。@@@@@@@@@@@@@@@@@@@@@@@@@模仿練習(xí)無參有返回值函數(shù)編寫:3、自定義函數(shù)myFac(),計(jì)算10!,將計(jì)算結(jié)果返回給調(diào)用者。然后在主函數(shù)中調(diào)用myFac()函數(shù),輸出該結(jié)果。4、自定義函數(shù)myMax(),實(shí)現(xiàn)功能:從鍵盤輸入3個(gè)數(shù),求最大數(shù)并在主函數(shù)中調(diào)用myMax()函數(shù),輸出該結(jié)果。小組討論并總結(jié)1、為什么使用函數(shù)?2、如何理解函數(shù)調(diào)用與函數(shù)定義的不同?3、空函數(shù)在程序結(jié)構(gòu)設(shè)計(jì)中有什么作用?學(xué)以致用尋找你身邊的一個(gè)實(shí)際問題,編寫解決問題的程序,用到函數(shù)定義和調(diào)用。例、電視是我們?nèi)粘I钪兴煜さ?,我們通過遙控器選擇不同的頻道,就可以播放相應(yīng)的頻道。請(qǐng)定義一個(gè)函數(shù)tvPlay(intchannel),模擬根據(jù)遙控器的輸入的頻道號(hào)碼,播放相應(yīng)的頻道。然后給出調(diào)用的例子,比方,遙控器上選擇5,那么播放CCTV-5體育頻道。作業(yè)——每人必做1、編寫一個(gè)函數(shù)sum(n),計(jì)算1+2…+n之和,根據(jù)n值的不同,得到不同的值。要求分別計(jì)算n=50,n=80,n=100的情況。2、將自己的“學(xué)生成績管理系統(tǒng)〞〔循環(huán)菜單〕以模塊化的形式進(jìn)行處理,具體實(shí)施方案:主菜單的顯示和選擇局部可定義函數(shù)menu_select〔〕來調(diào)用,“編輯子菜單〞可定義editmenu〔〕來調(diào)用,“查找〞可定義serachmenu〔〕來調(diào)用。作業(yè)——小組必做尋找你身邊的一個(gè)實(shí)際問題,構(gòu)造出解決問題的表達(dá)式,描述解決問題的算法,以及編寫解決問題的程序。例如,MP3可以播放不同的歌曲,請(qǐng)編寫一個(gè)MP3模擬函數(shù),根據(jù)輸入不同的歌曲代號(hào),可以顯示相應(yīng)的歌曲名。然后,調(diào)用該函數(shù)。Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)有參無返回值的函數(shù)有參有返回值的函數(shù)函數(shù)定義例如(3)有參數(shù)無返回值的函數(shù)如定義printStar_n()函數(shù),用以在屏幕的一行上輸出n個(gè)*號(hào)。其中n的值是由調(diào)用該函數(shù)的函數(shù)傳遞過來的。

voidprintStar_n(intn){ intstar;for(star=1;star<=n;star++) printf("*"); printf("\n");}函數(shù)參數(shù)(稱為形參)函數(shù)調(diào)用有參函數(shù)的調(diào)用形式: 函數(shù)名〔實(shí)參〕;實(shí)參與形參:個(gè)數(shù)相等類型一致按順序一一對(duì)應(yīng)有參數(shù)無返回值的函數(shù)調(diào)用

#include<stdio.h>

voidprintStar2(intn);//函數(shù)聲明

main(){intstarNum;scanf("%d",&starNum);printStar_n(starNum);//函數(shù)調(diào)用

}

voidprintStar_n(intn)//函數(shù)定義(首部){intstar;for(star=1;star<=n;star++) printf("*"); printf("\n");}函數(shù)參數(shù)(稱為形參)調(diào)用時(shí)傳遞的參數(shù)(稱為實(shí)參)函數(shù)定義例如(4)有參數(shù)有返回值的函數(shù)如定義函數(shù)sum_n(),用以求1+2+3+…+n的和,并將結(jié)果返回給調(diào)用它的函數(shù)。

intsum_n(intn){ ints=0,i;for(i=1;i<=n;i++) s=s+i;

returns;

//通過return返回一個(gè)值

}函數(shù)參數(shù)(稱為形參)

#include<stdio.h>

intsum_n(intn);//函數(shù)聲明

main(){ints1,n;scanf("%d",&n);

s1=sum_n(

n);

//函數(shù)調(diào)用

printf("和值為:%d\n",s1);}

intsum_n(n)//函數(shù)定義(首部){ints=0,i;for(i=1;i<=n;i++) s=s+i;

returns;

//返回一個(gè)值給主調(diào)函數(shù)

}有參數(shù)有返回值的函數(shù)調(diào)用函數(shù)的調(diào)用1、語句調(diào)用方式2、函數(shù)表達(dá)式3、函數(shù)參數(shù)函數(shù)的調(diào)用調(diào)用方式語句調(diào)用:例printmsg();printf(“打印成功!\n〞);函數(shù)表達(dá)式調(diào)用:例result=aver(totalscore,stuno);函數(shù)參數(shù)調(diào)用:例printf(“%f〞,aver(totalscore,stuno));

隨堂實(shí)踐有參無返回值函數(shù)編寫:1、自定義函數(shù)myprint_n(),在屏幕的一行上輸出n個(gè)$符號(hào)。在主函數(shù)中調(diào)用myprint_n()函數(shù),輸出如以下圖形(每行上的符號(hào)個(gè)數(shù)由調(diào)用它的函數(shù)傳遞過來)。函數(shù)首部為:voidmyprint_n(intn)$$$$$(5個(gè)$)$$$$$$$$$$(10個(gè))$$$$$$$$$$$$$$$(15個(gè))$$$$$$$$$$$$$$$$$$$$(20個(gè))2、修改以上程序,實(shí)現(xiàn)以下功能:打印個(gè)數(shù)由用戶輸入決定,支持用戶循環(huán)輸入,當(dāng)用戶輸入0時(shí)結(jié)束程序。有參有返回值函數(shù)編寫:3、自定義函數(shù)myfac_n(),求n!,并在主函數(shù)中調(diào)用myfac_n()函數(shù),輸出結(jié)果。函數(shù)首部為:intmyfac_n(intn)4、自定義函數(shù)mypower(),求x的y次冪,并在主函數(shù)中調(diào)用mypower()函數(shù),輸出結(jié)果。函數(shù)首部為:doublemypower(doublex,inty)5、自定義函數(shù)circleArea(),用于計(jì)算圓的面積,其中半徑作為參數(shù)傳入。然后在主函數(shù)中調(diào)用它,并輸出結(jié)果。函數(shù)首部為:doublecircleArea(doubleradius)

隨堂實(shí)踐小組討論并總結(jié)1、函數(shù)的功能應(yīng)該盡量保持相對(duì)獨(dú)立還是依賴函數(shù)外的數(shù)據(jù)為好?2、怎樣使一個(gè)函數(shù)具有更大的通用性?3、函數(shù)參數(shù)的值傳遞有哪些特點(diǎn)?學(xué)以致用尋找你身邊的一個(gè)實(shí)際問題,編寫解決問題的程序,要求用到函數(shù)調(diào)用、參數(shù)傳遞。例如:踢足球的時(shí)候,裁判要求換人,比方要用8號(hào)換下18號(hào),請(qǐng)用函數(shù)模擬換人,并在主函數(shù)中調(diào)用。作業(yè)——每人必做將“控制流程〞階段完成的“小型計(jì)算器〞功能改寫為函數(shù),并在主函數(shù)中調(diào)用,注意參數(shù)的類型定義及傳參過程。Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)復(fù)習(xí),評(píng)講模擬練習(xí)參數(shù)的值傳遞實(shí)訓(xùn)函數(shù)的值傳遞方式#include<stdio.h>voidmain(){voidswap(inta,intb);/*swap函數(shù)的聲明*/intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");swap(x,y);/*調(diào)用swap函數(shù)*/printf("x=%d,\ty=%d\n",x,y);}voidswap(inta,intb)/*定義swap函數(shù)*/{inttemp;temp=a;a=b;b=temp;輸出結(jié)果:x=7,y=11}swapped:x=7,y=11結(jié)論:值傳遞方式方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保存并維持原值特點(diǎn):形參與實(shí)參占用不同的內(nèi)存單元單向傳遞結(jié)論:函數(shù)參數(shù)的傳遞方式還有另一種---地址傳遞方式其傳遞的參數(shù)為地址而不是值,具體內(nèi)容將在數(shù)組章節(jié)中學(xué)習(xí).Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)作業(yè)評(píng)講變量的存儲(chǔ)類別問題#include<stdio.h>voidprt();main(){intx;for(x=1;x<=5;x++) prt();}voidprt(){ staticinty=0;y++; printf("%d",y);}輸出結(jié)果:12345去掉static后的結(jié)果為多少?問題分析動(dòng)態(tài)存儲(chǔ)變量和靜態(tài)存儲(chǔ)變量動(dòng)態(tài)變量:用auto關(guān)鍵字表示如autointp,f;//p,f為兩個(gè)動(dòng)態(tài)變量在C中,默認(rèn)的變量定義就是定義為動(dòng)態(tài)變量即上述的p,f變量定義與intp,f;是完全等價(jià)的。靜態(tài)變量:在程序生存期內(nèi)一直有效。注意,如果靜態(tài)變量出現(xiàn)在函數(shù)中,不會(huì)因?yàn)楹瘮?shù)的調(diào)用結(jié)束而喪失這個(gè)變量的值變量的生存期inta,b,c;//外部變量定義main(){intx,y;//內(nèi)部變量

floatf;//內(nèi)部變量

//其他語句…}intsum(intn){ints=0,i;//內(nèi)部變量

//語句}x,y,f的有效區(qū)域s,i的有效區(qū)域a,b,c的有效區(qū)域內(nèi)部變量與外部變量的作用區(qū)域是不一樣的。1.變量的存儲(chǔ)類型計(jì)算機(jī)的存儲(chǔ)器分為內(nèi)存和外存。還有一個(gè)小小的臨時(shí)存儲(chǔ)器稱為存放器,用以存儲(chǔ)一些反復(fù)被加工的數(shù)據(jù)。C語言允許程序員區(qū)分是在主存還是在存放器中開辟變量的存儲(chǔ)空間。2.變量的生存期〔1〕在編譯時(shí)分配存儲(chǔ)單元。這種變量的生存期為程序執(zhí)行的整個(gè)過程,在該過程中占有固定的存儲(chǔ)空間,稱為永久存儲(chǔ)?!?〕只在程序執(zhí)行的某一段時(shí)間內(nèi)存在。比方在函數(shù)的執(zhí)行過程中存在。這種存儲(chǔ)方式稱為動(dòng)態(tài)存儲(chǔ)。小結(jié)小結(jié)3.變量的可用域變量的可用域也分為全局可用和局部可用。C語言中,用“存儲(chǔ)屬性〞來表示以上三個(gè)方面的屬性,如表所示。名稱寄存器變量自動(dòng)變量靜態(tài)變量外部變量存儲(chǔ)屬性registerautostaticextern存儲(chǔ)位置寄存器主存生存期動(dòng)態(tài)生存期永久生存期作用域局部局部或全局全局模仿練習(xí)1、寫出以下程序的運(yùn)行結(jié)果:int

fun(inta) /*a為形參,自動(dòng)型局部變量*/{autointb=0; /*b是自動(dòng)型局部變量*/staticintc=3; /*c是靜態(tài)型局部變量,初始化僅進(jìn)行一次*/b+=1;c=c+1;returna+b+c;}main(){inta=2,i; /*a和i都是自動(dòng)型局部變量*/for(i=0;i<3;i++)printf("%d\t",fun(a));}模仿練習(xí)2、寫出以下程序的運(yùn)行結(jié)果:intsum(intn);//函數(shù)聲明inta=4,b=5,c=6;//外部變量定義main(){intx=1,y=2;floatf=3.0;x=sum(10);printf("x=%d,y=%d,f=%f\n",x,y,f); printf("a=%d,b=%d,c=%d\n",a,b,c);//printf("s=%d,i=%d\n",s,i);}intsum(intn){ints=0,i;for(i=1;i<=n;i++)s=s+i;printf("s=%d,i=%d\n",s,i);printf("a=%d,b=%d,c=%d\n",a,b,c);//printf("x=%d,y=%d,f=%f\n",x,y,f);returns;}Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用函數(shù)的嵌套調(diào)用f1(){…f2();…}f2(){…f3();…}f3(){………}函數(shù)的嵌套調(diào)用舉例1main(){inta=3,b=5,s;s=cal(a,b);printf(“%d〞,s);}intcal(intx,inty){intresult,s1,s2;s1=powl(x,y);s2=pow(y,x);result=s1+s2;returnresult;}intpow(intm,intn){inti,res=1;for(i=0;i<n;i++)res*=m;returnres;}求3+5。53函數(shù)的嵌套調(diào)用舉例2自定義函數(shù)mymax2(),求出2個(gè)參數(shù)的最大值,然后定義函數(shù)mymax3(),調(diào)用mymax2()求出3個(gè)參數(shù)中的最大值,將值返回給主函數(shù),輸出該結(jié)果。函數(shù)首部為:floatmymax3(floatx,floaty,floatz)

模仿練習(xí)1、自定義函數(shù)mymax(),求出3個(gè)參數(shù)的最大值;自定義函數(shù)mymin(),求出3個(gè)參數(shù)的最小值;自定義函數(shù)mysub(),調(diào)用mymax()和mymin()求出3個(gè)參數(shù)的最大值與最小值的差;在主函數(shù)中調(diào)用mysub(),輸出結(jié)果。 函數(shù)首部為:floatmymax(floatx,floaty,floatz) floatmymin(floatx,floaty,floatz)floatmysub(floatx,floaty,floatz)2、計(jì)算s=1k+2k+3k+……+Nk函數(shù)首部為:longf1(intn,intk) /*計(jì)算n的k次方*/

longf2(intn,intk) /*計(jì)算1到n的k次方之累加和*/

案例解答#defineK4#defineN5longf1(intn,intk) /*計(jì)算n的k次方*/{longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk) /*計(jì)算1到n的k次方之累加和*/{longsum=0; inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){printf("Sumof%dpowersofintegersfrom1to%ld=",K,N);printf("%d\n",f2(N,K));}函數(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)用本身函數(shù)的遞歸調(diào)用舉例用遞歸函數(shù)求4!4!=4*3!;3!=3*2!;2!=2*1!;1!=1;n!=n*(n-1)!1!=1函數(shù)的遞歸調(diào)用舉例例:用遞歸函數(shù)求n!n!=n*(n-1)!intmyFac(intn){if(n==1)return1;//遞歸的結(jié)束條件

returnn*myFac(n-1);}myFac(n)就是求n!myFac(n-1)就是求(n-1)!函數(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!函數(shù)的遞歸調(diào)用舉例例:用遞歸函數(shù)求n!的完整程序#include<stdio.h>intmyFac(intn);main(){ intf,n; scanf("%d",&n); f=myFac(n); printf("%d!=%d\n",n,f);}intmyFac(intn){ ints;if(n==1) s=1;//遞歸的結(jié)束條件

elses=n*myFac(n-1);returns;}單步調(diào)試,理解遞歸程序的執(zhí)行流程函數(shù)的遞歸調(diào)用舉例遞歸算法的組成:遞歸終止條件:當(dāng)滿足一定條件時(shí),遞歸調(diào)用必須可以結(jié)束,否那么會(huì)無限地遞歸調(diào)用而導(dǎo)致程序無法結(jié)束。例如n!中當(dāng)n=1時(shí),令結(jié)果為1那么可以結(jié)束遞歸調(diào)用,否那么它將繼續(xù)調(diào)用(0)!而無限繼續(xù)下去。對(duì)于由多個(gè)通項(xiàng)表示的情況,那么需要給出最后一個(gè)遞歸調(diào)用的所有項(xiàng)的值。如an=an-1+an-2,要給出n=1時(shí)的結(jié)果以及n=2時(shí)結(jié)果才可以結(jié)束遞歸調(diào)用。遞歸表達(dá)式,如fac(n)=n*fac(n-1)函數(shù)的遞歸調(diào)用舉例求下數(shù)列的第20項(xiàng)的值。1,2,3,5,8,13,21,34……a1=1;a2=2;a3=a1+a2;…an=an-1+an-2;

函數(shù)的遞歸調(diào)用舉例求下數(shù)列的第20項(xiàng)的值。1,2,3,5,8,13,21,34……f(1)=1;f(2)=2;f(n)=f(n-1)+f(n-2);

函數(shù)的遞歸調(diào)用舉例main(){inta;a=f(20);printf(“%d〞,a);}intf(intn){ints;if(n==1)s=1;elseif(n==2)s=2;elses=f(n-1)+f(n-2);returns;}

模仿練習(xí)遞歸函數(shù)的編寫:1、用遞歸方法編寫函數(shù)求n!。函數(shù)定義如下:intrecFac(intn)2、用遞歸函數(shù)的方法編寫函數(shù)求斐波納契〔Fibonacci〕數(shù)列的第20項(xiàng)的值。函數(shù)定義如下:intFib(intn)其中n為該數(shù)列中的第n項(xiàng)。1,1,2,3,5,8,13……模仿練習(xí)遞歸函數(shù)的編寫:3、用遞歸算法,計(jì)算:1+2+3+…+n2222Date:04五月2023第四章模塊化程序設(shè)計(jì)授課要點(diǎn)數(shù)組的概念一維數(shù)組的定義和引用一維數(shù)組的初始化和賦值數(shù)組元素的遍歷

這樣做好嗎? 如果題目改為10個(gè)數(shù)、100個(gè)數(shù)該怎么做?

問題1:從鍵盤輸入5個(gè)整數(shù),逆序輸出這5個(gè)數(shù)。main(){ inta0,a1,a2,a3,a4; scanf(“%d〞,&a0); scanf(“%d〞,&a1); scanf(“%d〞,&a2); scanf(“%d〞,&a3); scanf(“%d〞,&a4); printf(“%d\n〞,a4); printf(“%d\n〞,a3); printf(“%d\n〞,a2); printf(“%d\n〞,a1); printf(“%d\n〞,a0);}在“學(xué)生成績管理系統(tǒng)〞中,我們需要對(duì)多個(gè)學(xué)生進(jìn)行處理,比方100個(gè)學(xué)生,是否必須定義100個(gè)變量呢? Studentstu1; Studentstu2; Studentstu3; … Studentstu100;定義多個(gè)變量,在定義、輸入、輸出、處理的時(shí)候非常不方便。如果需要處理5000個(gè)學(xué)生的成績,情況就更糟。問題2以上兩個(gè)例子有什么共同之處?問題2具有相同的數(shù)據(jù)類型!數(shù)組的概念數(shù)組是一組變量,滿足以下條件:

〔1〕具有相同的名字

〔2〕具有相同的數(shù)據(jù)類型

〔3〕在存儲(chǔ)器中連續(xù)存放每個(gè)變量名字相同下標(biāo)不同,稱為“數(shù)組元素〞“數(shù)組名〞代表整個(gè)數(shù)組,其值是這組變量在內(nèi)存中所占連續(xù)存儲(chǔ)空間的首地址。數(shù)組要先定義后使用。數(shù)組名不能與相同作用域的其他變量名重名問題如何定義數(shù)組?如何為數(shù)組元素賦值?如何引用數(shù)組元素?一維數(shù)組的定義一維數(shù)組:只有一個(gè)下標(biāo)的數(shù)組定義形式為:類型說明符數(shù)組名[常量表達(dá)式]例如:inta[10];說明數(shù)組名為a數(shù)組中每個(gè)元素的數(shù)據(jù)類型為int類型10個(gè)數(shù)組元素[]內(nèi)是常量表達(dá)式,不能為變量1、定義100個(gè)整型變量2、定義50個(gè)浮點(diǎn)型變量3、定義1000個(gè)“學(xué)生〞變量,“學(xué)生〞類型定義如下:typedefstruct{ characNum[10]; characName[15]; ……}Student;模仿練習(xí)以下一維數(shù)組的定義是否正確?

inta[];#defineSIZE100floatb[SIZE];intn=10;charc[n];int2a[10];錯(cuò)誤,沒有指明數(shù)組的大小inta[10];正確,SIZE是常量,相當(dāng)于floatb[100];錯(cuò)誤,數(shù)組的大小不能是變量,應(yīng)為inta[10];錯(cuò)誤,數(shù)組名2a不符合標(biāo)識(shí)符的命名規(guī)則數(shù)組元素的引用數(shù)組就是一組變量的集合,每個(gè)數(shù)組元素相當(dāng)于是一個(gè)變量數(shù)組元素的表示:數(shù)組名[下標(biāo)]如:inta[5];所定義的數(shù)組就是五個(gè)變量的集合,分別是: a[0],a[1],a[2],a[3],a[4]inta[N];下標(biāo)的取值范圍:0~N-1,其中N為數(shù)組的大小下標(biāo)是整型值,可以是整型常量、整型變量或整型表達(dá)式如:a[i]a[3+1]a[2*i-1]注意:下標(biāo)不能越界,否那么可能覆蓋其他數(shù)據(jù),造成嚴(yán)重后果定義數(shù)組之后,與普通變量一樣,數(shù)組是沒有初始值的,各存儲(chǔ)單元的值都是不定的。初始化:定義數(shù)組的同時(shí)賦初值語法:數(shù)據(jù)類型說明符數(shù)組名[長度]={數(shù)值1,數(shù)值2,…};

如:intdata[10]={0,1,2,3,4,5,6,7,8,9};一維數(shù)組的初始化1、定義并初始化一個(gè)float型數(shù)組,包含5個(gè)元素。2、定義并初始化一個(gè)字符型數(shù)組,包含6個(gè)元素。3、定義一個(gè)全0的整形數(shù)組,包含15個(gè)元素。模仿練習(xí)初始化本卷須知:(1)允許初始化一局部元素,其他沒有賦初值的元素初值為0;inta[10]={0,1,2,3,4,5};相當(dāng)于inta[10]={0,1,2,3,4,5,0,0,0,0};(2)允許初始化時(shí)省略數(shù)組的長度,數(shù)組的長度

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論