![模塊化的程序設(shè)計_第1頁](http://file4.renrendoc.com/view/d495a0b9b7c9635e29bf101b2a0097b7/d495a0b9b7c9635e29bf101b2a0097b71.gif)
![模塊化的程序設(shè)計_第2頁](http://file4.renrendoc.com/view/d495a0b9b7c9635e29bf101b2a0097b7/d495a0b9b7c9635e29bf101b2a0097b72.gif)
![模塊化的程序設(shè)計_第3頁](http://file4.renrendoc.com/view/d495a0b9b7c9635e29bf101b2a0097b7/d495a0b9b7c9635e29bf101b2a0097b73.gif)
![模塊化的程序設(shè)計_第4頁](http://file4.renrendoc.com/view/d495a0b9b7c9635e29bf101b2a0097b7/d495a0b9b7c9635e29bf101b2a0097b74.gif)
![模塊化的程序設(shè)計_第5頁](http://file4.renrendoc.com/view/d495a0b9b7c9635e29bf101b2a0097b7/d495a0b9b7c9635e29bf101b2a0097b75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章函數(shù)模塊化的程序設(shè)計優(yōu)點:1.各模塊相對獨立、功能單一、結(jié)構(gòu)清晰簡單2.控制了程序設(shè)計的復(fù)雜性3.每個模塊簡單,所以可靠性高是面向過程程序設(shè)計語言的核心。4.避免程序開發(fā)的重復(fù)勞動,縮短開發(fā)周期5.易于維護(hù)和功能擴(kuò)充概述1.一個C程序是由一個或多個源程序文件組成的,一個源程序文件可以被多個C程序公用;2.一個源程序文件由一個或多個函數(shù)組成;3.編譯的單位是源程序文件,而不是函數(shù);4.C程序的執(zhí)行從main函數(shù)開始,從main結(jié)束,
它可以調(diào)用其他函數(shù),而不能被其他函數(shù)調(diào)用;5.函數(shù)之間是獨立的,是非從屬關(guān)系的,是不可嵌套定義的,但可以互相調(diào)用.函數(shù)的分類按照函數(shù)定義的角度分為:1.標(biāo)準(zhǔn)庫函數(shù):2.用戶自定義的函數(shù)是由系統(tǒng)定義地,也不必在程序中進(jìn)行類型說明,要調(diào)用某個庫函數(shù),則要用預(yù)處理命令#include將該函數(shù)所在的頭文件包含到程序中.使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件按照函數(shù)的形式分為:無參函數(shù)有參函數(shù)按照函數(shù)的類型分為:有返回值無返回值函數(shù)的定義無參函數(shù)的定義類型標(biāo)識符函數(shù)名(){聲明部分執(zhí)行部分}一般不需要帶回返回值,所以可以不寫類型標(biāo)示符,自動按整型處理print_message(){
printf(“Hello!”);}有參函數(shù)的定義類型標(biāo)識符函數(shù)名(形參表列){聲明部分執(zhí)行部分}形參表列必須聲明形參的類型例如:intadd(intx,inty){intz;z=x+y;return(z);}空函數(shù)的定義類型標(biāo)識符函數(shù)名(){}函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)分為:實際參數(shù)和形式參數(shù)在函數(shù)定義的函數(shù)首部,函數(shù)名后的括號中說明的變量,簡稱形參。形參的個數(shù)可以有多個,多個形參之間用逗號隔開。形式參數(shù):實際參數(shù):函數(shù)被調(diào)用時,在調(diào)用處給出對應(yīng)的參數(shù),簡稱實參,實參往往是具有明確值的常量、變量或表達(dá)式等。intadd(intx,inty){intz;z=x+y;return(z);}main(){inta=10,b=24,sum;sum=add(a,b);
printf(”sum=%d\n",sum);}a10b24sumx10y24z3434運行結(jié)果:
sum=34
說明:1.形參在未出現(xiàn)函數(shù)調(diào)用時,他們并不占內(nèi)存,
只有發(fā)生函數(shù)調(diào)用時才會被分配空間,而且在該函數(shù)結(jié)束后,它所占的所有內(nèi)存也被釋放;2.實參必須是具有確定值的常量,變量或表達(dá)式;3.形參必須在定義時就聲明其類型;6.實參與形參的類型應(yīng)相同或賦值兼容;7.C語言規(guī)定,實參與形參之間必須是單向的值傳遞.4.實參的個數(shù)和形參的個數(shù)應(yīng)該相等;5.實參與形參在順序上應(yīng)該一一對應(yīng);函數(shù)的值即函數(shù)的返回值,是通過函數(shù)中的return語句獲得的.return語句的一般形式:return(表達(dá)式);return表達(dá)式;執(zhí)行過程:執(zhí)行return語句后,如果該表達(dá)式的類型與函數(shù)首部中定義的函數(shù)類型一致,則直接將結(jié)果返回主調(diào)函數(shù);否則,系統(tǒng)自動將結(jié)果的類型轉(zhuǎn)換成定義的函數(shù)類型.從執(zhí)行流程上看,return語句執(zhí)行后,程序就退出被調(diào)函數(shù),將函數(shù)值返回主調(diào)函數(shù),在主調(diào)函數(shù)中繼續(xù)執(zhí)行.無返回值的函數(shù)函數(shù)可以無返回值,可將它的返回值的類型定義為void,即“空類型”,且在函數(shù)體中,無return語句。函數(shù)的調(diào)用函數(shù)調(diào)用是使函數(shù)進(jìn)行一次實際的執(zhí)行。格式:函數(shù)名(實際參數(shù)表)
intadd(intx,inty){return(x+y);}main(){inta=10,b=24,sum;
printf("inputa,b:");sum=add(a,b);
printf(”sum=%d\n",sum);}函數(shù)的調(diào)用過程(1)根據(jù)函數(shù)名找到被調(diào)函數(shù),若沒找到,系統(tǒng)將報告出錯信息。(2)計算實際參數(shù)的值。(3)將實際參數(shù)的值傳遞給形式參數(shù)。(4)保護(hù)主調(diào)函數(shù)的現(xiàn)場,中斷主調(diào)函數(shù),
轉(zhuǎn)到被調(diào)函數(shù)的函數(shù)體中開始執(zhí)行。(5)遇到return語句或函數(shù)結(jié)束的花括號時,
返回主調(diào)函數(shù)。(6)恢復(fù)現(xiàn)場從主調(diào)函數(shù)的中斷處繼續(xù)執(zhí)行。函數(shù)之間的位置關(guān)系在一個程序中有多個函數(shù),那么,各函數(shù)之間的前后位置關(guān)系規(guī)定如下:(1)被調(diào)函數(shù)在前面,主調(diào)函數(shù)在后面。
即先定義后調(diào)用。(2)主調(diào)函數(shù)在前面,被調(diào)函數(shù)在后面。這時,必須在調(diào)用的語句之前,對被調(diào)用的函數(shù)進(jìn)行原型聲明(說明),可在主調(diào)函數(shù)的說明部分,也可在程序的開始處的說明部分進(jìn)行。常用的函數(shù)原型聲明方法是:
用函數(shù)定義中的函數(shù)首部,再加上一個分號。也可以省略函數(shù)首部中的形參名,但必須保留形參的類型。
intadd(intx,inty){
return(x+y);}main(){
inta=10,b=24,sum;
printf("inputa,b:");sum=add(a,b);
printf(”sum=%d\n",sum);}main(){
inta=10,b=24,sum;
intadd(intx,inty);
printf("inputa,b:");sum=add(a,b);
printf(”sum=%d\n",sum);}intadd(intx,inty){
return(x+y);}函數(shù)的嵌套調(diào)用在C語言中,函數(shù)調(diào)用允許嵌套,所謂函數(shù)的嵌套調(diào)用是指在主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)的過程中,被調(diào)函數(shù)又調(diào)用了另一被調(diào)函數(shù)。
main函數(shù)調(diào)用a函數(shù)a函數(shù)調(diào)用b函數(shù)b函數(shù)【例6.9】求圓環(huán)的面積。
#include<math.h>#definePI3.1415926floatarea_ring(floatx,floaty);floatarea(floatr);main(){floatr,r1;
printf("inputtwofigure:\n");
scanf("%f,%f",&r,&r1);
printf("area_ringis%f",area_ring(r,r1));}floatarea_ring(floatx,floaty){
floatc;c=fabs(area(x)-area(y));
return(c);}floatarea(floatr){
return(PI*r*r);}
函數(shù)的遞歸調(diào)用函數(shù)在它的函數(shù)體內(nèi)直接或間接調(diào)用它自身含義:在直接遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù);執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層,這種函數(shù)稱為遞歸函數(shù)直接遞歸a(){……a();
……}間接遞歸a(){……b();……}b(){……
a();……}用遞歸法計算n!。分析:求解n的階乘實際上有兩種方法,一種是連乘法,它基于階乘定義公式:
n!=1*2*3*…*n實現(xiàn)方法是用循環(huán)完成。另一種方法基于階乘遞歸定義公式:n!=
1(n<=1)n*(n-1)!(n>1)用函數(shù)的直接遞歸調(diào)用實現(xiàn)long
fac
(intn){longf;
if(n==1)f=1;elsef=
n*
fac
(n-1);
return(f);}#include<stdio.h>main(){intn;longy;long
fac(intn);
printf("\ninputaintegernumber:\n");
scanf("%d",&n);
if(n<0)printf("dataerror\n");else{y=
fac
(n);
printf("%d!=%ld",n,y);}}main()n=1n=2n=3n=4f=24f=6f=2f=1f=4*fac(3)f=3*fac(2)f=2*fac(1)f=1fac(4)注意:在遞歸調(diào)用過程中,不同層的同名局部變量是不同的,變成機(jī)器代碼后,執(zhí)行時相當(dāng)于將其拉成直線(線性程序代碼)。Hanoi塔問題。一塊板上有三根桿,a,b,c。a桿上套有64個圓盤,大的在下,小的在上。要把這64個圓盤從a桿移動c桿上,每次只能移動一個圓盤,b桿可以暫時存放。但在任何時候,任何桿上的圓盤都必須保持大盤在下,小盤在上。設(shè)將n個盤從a借助b移到c桿的算法為move(n,a,b,c),則:移動盤子算法如下:①把a(bǔ)上面的n-1個盤借助c移到b,記做
move(n-1,a,c,b);②把最下面的1個盤從a直接移到c;③把b上的n-1個盤借助a移到c,記做
move(n-1,b,a,c);顯然這是一個遞歸算法,按此算法編程如下:voidmove(intn,intx,inty,intz){if(n==1)printf("%c->%c\n",x,z);else{move(n-1,x,z,y);
printf("%c->%c\n",x,z);
move(n-1,y,x,z);}}main(){intm;
printf("\nInputnumber:");
scanf("%d",&n);
printf("thesteptomoving%2ddiskes:\n",m);move(n,'a','b','c');}…...move(3,'a','b','c');…...move(n,x,y,z);3,'a','b','c'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);2,'a',‘c',‘b'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);1,'a',‘b',‘c'2,'a',‘c',‘b'1,'a',‘b',‘c'n=1printf("->",x,z);1.a->c2.a->bmove(n,x,y,z);1,‘c',‘a(chǎn)',‘b'1,‘c',‘a(chǎn)',‘b'n=1printf("->",x,z);3.c->b4.a->cmove(n,x,y,z);2,‘b',‘a(chǎn)',‘c'2,‘b',‘a(chǎn)',‘c'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);1,‘b',‘c',‘a(chǎn)'1,‘b',‘c',‘a(chǎn)'n=1printf("->",x,z);5.b->a6.b->cmove(n,x,y,z);1,‘a(chǎn)',‘b',‘c'1,‘a(chǎn)',‘b',‘c'n=1printf("->",x,z);7.a->c數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實參一維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組首元素的起始地址。一維數(shù)組名作函數(shù)參數(shù)實參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長度可以省略,但[]不能省。例.從鍵盤輸入10個學(xué)生的成績,由高到低排序輸出成績。#include<stdio.h>#defineN10voidsort(intb[],intn);voidprintarr(intb[],intn);main(){inta[N],i;for(i=0;i<n;i++) scanf("%5d",&a[i]);
printf("Beforesort:\n");printarr(a,N);sort(a,N);printf("Aftersort:\n");printarr(a,N);}voidsort(intb[],intn){ inti,j,k,t; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) {if(b[i]<b[j]) {
t=b[i];
b[i]=b[k];b[k]=t; } }}voidprintarr(intb[],intn){inti;for(i=0;i<n;i++) printf("%5d",b[i]);
printf("\n");}1.用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)分別定義數(shù)組,不能只在一方定義;說明:2.實參數(shù)組與形參數(shù)組類型應(yīng)一致,如不一致,結(jié)果會出錯;3.實參數(shù)組和形參數(shù)組大小可以一致也可以不一致,C編譯對形參數(shù)組大小不作檢查,只是將實參數(shù)組的首地址傳給形參數(shù)組。4.形參數(shù)組也可以不指定大小,在定義數(shù)組時在數(shù)組名后面跟一個[];為了在被調(diào)用函數(shù)中處理數(shù)組元素的需要,可以另設(shè)一個參數(shù),傳遞數(shù)組元素的個數(shù)5.用數(shù)組名作函數(shù)實參時,不是把數(shù)組的值傳遞給形參,而是把
實參數(shù)組的起始地址傳遞給形參數(shù)組,這樣兩個數(shù)組就共占同一段內(nèi)存單元。以二維數(shù)組為例。二維數(shù)組名作實參時,對應(yīng)的形參也應(yīng)該定義為一個二維數(shù)組形式。對形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小,但是不能省略第二維參數(shù)的大小多維數(shù)組作函數(shù)參數(shù)例:有一個矩陣,求所有元素中的最大值:intmax_value(intarray[][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++){for(j=0;j<4;j++){if(array[i][j]>max)max=array[i][j];}}returnmax;}main(){
inta[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++)
scanf(“%d”,&a[i][j]);
printf("maxvalueis%d",max_value(a));}局部變量和全局變量根據(jù)變量作用域不同,變量分為局部變量和全局變量.所謂變量的作用域,是指該變量定義和使用的范圍.局部變量,是指作用域在某程序塊(函數(shù))中的變量說明:局部變量的使用范圍僅限于定義它的程序塊不同函數(shù)中的變量可以同名,它們互不影響形式參數(shù)也屬于局部變量main函數(shù)定義的變量也僅在main函數(shù)中有效全局變量:是指在任何函數(shù)之外定義的變量有效范圍是從定義開始,直至整個程序結(jié)束定義一個全局變量的目的就是讓多個函數(shù)可以共享全局變量的定義在函數(shù)外定義例:intfun();
intn=5;main(){intx;
printf(“%d\n”,n);x=fun();
printf(“%d,%d”,x,n);}
intfun(){inta=4;n=a;return(n);}運行結(jié)果:
54,4全局變量的初始值全局變量在編譯階段分配內(nèi)存,在執(zhí)行階段不釋放全局變量只進(jìn)行一次初始化,并且只能用常量如果程序中沒有給全局變量初始化,系統(tǒng)自動置0如果全局變量和局部變量通明,則在局部變量的作用范圍內(nèi),全局變量被屏蔽.intd=1;fun(intp){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年春八年級歷史下冊 第11課 城鄉(xiāng)人民生存狀態(tài)的滄桑巨變說課稿1(pdf) 川教版
- Unit 2 Understanding each other Project 說課稿-2023-2024學(xué)年高中英語牛津譯林版(2020)選擇性必修第四冊
- Unit 6 Meet my family Part B Let's talk Let's learn大單元整體說課稿表格式-2024-2025學(xué)年人教PEP版英語四年級上冊
- 2024年秋七年級生物上冊 3.5.2 綠色植物的呼吸作用說課稿 (新版)新人教版001
- 葡萄園立柱施工方案
- 2023三年級數(shù)學(xué)下冊 三 美麗的街景-兩位數(shù)乘兩位數(shù)信息窗1 美麗的街燈第2課時說課稿 青島版六三制
- 預(yù)制水泥臨時圍墻施工方案
- 臨時合同范例復(fù)制
- 西安電動推拉雨棚施工方案
- 2024秋一年級語文上冊 漢語拼音 11 ie üe er說課稿 新人教版
- 2024美團(tuán)簡化版商家合作合同標(biāo)準(zhǔn)文本一
- 2025年貴州黔源電力股份有限公司招聘筆試參考題庫含答案解析
- 《休閑食品加工技術(shù)》 課件 1 休閑食品生產(chǎn)與職業(yè)生活
- 春季開學(xué)安全第一課
- 2025年新生兒黃疸診斷與治療研究進(jìn)展
- 廣東大灣區(qū)2024-2025學(xué)年度高一上學(xué)期期末統(tǒng)一測試英語試題(無答案)
- 2025年四川中煙工業(yè)限責(zé)任公司招聘110人高頻重點提升(共500題)附帶答案詳解
- 課題申報書:數(shù)智賦能高職院校思想政治理論課“金課”實踐路徑研究
- 公司安全生產(chǎn)事故隱患內(nèi)部報告獎勵工作制度
- H3CNE認(rèn)證考試題庫官網(wǎng)2022版
- 感統(tǒng)訓(xùn)練培訓(xùn)手冊(適合3-13歲兒童)
評論
0/150
提交評論