模塊化的程序設(shè)計_第1頁
模塊化的程序設(shè)計_第2頁
模塊化的程序設(shè)計_第3頁
模塊化的程序設(shè)計_第4頁
模塊化的程序設(shè)計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論