第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計_第1頁
第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計_第2頁
第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計_第3頁
第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計_第4頁
第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗三

項目名稱:循環(huán)結(jié)構(gòu)程序設(shè)計實驗?zāi)康?、熟練掌握for語句的使用;2、熟練掌握break語句與continue語句的使用;3、能夠用循環(huán)實現(xiàn)一些常用算法;4、循環(huán)嵌套的應(yīng)用。實驗四:

項目名稱:數(shù)組

實驗?zāi)康?/p>

1、熟練掌握一維數(shù)組、二維數(shù)組定義、賦值和輸入輸出方法;

2、熟練掌握字符數(shù)組和字符串函數(shù)的使用;

3、掌握有關(guān)數(shù)組的一些常用算法;

實驗內(nèi)容:習(xí)題6.5,6.13,6.15實驗?zāi)康?、掌握函數(shù)的定義方法;2、掌握函數(shù)的調(diào)用及函數(shù)聲明;3、掌握局部變量和全局變量的使用。實驗內(nèi)容1、習(xí)題7.3;2、習(xí)題7.8;3、習(xí)題7.18;(選做)4、找出以下程序的正確運行結(jié)果,并對結(jié)果進行分析實驗五

項目名稱:函數(shù)#defineMAX10inta[MAX],i;main(){ printf(“\n”);

sub1();

sub3(a);

sub2();

sub3(a);}sub2(){ inta[MAX],i,max;

max=5;

for(i=0;i<max;i++)

a[i]=i;}sub1(){ for(i=0;i<MAX;i++)

a[i]=i+i;}sub3(inta[]){ inti;

for(i=0;i<MAX;i++)

printf("%d",a[i]);

printf("\n");}實驗六指針和結(jié)構(gòu)體實驗內(nèi)容:第八章習(xí)題:8.6(要求預(yù)習(xí)報告)第九章習(xí)題:9.5第七章用函數(shù)實現(xiàn)

模塊化程序設(shè)計秦丹陽黑龍江大學(xué)電子工程學(xué)院通信工程系TEL:86608943E-mail:qindanyang@7.1

為什么要用函數(shù)模塊化程序設(shè)計基本思想:將一個大的程序按功能分割成一些小模塊,每個模塊用來實現(xiàn)一個特定的功能。特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之C是模塊化程序設(shè)計語言程序中函數(shù)調(diào)用示意圖#include<stdio.h>/*8-1.c*/intmain(){ voidprintstar(); /*對printstar函數(shù)進行聲明*/ voidprint_message(); /*對print_message函數(shù)進行聲明*/ printstar(); /*調(diào)用printstar函數(shù)*/ print_message(); /*調(diào)用print_message函數(shù)*/ printstar(); return0; /*調(diào)用printstar函數(shù)*/}voidprintstar() /*定義printstar函數(shù)*/{ printf(“********************************\n”);}voidprint_message() /*定義print_message函數(shù)*/{ printf(“Howdoyoudo!\n”);}********************************

Howdoyoudo!********************************函數(shù)說明一個C程序是由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。一個源程序文件可以為多個C程序共用。每個源程序文件由若干函數(shù)組成。一個源程序文件是一個編譯單位。C程序的執(zhí)行從main函數(shù)開始,也從main函數(shù)終止。必須有且只能有一個名為main的主函數(shù)源程序中所有的函數(shù)在結(jié)構(gòu)上都是平行的,即在定義函數(shù)時是分別進行的,互相獨立的。一個函數(shù)并不從屬于另一個函數(shù),即函數(shù)不能嵌套定義。main函數(shù)可以調(diào)用其他函數(shù),其他函數(shù)之間可以互相調(diào)用。main函數(shù)是系統(tǒng)調(diào)用的。函數(shù)分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供,用戶不用定義,可以直接使用用戶自定義函數(shù):用以解決用戶專門需要的函數(shù)從函數(shù)形式無參函數(shù)在調(diào)用無參函數(shù)時,主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。一般用來執(zhí)行指定的一組操作。有參函數(shù)在調(diào)用函數(shù)時,主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件voidprintstar() voidprint_message()intmax(intx,inty)7.2

怎么定義函數(shù)7.2.1為什么要定義函數(shù)定義函數(shù)應(yīng)包括的內(nèi)容指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)的類型,即函數(shù)返回值的類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用時向它們傳遞數(shù)據(jù)指定函數(shù)功能intmax(intx,inty)7.2.2定義函數(shù)的方法定義無參函數(shù)合法標(biāo)識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(){

聲明部分 語句部分}函數(shù)類型函數(shù)名(void){

聲明部分 語句部分}例無參函數(shù)

voidprintstar(){printf(“**********\n”);}或

voidprintstar(void){printf(“**********\n”);}定義有參函數(shù)合法標(biāo)識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形式參數(shù)列表){

聲明部分

語句部分}例有參函數(shù)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)

intmax(intx,y){intz;z=x>y?x:y;return(z);}定義空函數(shù)函數(shù)類型函數(shù)名(){

}例空函數(shù)

voiddummy(){}函數(shù)體為空#include<stdio.h>/*1-3.c*/intmain(){intmax(intx,inty);inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“max=%d\n”,c);return0;}輸入:4,6輸出:6intmax(intx,inty){ intz; if(x>y) z=x; elsez=y; return(z);}

求最大值函數(shù)函數(shù)類型函數(shù)名(形參表)形參類型說明{

說明部分 語句部分}傳統(tǒng)風(fēng)格:例有參函數(shù)(傳統(tǒng)風(fēng)格)

intmax(x,y)

intx,y;{intz;z=x>y?x:y;return(z);}7.3

調(diào)用函數(shù)7.3.1函數(shù)調(diào)用的形式函數(shù)調(diào)用的一般形式函數(shù)名(實參表列)說明:若調(diào)用無參函數(shù),則實參表為空,但括號不能省略若實參表列包含多個實參,則各參數(shù)間用逗號隔開。實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)實參表求值順序,因系統(tǒng)而定(TurboC自右向左)voidprintstar()voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain()/*8-7.c*/{inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例參數(shù)求值順序voidmain(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}運行結(jié)果:0運行結(jié)果:1調(diào)用方式函數(shù)調(diào)用語句:把函數(shù)調(diào)用單獨作為一個語句例printstar();printf(“Hello,World!\n”);函數(shù)表達式:函數(shù)調(diào)用出現(xiàn)在另一個表達式中例m=max(a,b)*2;函數(shù)參數(shù):

函數(shù)調(diào)用作為另一個函數(shù)調(diào)用時的實參例printf(“%d”,max(a,b));m=max(a,max(b,c));說明:調(diào)用函數(shù)不一定要求包括分號7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞形式參數(shù)和實際參數(shù)形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名。簡稱“形參”實際參數(shù):在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)或表達式。簡稱“實參”實參和形參間的數(shù)據(jù)傳遞(虛實結(jié)合)在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳遞給被調(diào)用函數(shù)的形參該值在函數(shù)調(diào)用期間有效,可以參加該函數(shù)中的運算c=max(a,b);(main函數(shù))

(max函數(shù))intmax(intx,inty){intz;z=x>y?x:y;return(z);}【例7.2】輸入兩個整數(shù),要求輸出其中值較大者,要求用函數(shù)實現(xiàn)intmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);return0;}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參實參對max函數(shù)的聲明定義有參函數(shù)max說明:實參可以是常量、變量或表達式,但必須有確定的值。在調(diào)用時將實參的值賦給形參形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換如:max(3,a+b)7.3.3函數(shù)調(diào)用過程形參在未被調(diào)用時,不占內(nèi)存中的存儲單元在發(fā)生函數(shù)調(diào)用時,形參被臨時分配內(nèi)存單元將實參對應(yīng)的值傳遞給形參在執(zhí)行被調(diào)用函數(shù)期間,由于形參已經(jīng)有值,可以利用形參進行相關(guān)的運算通過return語句將函數(shù)值帶回到主調(diào)函數(shù)。若函數(shù)不需要返回值,則不需要return語句(void)調(diào)用結(jié)束,形參內(nèi)存單元被釋放。c=max(a,b);(main函數(shù))

(max函數(shù))intmax(intx,inty){intz;z=x>y?x:y;return(z);}例計算x的立方#include<stdio.h>/*8-2.c*/floatcube(floatx){return(x*x*x);}voidmain(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞(實參->形參)711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:例交換兩個數(shù)/*8-3.c*/#include<stdio.h>voidmain(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");

swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp#include<stdio.h>/*8-4.c*/

longsum(inta,intb);longfactorial(intn);voidmain(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);

return(c1+c2);}

longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;

return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)類型說明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實參7.3.4函數(shù)的返回值返回語句形式:return(表達式);

return表達式;

return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)c=max(a,b);(main函數(shù))

(max函數(shù))intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}說明:函數(shù)中可有多個return語句如果不需要從被調(diào)函數(shù)帶回函數(shù)值可不要return語句return語句后面的括號可以不要;return后面的值可以是一個表達式。若無return語句,遇}時,自動返回調(diào)用函數(shù)在定義函數(shù)時需指定函數(shù)值的類型,如無函數(shù)類型說明,則自動按整型處理。函數(shù)類型要與return語句中的表達式類型一致。若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換不帶回值的函數(shù),應(yīng)當(dāng)用void定義函數(shù)為無類型(空類型),此時函數(shù)體中不得出現(xiàn)return語句。例無返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}intmax(intx,inty){returnx>y?x:y;}例函數(shù)返回值類型轉(zhuǎn)換voidmain()/*8-6.c*/{intmax(floatx,floaty)floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;z=x>y?x:y;

return(z);}printstar()/*8-5.c*/{printf("**********");}voidmain(){inta;a=printstar();printf("%d",a);}例函數(shù)帶回不確定值輸出:10voidprintstar(){printf("**********");}voidmain(){inta;a=printstar();printf("%d",a);}編譯錯誤!對被調(diào)用函數(shù)要求:必須是已經(jīng)定義的函數(shù)若使用庫函數(shù):#include<*.h>用戶自定義函數(shù):若該函數(shù)的位置在主調(diào)函數(shù)后面時,在主調(diào)函數(shù)中對被調(diào)用函數(shù)作聲明7.4

對被調(diào)用函數(shù)的聲明和函數(shù)原型【例7.4

】輸入兩個實數(shù),用一個函數(shù)求出它們之和main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)/*ch7_5.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明/*8-8.c*/intmain(){floatadd(floatx,floaty);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd(float,float);函數(shù)聲明一般形式:函數(shù)類型函數(shù)名(形參類型1形參名1,形參類型2形參名2,…);

或函數(shù)類型函數(shù)名(形參類型1,形參類型2,…);作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)聲明不同(;)函數(shù)聲明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)聲明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前文件開頭已對本文件中所調(diào)用的函數(shù)進行了聲明有些系統(tǒng)要求函數(shù)聲明指出函數(shù)返值類型和形參類型,并且對void和int型函數(shù)也要進行函數(shù)聲明voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}7.5

函數(shù)的嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b

例求三個數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>/*8-9.c*/

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)【例7.5】輸入4個整數(shù),找出其中最大的數(shù)。用函數(shù)的嵌套調(diào)用處理#include<stdio.h>intmain(){ intmax4(inta,intb,intc,intd); inta,b,c,d,max; printf("pleaseenter4intergernumbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d\n",max); return0;}intmax4(inta,intb,intc,intd){ intmax2(inta,intb); intm; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m);}

intmax2(inta,intb){ if(a>=b) returna; else returnb;}定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說明C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}7.6函數(shù)的遞歸調(diào)用例求n的階乘/*ch7_8.c*/#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}7.7

數(shù)組作為函數(shù)參數(shù)(5.6)7.7.1數(shù)組元素作函數(shù)實參——值傳遞【例7.9】輸入10個數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個數(shù).定義一個數(shù)組a,長度為10,用來存放10個數(shù).設(shè)計一個函數(shù)max,用來求兩個數(shù)中的大者.主函數(shù)中定義一個變量m,用來存放max函數(shù)返回值#include<stdio.h>intmain(){intmax(intx,inty);inta[10],i,n,m;printf("Enter10integernumbers:");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("\n");for(i=1,m=a[0],n=0;i<10;i++) if(max(m,a[i])>m){m=max(m,a[i]); n=i;}printf(“thelargestnumberis%d\n”,m);

printf(“

itisthe%dthnumber.\n”,n+1);return0;}intmax(intx,inty){return(x>y?x:y);}例兩個數(shù)組大小比較(5.7)432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b為有10個元素的整型數(shù)組比較兩數(shù)組對應(yīng)元素變量n,m,k記錄a[i]>b[i],a[i]==b[i],a[i]<b[i]的個數(shù)最后若n>k,認(rèn)為數(shù)組a>b

若n<k,認(rèn)為數(shù)組a<b

若n==k,認(rèn)為數(shù)組a==b#include<stdio.h>/*8-11.c*/voidmain(){inta[10],b[10],i,n=0,m=0,k=0;printf("Enterarraya:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("Enterarrayb:\n");for(i=0;i<10;i++) scanf("%d",&b[i]);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}

/*Output*/}intlarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}7.7.2數(shù)組名作函數(shù)參數(shù)地址傳遞:傳遞的是數(shù)組首元素的地址在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量【例7.10】有一個一維數(shù)組score,內(nèi)放10個學(xué)生成績,求平均成績

#include<stdio.h>/*8-12.c*/intmain(){floataverage(floatarray[10]);floatscore[10],aver;inti;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);printf("\n");aver=average(score);printf("Averageis:%5.2f",aver);return0;}floataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;returnaver;}實參用數(shù)組名形參用數(shù)組定義,

floatarray[]..2109score562312….….88array地址傳遞:傳遞的是數(shù)組首元素的地址在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量例求學(xué)生的平均成績(形參數(shù)組長度可變)..2109score562312….….88array#include<stdio.h>/*8-13.c*/voidmain(){floataverage(floatarray[10],intn);floatarray[10],aver;inti;printf("Input10scores:\n");for(i=0;i<10;i++) scanf("%f",&array[i]);aver=average(array,10);printf("Averageis:%.2f",aver);}#include<stdio.h>/*8-13.c*/voidmain(){floataverage(floatarray[],intn);floatarray_1[6],aver_1;floatarray_2[5],aver_2;inti;printf("Input6scores:\n");for(i=0;i<6;i++) scanf("%f",&array_1[i]);aver_1=average(array,6);printf("Input5scores:\n");for(i=0;i<5;i++) scanf("%f",&array_2[i]);aver_2=average(array,5);printf("Averageofarray1is:%.2f",aver_1);printf("Averageofarray2is:%.2f",aver_2);}floataverage(floatarray[],intn){inti;floataver,sum=0;for(i=0;i<n;i++)sum+=array[i];aver=sum/n;returnaver;}例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較12a調(diào)用前a[0]a[1]12a調(diào)用a[0]a[1]12xy21xy交換12a返回#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}voidmain(){inta[2]={1,2};

swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞12a調(diào)用前12ax調(diào)用21ax交換21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}voidmain(){inta[2]={1,2};

swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較【例7.12】用選擇法對數(shù)組中10個整數(shù)按由大到小排序排序過程:(1)首先通過n-1次比較,從n個數(shù)中找出最小的,將它與第一個數(shù)交換—第一趟選擇排序,結(jié)果最小的數(shù)被安置在第一個元素位置上(2)再通過n-2次比較,從剩余的n-1個數(shù)中找出關(guān)鍵字次小的記錄,將它與第二個數(shù)交換—第二趟選擇排序(3)重復(fù)上述過程,共經(jīng)過n-1趟排序后,排序結(jié)束例初始:[49386597761327]kji=11349一趟:13[386597764927]i=22738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]kkkkjjjjjjjjjj/*7-5.c*/#include<stdio.h>voidmain(){inta[10],i,j,k,x;printf("Input10numbers:\n");

for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");

for(i=0;i<9;i++)

{k=i;

for(j=i+1;j<10;j++)

if(a[j]<a[k])k=j;

if(i!=k){x=a[i];a[i]=a[k];a[k]=x;}

}printf("Thesortednumbers:\n");

for(i=0;i<10;i++) printf("%d",a[i]);}例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}voidmain(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);

sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}voidmain(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);

sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}voidmain(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);

sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}【例7.13】有一個3*4的矩陣,求所有元素中的最大值1357246815173412ijmax=11357246815173412ijmax=31357246815173412ijmax=5j1357246815173412imax=7j1357246815173412imax=7j1357246815173412imax=34intmax_value(intarray[3][4]){inti,j,k,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];return(max);}voidmain(){inta[3][4]={{1,3,5,7}, {2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同

intarray[][4]7.7.3多維數(shù)組名作函數(shù)參數(shù)例求二維數(shù)組中各行元素之和get_sum_row(intx[][3],intresult[],introw,intcol){inti,j;for(i=0;i<row;i++){result[i]=0; for(j=0;j<col;j++) result[i]+=x[i][j];}}voidmain(){inta[2][3]={3,6,9,1,4,7};intsum_row[2],row=2,col=3,i;

get_sum_row(a,sum_row,row,col);for(i=0;i<row;i++)printf("Thesumofrow[%d]=%d\n",i+1,sum_row[i]);}314679asum_rowxresult18127.8

局部變量和全局變量 從變量的作用域(空間)角度來分,變量可以分為全局變量和局部變量7.8.1局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函數(shù)中同名變量voidmain(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}例復(fù)合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{

inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;

}for(i=0;i<N;i++)printf("%d",a[i]);}運行結(jié)果:54321例復(fù)合語句中變量#defineN5/*8-15.c*/main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{

inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;

}for(i=0;i<N;i++)printf("%d",a[i]);}例不同函數(shù)中同名變量voidmain()/*8-16.c*/{inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=47.8.2全局變量---外部變量定義: 在函數(shù)外定義,可為本文件所有函數(shù)共用有效范圍: 從定義變量的位置開始到本源文件結(jié)束intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍

應(yīng)盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯說明:設(shè)置全局變量的作用是增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道。若外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被屏蔽,不起作用。floatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin/*8-17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}運行結(jié)果:max=8/*8-18.c*/inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例外部變量副作用運行結(jié)果:*****練習(xí)#include<stdio.h>intx=5,y=6;voidfun1(){ intx=3,y=4; printf("%d,%d\n",x,y);}voidfun2(intx,inty){ printf("%d,%d\n",x,y);}intmain(){ fun1(); fun2(1,2); printf("%d,%d\n",x,y); return0;}分析運行結(jié)果3,41,25,67.9

變量的存儲方式和生存期(5.13,14)7.9.1動態(tài)存儲方式與靜態(tài)存儲方式(從變量值存在的時間角度來分)存儲方式靜態(tài)存儲:程序運行期間分配固定存儲空間動態(tài)存儲:程序運行期間根據(jù)需要動態(tài)分配存儲空間內(nèi)存用戶區(qū)生存期(變量存在的時間)靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護和返回地址等數(shù)據(jù)類型存儲類別:數(shù)據(jù)在內(nèi)存中存儲的方式(靜態(tài)和動態(tài)),具體包括4種:auto--自動型;register--寄存器型static--靜態(tài)型;extern---外部型根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。生存期:變量在某一時刻存在-------靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-------局部變量與全局變量每一個變量和函數(shù)都有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別如:intsum;

autointa,b,c;

registerinti;

staticfloatx,y;7.9.2局部變量的存儲類別1、自動變量(auto變量)在調(diào)用函數(shù)時系統(tǒng)會給變量分配存儲空間,在函數(shù)調(diào)用結(jié)束時自動釋放這些存儲空間,這類局部變量稱為自動變量自動變量用關(guān)鍵字auto作存儲類別的聲明。關(guān)鍵字“auto”可以省略,auto不寫則隱含確定為“自動存儲類別”,它屬于動態(tài)存儲方式。程序中大多數(shù)變量屬于自動變量。之前函數(shù)中定義變量都沒有聲明為auto,則都隱含指定為自動變量。intf(inta){autointb,c=3;…..}/*定義f函數(shù),a為形參*//*定義b,c為自動變量*/autointb,c=3; intb,c=3;

例auto變量的作用域main()/*8-19.c*/{voidprt(void);

intx=1;printf(“\n”);

{

intx=3;prt();printf(“2ndx=%d\n”,x);

}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}運行結(jié)果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域2、靜態(tài)局部變量(static局部變量)靜態(tài)局部變量:函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值。靜態(tài)局部變量用static進行聲明。#include<stdio.h>voidmain()/*8-20.c*/{intf(inta);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}運行結(jié)果:789#include<stdio.h>voidmain()/*8-20.c*/{intf(inta);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}說明:靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。自動變量屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。對靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,以后每次調(diào)用時都不再重新賦初值,而只是保留上次函數(shù)調(diào)用結(jié)束時的值。對自動變量賦初值,是在函數(shù)調(diào)用時進行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句若在定義局部變量時不賦初值,則對靜態(tài)局部變量來說,編譯時自動賦初值0(整型變量)。而對自動變量來說,如果不賦初值則它的值是不確定的值靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其它函數(shù)不能引用它#include<stdio.h>/*8-21.c*/voidmain(){intfac(intn);inti;for(i=1;i<=5;i++) printf(“%d!=%d\n”,i,fac(i));}intfac(intn){staticintf=1;f=f*n;return(f);}例輸出1到5的階乘值運行結(jié)果:1!=12!=23!=64!=245!=120main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運行結(jié)果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運行結(jié)果:1233、寄存器變量(register變量)寄存器變量:將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。寄存器變量用關(guān)鍵字register作聲明。只有局部自動變量和形式參數(shù)可以作為寄存器變量,其他不行。計算機系統(tǒng)中的寄存器數(shù)目有限,不能定義任意多個寄存器變量靜態(tài)局部變量不能定義為寄存器變量運算器內(nèi)存存數(shù)取數(shù)#include<stdio.h>voidmain(){longfac(long);longi,n;scanf(“%ld”,&n);for(i=1;i<=n;i++) printf(“%ld!=%ld\n”,i,fac(i));}longfac(longn){registerlongi,f=1;/*定義寄存器變量*/for(i=1;i<=n;i++) f=f*n;return(f);}使用寄存器變量如:register

staticinta,b,c;例變量的壽命與可見性#include<stdio.h>inti=1;main(){staticinta;

registerintb=-10;

intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;

other();}other(){staticinta=2;staticintb;

intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0靜態(tài)存儲區(qū)動態(tài)存儲區(qū)other:a2other:b0other:c10843315443other:c106751567.9.3全局變量的存儲類別用extern來聲明外部變量,以擴展外部變量的作用域在一個文件內(nèi)聲明外部變量在多文件的程序中聲明外部變量用extern聲明外部變量,擴展外部變量在程序文件中的作用域1、在一個文件內(nèi)擴展外部變量的作用域【例7.18】調(diào)用函數(shù),求3個整數(shù)中的大者#include<stdio.h>intmain(){ intmax(); externintA,B,C; printf(“Pleaseenterthreeintegernumbers:”); scanf(“%d%d%d”,&A,&B,&C); printf(“maxis%d\n”,max()); return0;}intA,B,C;intmax();{ intm; m=A>B?A:B; if(C>m)m=C; return(m);}運行結(jié)果:Pleaseenterthreeintegernumbers:346712maxis67externA,B,C;main(){voidgx(),gy();

externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例用extern擴展外部變量作用域運行結(jié)果:1:x=0y=02:x=135y=2463:x=135y=246注意:建議將外部變量的定義放在引用它的所有函數(shù)之前,避免在函數(shù)中多加一個extern聲明【例7.19】給定b的值,輸入A和m,求Ab和A的m次方intA;intmain(){intpower(intn);intb=3,c,d,m;printf("Enterthenumberaanditspower:\n");scanf("%d,%d",&A,&m);c=A*b;printf("%d*%d=%d\n",A,b,c);d=power(m);printf("%d**%d=%d",A,m,d);return0;}externintA;intpower(intn){inti,y=1;for(i=1;i<=n;i++) y*=A;return(y);}file1.cfile2.c2、將外部變量的作用域擴展到其他文件一個C程序可以由多個源程序文件組成,當(dāng)一個文件中要引用另一個文件中已定義變量時,用exter

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論