![第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第1頁](http://file4.renrendoc.com/view/a480236da215c3104d35b919b38fb601/a480236da215c3104d35b919b38fb6011.gif)
![第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第2頁](http://file4.renrendoc.com/view/a480236da215c3104d35b919b38fb601/a480236da215c3104d35b919b38fb6012.gif)
![第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第3頁](http://file4.renrendoc.com/view/a480236da215c3104d35b919b38fb601/a480236da215c3104d35b919b38fb6013.gif)
![第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第4頁](http://file4.renrendoc.com/view/a480236da215c3104d35b919b38fb601/a480236da215c3104d35b919b38fb6014.gif)
![第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第5頁](http://file4.renrendoc.com/view/a480236da215c3104d35b919b38fb601/a480236da215c3104d35b919b38fb6015.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章函數(shù)-模塊化程序設(shè)計(jì)
C語言程序設(shè)計(jì)
第七章函數(shù)概述函數(shù)定義的一般形式函數(shù)參數(shù)和函數(shù)的值函數(shù)的調(diào)用函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用數(shù)組作為函數(shù)參數(shù)局部變量和全局變量(自習(xí))變量的存儲(chǔ)類別(自習(xí))內(nèi)部函數(shù)和外部函數(shù)(自習(xí))運(yùn)行一個(gè)多文件的程序(自習(xí))<>本章學(xué)習(xí)目標(biāo):
C語言程序設(shè)計(jì)
第七章函數(shù)認(rèn)識(shí)到函數(shù)是一種簡化程序結(jié)構(gòu)的重要手段;理解函數(shù)調(diào)用和函數(shù)調(diào)用過程中的參數(shù)傳遞;理解函數(shù)原型(聲明)和怎樣寫函數(shù)原型;能夠用前幾章的知識(shí)實(shí)現(xiàn)簡單的函數(shù);能夠用return語句實(shí)現(xiàn)函數(shù)的返回值;能夠理解函數(shù)調(diào)用過程中形式參數(shù)和實(shí)際參數(shù)的關(guān)系,理解數(shù)組名作為函數(shù)參數(shù)時(shí)代表的意義;能夠理解函數(shù)的嵌套調(diào)用和遞歸調(diào)用機(jī)制
。<>7.1
概述函數(shù)的概念
C語言程序設(shè)計(jì)
第七章函數(shù)一個(gè)大的程序一般應(yīng)分為若干個(gè)程序模塊,每個(gè)模塊實(shí)現(xiàn)一個(gè)特定的功能,這些模塊稱為子程序,在C語言中子程序用函數(shù)實(shí)現(xiàn)。函數(shù)是C語言中模塊化編程的最小單位。mainabca1abb1b2不能被調(diào)用所有函數(shù)都是平行的,不能嵌套定義分為:庫函數(shù)和自定義函數(shù)<>
C語言程序設(shè)計(jì)
第七章函數(shù)多個(gè)函數(shù)的常用調(diào)用方法一、常規(guī)方法:各函數(shù)包含在一個(gè)文件中例T7-1.c#include<stdio.h>
voidmain(){voidprintstar();voidprint_message();printstar();print_message();printstar();}voidprintstar(){printf(“***********************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}運(yùn)行結(jié)果:****************************
Howdoyoudo!****************************<>
C語言程序設(shè)計(jì)
第七章函數(shù)二、文件包含的方法在主函數(shù)中使用文件包含預(yù)編譯命令(宏定義),將不在本文件而在其它文件中的函數(shù)進(jìn)行預(yù)編譯處理把各文件中的函數(shù)包含到本文件中來,然后一起進(jìn)行編譯、連接、運(yùn)行。
T7-1-1.cp1(){printf(“*********************\n”);}T7-1-2.cp2(){printf(“Howdoyoudo!\n”);}T7-1-3.c#include“T7-1-1.c”#include“T7-1-2.c”main(){ p1(); p2(); p1();}運(yùn)行結(jié)果同上<>幾點(diǎn)說明:(1)一個(gè)源文件由一個(gè)或者多個(gè)函數(shù)組成。(2)一個(gè)C程序由一個(gè)或者多個(gè)源文件組成。(3)C程序的執(zhí)行從main函數(shù)開始。(4)所有的子函數(shù)都是平行的。(5)從用戶的角度看,函數(shù)分庫函數(shù)和自定義函數(shù)。(6)函數(shù)形式:①無參函數(shù):主調(diào)函數(shù)無數(shù)據(jù)傳送給被調(diào)函數(shù),可帶或不帶返回值。②有參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)間有參數(shù)傳遞,主調(diào)函數(shù)可將實(shí)參傳送給被調(diào)函數(shù)的形參,被調(diào)函數(shù)的數(shù)據(jù)可返回主調(diào)函數(shù)。
C語言程序設(shè)計(jì)
第七章函數(shù)
根據(jù)(1)(2)(3)可知,邏輯上一個(gè)C語言程序是由函數(shù)構(gòu)成的,C語言程序從主函數(shù)開始執(zhí)行,在主函數(shù)中調(diào)用其他函數(shù),這些函數(shù)可能又調(diào)用別的函數(shù),主函數(shù)執(zhí)行完畢代表整個(gè)程序結(jié)束。主函數(shù)只能調(diào)用不能被調(diào)用。一個(gè)程序由一個(gè)或者若干個(gè)文件(源文件)構(gòu)成,函數(shù)分別放置在這些文件中。<>7.2
函數(shù)定義的一般形式無參函數(shù)的定義形式類型標(biāo)識(shí)符:用于指定函數(shù)帶回的值的類型,不寫時(shí)為int型。不帶回值時(shí)可以不寫。
C語言程序設(shè)計(jì)
第七章函數(shù)類型標(biāo)識(shí)符函數(shù)名(){
說明部分語句}例無參函數(shù)
printstar(){printf(“**********\n”);}或
printstar(void){printf(“**********\n”);}合法標(biāo)識(shí)符函數(shù)體<>有參函數(shù)定義的一般形式
C語言程序設(shè)計(jì)
第七章函數(shù)類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列){說明部分語句}函數(shù)返回值類型隱含為int型函數(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ù)為擴(kuò)充功能預(yù)留,在主調(diào)函數(shù)中先占一個(gè)位置。
C語言程序設(shè)計(jì)
第七章函數(shù)類型標(biāo)識(shí)符函數(shù)名(){}例空函數(shù)
dummy(){}函數(shù)體為空<>7.3
函數(shù)參數(shù)和函數(shù)的值形式參數(shù)和實(shí)際參數(shù)形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式
C語言程序設(shè)計(jì)
第七章函數(shù)例7.2比較兩個(gè)數(shù)并輸出大者#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}運(yùn)行:7,8Maxis8<>幾點(diǎn)說明:實(shí)參可以是常量、變量或表達(dá)式。必須有確定的值。當(dāng)函數(shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參,若是數(shù)組名,則傳送的是數(shù)組首地址。形參必須指定類型,只能是簡單變量或數(shù)組,不能是常量或表達(dá)式形參與實(shí)參類型一致,個(gè)數(shù)相同順序相同。若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放實(shí)參對(duì)形參的數(shù)據(jù)傳送是值傳送,也是單向傳送,當(dāng)被調(diào)函數(shù)的形參發(fā)生變化時(shí),并不改變主調(diào)函數(shù)實(shí)參的值。形、實(shí)參占據(jù)的是不同的存儲(chǔ)單元
C語言程序設(shè)計(jì)
第七章函數(shù)<>
C語言程序設(shè)計(jì)
第七章函數(shù)例:形、實(shí)參占據(jù)的是不同的存儲(chǔ)單元#include<stdio.h>intadd(intx,inty);voidmain(){inta=2,b=3;printf(“a=%d,b=%d\n”,a,b);printf(“&a=%x,&b=%x\n”,&a,&b);add(a,b);printf(“a=%d,b=%d\n”,a,b);printf(“&a=%x,&b=%x\n”,&a,&b);}add(intx,inty){x=x+8;y=y+12;printf(“x=%d,y=%d\n”,x,y);printf(“&x=%x,&y=%x\n”,&x,&y);}
2+8=103+12=1523ffd2ffd4ffd6ffd8xayb運(yùn)行結(jié)果:a=2,b=3&a=18ffd6,&b=18ffd8
x=10,y=15&x=18ffd2,&y=18ffd4a=2,b=3&a=18ffd6,&b=18ffd8<>函數(shù)的返回值返回語句形式:
return(表達(dá)式);或
return表達(dá)式;
功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)
C語言程序設(shè)計(jì)
第七章函數(shù)15說明:函數(shù)的返回值,必須用return語句帶回。return語句只能把一個(gè)返值傳遞給調(diào)用函數(shù)。函數(shù)中可有多個(gè)return語句,執(zhí)行哪一個(gè)由程序執(zhí)行情況來定。
if(a>b)return(a);elsereturn(b);return后的值可以是一個(gè)表達(dá)式,如:return(x>y?x:y);返回值的類型為定義的函數(shù)類型,不指定的按整型處理。如:intmax(intx,inty)floatmin(floata,floatb)doubleabc(floatd1,floatd2)<>若return語句中表達(dá)式類型與函數(shù)類型不一致,則轉(zhuǎn)換為函數(shù)類型。若無return語句,遇}時(shí),自動(dòng)返回調(diào)用函數(shù)??赡芊祷匾粋€(gè)不確定或無用的值。無返回值的函數(shù),定義為void類型。
C語言程序設(shè)計(jì)
第七章函數(shù)printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}例:無return語句,函數(shù)帶回不確定值輸出:**********10voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}編譯錯(cuò)誤!<>
C語言程序設(shè)計(jì)
第七章函數(shù)
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}例:無返回值函數(shù)例7.3:函數(shù)返回值類型轉(zhuǎn)換#include<stdio.h>voidmain(){intmax(floatx,floaty);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);}輸入:1.5,2.5輸出:Maxis2<>7.4
函數(shù)的調(diào)用主調(diào)函數(shù):主動(dòng)去調(diào)用其它函數(shù)被調(diào)函數(shù):被其它函數(shù)所調(diào)用函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)參表列)說明:實(shí)參表列:有確定值的數(shù)據(jù)或表達(dá)式實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng),當(dāng)有多個(gè)實(shí)參時(shí),實(shí)參間用“,”分隔實(shí)參表求值順序,因編譯器而定(一般
自右向左)調(diào)用無參函數(shù)時(shí),實(shí)參表列為空,但()不能省
C語言程序設(shè)計(jì)
第七章函數(shù)<>
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>voidmain(){intf(inta,intb);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);}例7.4參數(shù)求值順序按自右向左求值函數(shù)調(diào)用等于f(3,3)運(yùn)行結(jié)果:0按自左向右求值函數(shù)調(diào)用等于f(2,3)運(yùn)行結(jié)果:-1為使程序有通用性:需自右向左求值時(shí),改為:j=++i;p=f(j,j);需自左向右求值時(shí),改為:j=i;k=++i;p=f(j,k);Printf(“%d,%d”,i,i++);/*同樣存在此情況*/<>函數(shù)調(diào)用的方式按函數(shù)在程序中出現(xiàn)的位置,有三種調(diào)用方式:函數(shù)語句:以獨(dú)立的語句去調(diào)用函數(shù)。不要求有返回值,僅完成一定的操作。例printstar();printf(“Hello,World!\n”);函數(shù)表達(dá)式:函數(shù)返回一個(gè)確定值,以參加表達(dá)式的運(yùn)算。不可用于void定義函數(shù)類型例m=max(a,b)*2;函數(shù)參數(shù):函數(shù)調(diào)用作為另一個(gè)函數(shù)的參數(shù)。例printf(“%d”,max(a,b));/*輸出大數(shù)*/m=max(a,max(b,c));/*三數(shù)比大小*/
C語言程序設(shè)計(jì)
第七章函數(shù)<>對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):如果被調(diào)函數(shù)定義在主調(diào)函數(shù)之后,那么在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作聲明。
C語言程序設(shè)計(jì)
第七章函數(shù)22函數(shù)聲明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);
或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)函數(shù)定義與函數(shù)聲明不同,函數(shù)聲明只是對(duì)編譯系統(tǒng)的一個(gè)說明,通知系統(tǒng)在本函數(shù)中所調(diào)用的函數(shù)是什么類型,函數(shù)聲明是一個(gè)說明語句,必須以分號(hào)結(jié)束!聲明可以不寫形參名,只寫形參類型。函數(shù)聲明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)聲明是不開辟內(nèi)存的,僅僅告訴編譯器,要聲明的部分存在,要預(yù)留一點(diǎn)空間。定義則需要開辟內(nèi)存。<>
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>voidmain(){floatadd(floatx,floaty);/*對(duì)被調(diào)用函數(shù)的聲明*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體
z=x+y;return(z);}floatadd(float,float);例7.5對(duì)被調(diào)用的函數(shù)作聲明輸入:3.6,6.5輸出:sumis10.10000024<>說明:被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之后,則必須在主調(diào)函數(shù)里面,對(duì)被調(diào)函數(shù)進(jìn)行聲明。需要說明的是,如果在TC編譯環(huán)境里面,當(dāng)被調(diào)函數(shù)是有返回值,且返回值的數(shù)據(jù)類型是整型或字符型,可以不對(duì)被調(diào)函數(shù)加以聲明。被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之前,可以不加函數(shù)聲明。在所有函數(shù)定義前,已在函數(shù)外部做了函數(shù)聲明,則在各主調(diào)函數(shù)中可以不加函數(shù)聲明。
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>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ù)聲明voidmain(){floata,b;intmax(floatx,floaty);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);}在調(diào)用函數(shù)里面聲明charletter(char,char);floatf(float,float);intI(float,float);main(){……}charletter(charc1,charc2){……}floatf(floatx,floaty){……}IntI(floatj,floatk){……}在函數(shù)外面做函數(shù)聲明<>
C語言程序設(shè)計(jì)
第七章函數(shù)main()調(diào)fun()結(jié)束fun()返回①②④⑥⑦保存:返回地址當(dāng)前現(xiàn)場③恢復(fù):主調(diào)程序現(xiàn)場返回地址⑤函數(shù)調(diào)用的執(zhí)行過程<>7.5
函數(shù)的嵌套調(diào)用
C語言程序設(shè)計(jì)
第七章函數(shù)
不允許嵌套定義,函數(shù)間的關(guān)系是平行的、獨(dú)立的。C中的函數(shù):
允許嵌套調(diào)用,即在調(diào)用某函數(shù)過程中又調(diào)用另一函數(shù)。main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b27<>
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>intfun1(intx,inty);voidmain(void){inta,b;scanf(“%d%d”,&a,&b);printf(“Theresultis:%d\n”,fun1(a,b));}intfun1(intx,inty){intfun2(intm);return(fun2(x)+fun2(y));}intfun2(intm){return(m*m);}例輸入兩個(gè)整數(shù),求平方和輸入:34輸出:Theresultis:25<>
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>
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);}例求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值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ù)skip<>7.6
函數(shù)的遞歸調(diào)用遞歸:在函數(shù)調(diào)用過程中,直接或間接的調(diào)用自身。遞歸調(diào)用方式直接遞歸調(diào)用:在函數(shù)體內(nèi)又調(diào)用自身
C語言程序設(shè)計(jì)
第七章函數(shù)f()調(diào)fintf(intx){inty,z;……
z=f(y);…….return(2*z);}30<>間接遞歸調(diào)用:當(dāng)函數(shù)1去調(diào)用另一函數(shù)2時(shí),而另一函數(shù)2反過來又調(diào)用函數(shù)1自身。
C語言程序設(shè)計(jì)
第七章函數(shù)調(diào)f2調(diào)f1f1()f2()intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}解決無終止遞歸調(diào)用的方法是:確定好結(jié)束遞歸的條件。
條件成立,進(jìn)行遞歸用if語句控制條件不成立,結(jié)束遞歸<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.7有5個(gè)人,第5個(gè)人比第4個(gè)人大2歲,第4個(gè)人比第3個(gè)人大2歲,……第2個(gè)人比第1個(gè)人大2歲,第1個(gè)人10歲,問第5個(gè)人多大?age(5)age(4)age(3)age(2)age(1)=2+age(4)=2+age(3)=2+age(2)=2+age(1)=10=18=16=14=1210n=1數(shù)學(xué)模型:age(n)=age(n-1)+2n>1age(intn){intc;if(n==1)c=10;elsec=2+age(n-1);return(c);}#include<stdio.h>voidmain()
{printf(“%d\n”,age(5));}運(yùn)行結(jié)果:18回推遞推<>有些問題,可以用遞推,也可以用遞歸的方法解決。遞推:從一個(gè)已知的事實(shí)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí),再從已知的新的事實(shí),推出下一個(gè)新的事實(shí).
C語言程序設(shè)計(jì)
第七章函數(shù)例用遞推法求n!,即從1開始,乘2,乘3....一直到n#include<stdio.h>voidmain(){inti,s=1;for(i=1;i<=5;i++)s=s*i;printf(“s=%d\n”,s);}運(yùn)行結(jié)果:s=12033<>遞歸:在函數(shù)調(diào)用自身時(shí),要給出結(jié)束遞歸的條件。先回推再遞推如:n!,
5!=5×4!4!=4×3!3!=3×2!2!=2×1!1!=10!=1
C語言程序設(shè)計(jì)
第七章函數(shù)1(n=0,1)n!=n*(n-1)!(n>1)#include<stdio.h>voidmain(){floatfac(intn);intn;floaty;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}floatfac(intn){floatf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}運(yùn)行:inputaintegernumber:1010!=3628800例7.8
用遞歸方法求n!<>十九世紀(jì)未,歐洲珍奇商店出現(xiàn)一種漢諾塔游戲,推銷材料介紹說:古代印度布拉瑪廟里的僧侶們正在玩這種游戲,如果游戲結(jié)束,世界未日即來臨。是一個(gè)只能用遞歸方法解決的問題。規(guī)則及分析:
n個(gè)盤子從一根桿移到另一根針,每次只能移動(dòng)一個(gè)盤子,不允許大盤在小盤上面。共有三根桿,n個(gè)盤子由A移到C,需移動(dòng)的次數(shù)是2n-1,若64個(gè)盤子移動(dòng)的次數(shù)為:264-1=18,446,744,073,709,551,600一年的秒數(shù)是:365x24x60x60=3153600018446744073709511600÷31536000=58494217355年即:5849億年,從能源角度推算,太陽系壽命只有150億年
C語言程序設(shè)計(jì)
第七章函數(shù)例7.9Hanoi(漢諾)塔問題BCA<>方法與步驟將A上n-1個(gè)盤子借助C移到B。把A上剩下一個(gè)盤子送到C將n-1個(gè)盤子從B借助A移到C
C語言程序設(shè)計(jì)
第七章函數(shù)BCA簡化實(shí)例:將A上3個(gè)盤子移到C步驟:1.A上兩個(gè)盤子借助C移到B2.A上最后一個(gè)盤子移到C(可直接完成)
3.B上兩個(gè)盤子借助A移到C第一步進(jìn)一步分解:
1.1A上一個(gè)盤子(紅色)從AC1.2A上一個(gè)盤子(藍(lán)色)從AB1.3C上一個(gè)盤子(紅色)從CB第三步進(jìn)一步分解:
3.1B上一個(gè)盤子(紅色)從BA3.2B上一個(gè)盤子(藍(lán)色)從BC3.3A上一個(gè)盤子(紅色)從AC共移動(dòng)7步:23-1次所以,n個(gè)盤要移動(dòng)2n-1次36<>結(jié)論:上面三個(gè)步驟包含兩類操作步驟1和3都是將n-1個(gè)盤子從一個(gè)桿移到另一個(gè)桿上(n>1時(shí)),這是一個(gè)遞歸的過程;方法一樣,只是針的名稱不同而已,為使問題一般化,將步驟1和3表示為:將one桿上的n-1個(gè)盤子移到two桿,借助three桿,只是對(duì)應(yīng)關(guān)系不同。第一步對(duì)應(yīng)關(guān)系:oneAtwoBthreeC第三步對(duì)應(yīng)關(guān)系:oneBtwoCthreeA將1個(gè)盤子從一個(gè)針上移到另一針上。因此,可以用兩個(gè)函數(shù)分別實(shí)現(xiàn)上面兩類操作,用hanoi函數(shù)實(shí)現(xiàn)第一類操作,用move函數(shù)實(shí)現(xiàn)第二類操作。hanoi(n,one,two,three)將n個(gè)盤從one→three借助twomove(x,y)將1個(gè)盤從x→y座,x、y根據(jù)情況取代ABC座中的1個(gè)。
C語言程序設(shè)計(jì)
第七章函數(shù)37<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.9
用遞歸方法解決Hanoi(漢諾)塔問題的程序#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf("Inputthenumberofdiskes:");scanf("%d",&m);printf("Thesteptomoving%3ddiskes:\n",m);hanoi(m,'A','B','C');}voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)move(one,three);else{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}}voidmove(charx,chary){printf("%c--->%c\n",x,y);}運(yùn)行:inputnumberofdiskes:3thesteptomoving3diskes:ACABCBACBABCAC38<>7.7
數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參——值傳遞
C語言程序設(shè)計(jì)
第七章函數(shù)例8.10
兩個(gè)數(shù)組比較大小a和b為有10個(gè)元素的整型數(shù)組比較兩數(shù)組對(duì)應(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==b432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=239<>
C語言程序設(shè)計(jì)
第七章函數(shù)#include<stdio.h>voidmain(){intlarge(intx,inty)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("\n");printf("Enterarrayb:\n");for(i=0;i<10;i++)scanf("%d",&b[i]);printf("\n");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;}
printf(“a[i]>b[i]%dtimes\n”,n);printf(“a[i]=b[i]%dtimes\n”,m);printf(“a[i]<b[i]%dtimes\n”,k);if(n>k)printf(“arrayaislargerthanarrayb\n”);elseif(n<k)printf(“arrayaissmallerthanarrayb\n”);elseprintf(“arrayaisequaltoarrayb\n”);}large(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}運(yùn)行:enterarraya:1357986420enterarrayb:389-1-35604a[i]>b[i]4timea[i]=b[i]1timea[i]<b[i]5timearrayaislargethenarrayb<>數(shù)組名可作函數(shù)參數(shù)實(shí)參和形參都用數(shù)組名
C語言程序設(shè)計(jì)
第七章函數(shù)例7.11
求學(xué)生的平均成績floataverage(float
array[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;return(aver);}#include<stdio.h>voidmain(){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);}實(shí)參用數(shù)組名形參用數(shù)組定義floatarray[]..2109score562312….….88array<>幾點(diǎn)說明:
C語言程序設(shè)計(jì)
第七章函數(shù)地址傳遞調(diào)用函數(shù)時(shí),對(duì)形參數(shù)組元素的操作,實(shí)際上也是對(duì)實(shí)參數(shù)組元素的操作。在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致如:array是形參數(shù)組名,score是實(shí)參數(shù)組名。形參數(shù)組大小(多維數(shù)組第一維)可不指定在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)空的方括弧C編譯對(duì)形參數(shù)組大小不檢查,即使定義了也不起作用。形參數(shù)組名是地址變量
調(diào)用時(shí),只是將實(shí)參數(shù)組的首地址傳給形參數(shù)組,因此score[n]和array[n]指的是同一單元43<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.12
求兩組學(xué)生的平均成績,形參數(shù)組長度缺省
#include<stdio.h>voidmain(){floataverage(floatarray[],intn);floatscore_1[5]={98.5,97,91.5,60,55};floatscore_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf(“TheaverageofclaseAis%6.2f\n”,average(score_1,5));printf(“TheaverageofclaseBis%6.2f\n”,average(score_2,10));}floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++)sum=sum+array[i];aver=sum/n;return(aver);}運(yùn)行:TheaverageofclassAis80.40TheaverageofclassBis78.20另設(shè)一個(gè)參數(shù),傳遞需要處理的數(shù)組元素個(gè)數(shù)<>數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參和形參兩個(gè)數(shù)組共占同一段內(nèi)存單元,形參數(shù)組的元素值改變會(huì)使實(shí)參數(shù)組元素的值同時(shí)變化。
C語言程序設(shè)計(jì)
第七章函數(shù)<>用多維數(shù)組名作函數(shù)參數(shù)可以用多維數(shù)組名作實(shí)參和形參形參數(shù)組定義時(shí),只能省略第一維的大小說明。C編譯不檢查第一維的大小,而且數(shù)組名作函數(shù)參數(shù)是地址傳送,所以形參數(shù)組第一維大小任意,可以和實(shí)參數(shù)組的維數(shù)不同。如,實(shí)參數(shù)組定義:intscore[5][10],則形參數(shù)組可以定義:intarray[3][10]或intarray[8][10]合法的定義:intarray[3][10];或intarray[][10]錯(cuò)誤的定義:intarray[][];intarray[3][];
C語言程序設(shè)計(jì)
第七章函數(shù)50<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.14
求3×4矩陣中各元素的最大值#include<stdio.h>voidmain(){intmax_value(intarray[][4]);inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}intmax_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);}多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同intarray[][4]<>
C語言程序設(shè)計(jì)
第七章函數(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];}}main(){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_rowxresult181252<>7.8
局部變量和全局變量變量按其作用域,可分為局部變量和全局變量。局部變量——內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句{}中有效的變量局部變量可用存儲(chǔ)類型:自動(dòng)型(auto),寄存器型(register),靜態(tài)型(static)
,默認(rèn)為auto
C語言程序設(shè)計(jì)
第七章函數(shù)<>
C語言程序設(shè)計(jì)
第七章函數(shù)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);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4<>
C語言程序設(shè)計(jì)
第七章函數(shù)運(yùn)行結(jié)果:54321例復(fù)合語句中變量#defineN5voidmain(){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]);}main(){inta,b;┇{intc;c=a+b;┇}┇}a,b范圍c范圍在函數(shù)內(nèi)部,還可以在復(fù)合語句(花括號(hào)括起的一組語句)內(nèi)定義變量,這些變量只在該復(fù)合語句內(nèi)起作用。<>全局變量——外部變量定義:在函數(shù)外定義,可為本文件所有函數(shù)共用,也叫外部變量。有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有外部型(extern)說明的其它源文件幾點(diǎn)說明:全局變量的使用,增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道,同一文件中的所有函數(shù)都能引用全局變量的值,當(dāng)某函數(shù)改變了全局變量的值時(shí),便會(huì)影響其它的函數(shù)。
C語言程序設(shè)計(jì)
第七章函數(shù)習(xí)慣上,全局變量名的第一個(gè)字母用大寫。使用全局變量可以減少函數(shù)的實(shí)參和形參個(gè)數(shù)。不必要時(shí)不要使用全局變量全局變量在程序執(zhí)行的全過程都占用存儲(chǔ)單元。不利于程序的移植。程序的可讀性變差。全局與局部變量重名時(shí),在函數(shù)內(nèi)部將屏蔽全局變量。<>
C語言程序設(shè)計(jì)
第七章函數(shù)intp=1,q=5;floatf1(a)inta;{intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍<>
C語言程序設(shè)計(jì)
第七章函數(shù)例全局變量的作用域及其使用情況inta=1;f1(){intb;b=a+3;printf(“f1:a=%d,b=%d\n”,a,b);}f2(){inta,b;a=5;b=a+3;printf(“f2:a=%d,b=%d\n”,a,b);}f3(){intb;a=6;b=a+3;printf(“f3:a=%d,b=%d\n”,a,b);}voidmain(){intb=3;printf(“1.main:a=%d,b=%d\n”,a,b);f1();printf(“2.main:a=%d,b=%d\n”,a,b);f2();printf(“3.main:a=%d,b=%d\n”,a,b);f3();printf(“4.main:a=%d,b=%d\n”,a,b);}運(yùn)行:1.main:a=1,b=3f1:a=1,b=42.main:a=1,b=3f2:a=5,b=83.main:a=1,b=3f3:a=6,b=94.main:a=6,b=3全局變量增加了函數(shù)間傳送數(shù)據(jù)的聯(lián)系局部變量和全局變量同名,局部變量作用域中外部變量被屏蔽局部變量外部變量<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.15外部變量與局部變量同名#include<stdio.h>inta=3,b=5;voidmain(){intmax(inta,intb);
inta=8;printf("max=%d",max(a,b));}intmax(inta,intb){intc;c=a>b?a:b;return(c);}運(yùn)行結(jié)果:max=8例外部變量副作用inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}運(yùn)行結(jié)果:*****原意輸出5行*號(hào),使用外部變量i后只輸出一行*號(hào)。局部變量a=8將外部變量a=3屏蔽<>7.9
變量的存儲(chǔ)類別動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式變量分類:按數(shù)據(jù)類型:整型、實(shí)型、字符型按作用域:全局變量、局部變量存儲(chǔ)方式:靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定的存儲(chǔ)空間。動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間。
C語言程序設(shè)計(jì)
第七章函數(shù)內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量(static)形參變量局部動(dòng)態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等生存期:靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束,即一旦分配了內(nèi)存空間就不釋放,直到程序運(yùn)行結(jié)束。動(dòng)態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束<>auto變量函數(shù)內(nèi)部無static聲明的局部變量均為動(dòng)態(tài)存儲(chǔ)類別,被分配在動(dòng)態(tài)區(qū)。存儲(chǔ)類別為自動(dòng)時(shí),聲明符auto可省;自動(dòng)變量被分配在動(dòng)態(tài)區(qū),未賦初值時(shí),其值未定義,每次調(diào)用重新賦值。
C語言程序設(shè)計(jì)
第七章函數(shù)例如:intf(inta)/*定義f函數(shù),a為形參*/{autointb,c=3;/*定義b、c為自動(dòng)變量*/…}又如:autointb,c=3;intb,c=3;/*兩者等價(jià)*/<>
C語言程序設(shè)計(jì)
第七章函數(shù)例auto變量的作用域main(){intx=1;voidprt(void);
{
intx=3;prt();printf(“2ndx=%d\n”,x);
}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}運(yùn)行結(jié)果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域auto型變量只在調(diào)用函數(shù)時(shí)才由系統(tǒng)分配內(nèi)存單元(出生),函數(shù)調(diào)用返回后內(nèi)存單元被系統(tǒng)收回(死亡)。<>用static聲明局部變量若希望函數(shù)調(diào)用結(jié)束后,局部變量的值保留,則指定該變量為靜態(tài)局部變量,用static對(duì)變量加以聲明。
C語言程序設(shè)計(jì)
第七章函數(shù)例局部靜態(tài)變量值具有可繼承性main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}運(yùn)行結(jié)果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運(yùn)行結(jié)果:123<>
C語言程序設(shè)計(jì)
第七章函數(shù)例7.17考察靜態(tài)局部變量的值#include<stdio.h>voidmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}intf(inta){autob=0;staticc=3;b=b+1;c=c+1;return(a+b+c);}main()iaf(a)02f(2)12f(2)22f(2)f(a)abcreturn(a+b+c)20314return(7)20415return(8)20516return(9)運(yùn)行結(jié)果:789對(duì)靜態(tài)局部變量的說明:⑴分配在靜態(tài)區(qū),程序運(yùn)行結(jié)束釋放存儲(chǔ)單元。⑵賦初值一次未賦初值時(shí)為0,前次結(jié)果保留。
⑶局部動(dòng)態(tài)變量若未賦初值,其值不確定,局部靜態(tài)變量未賦初值,其值為0或‘\0’(字符變量)。⑷靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后雖存在,但其它函數(shù)不能引用它。<>使用局部靜態(tài)變量的場合(1)需要保留上一次調(diào)用結(jié)束時(shí)的值
C語言程序設(shè)計(jì)
第七章函數(shù)例7.18打印1到5的階乘值#include<stdio.h>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);}main()ifac(i)1fac(1)2fac(2)3fac(3)4fac(4)5fac(5)fac(n)輸出結(jié)果
nf=f*nf=11f=1*11!=12f=1*2=22!=23f=2*3=63!=64f=6*4=244!=245f=24*5=245!=120(2)初始化后變量只被引用而不改變其值,則用靜態(tài)局部變量較方便,以免每次調(diào)用時(shí)重新賦值,但會(huì)一直占用內(nèi)存浪費(fèi)系統(tǒng)資源。<>register(寄存器型)變量
CPU內(nèi)有寄存器可用來存放數(shù)據(jù),若把數(shù)據(jù)聲明為寄存器類型,則將該類型的數(shù)據(jù)存放在寄存器中,其優(yōu)點(diǎn)是:減少數(shù)據(jù)與內(nèi)存之間的交換頻率,提高程序的效率和速度。
C語言程序設(shè)計(jì)
第七章函數(shù)CPU寄存器組內(nèi)存例7.19使用寄存器變量#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){registerlong
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Pyridyl-disulfide-Dexamethasone-生命科學(xué)試劑-MCE-7118
- 2025年度生姜種植與鄉(xiāng)村旅游融合發(fā)展合作協(xié)議
- 二零二五年度解除勞動(dòng)合同經(jīng)濟(jì)補(bǔ)償標(biāo)準(zhǔn)與法律依據(jù)合同
- 二零二五年度小微企業(yè)貸款服務(wù)合同
- 2025年度門頭制作施工與綠色建筑認(rèn)證服務(wù)合同
- 2025年度幼兒園品牌授權(quán)與技術(shù)轉(zhuǎn)讓合作協(xié)議
- 二零二五年度質(zhì)押式回購證券化合同模板
- 二零二五年度勞動(dòng)合同終止證明及競業(yè)禁止合同
- 老年人長期護(hù)理保險(xiǎn)中對(duì)于慢病包括慢腎病的分層次管理體系探索與實(shí)踐
- 中小企業(yè)勞動(dòng)合同標(biāo)準(zhǔn)格式參考
- 自動(dòng)扶梯安裝過程記錄
- MOOC 材料科學(xué)基礎(chǔ)-西安交通大學(xué) 中國大學(xué)慕課答案
- 中國城市居民的健康意識(shí)和生活方式調(diào)研分析報(bào)告
- 復(fù)產(chǎn)復(fù)工試題含答案
- 售后服務(wù)經(jīng)理的競聘演講
- 慢加急性肝衰竭護(hù)理查房課件
- 文件丟失應(yīng)急預(yù)案
- 全球職等系統(tǒng)GGS職位評(píng)估手冊(cè)
- 專項(xiàng)法律意見書(私募基金管理人重大事項(xiàng)變更)-詳細(xì)版
- 深圳市社會(huì)保險(xiǎn)參保證明
- 2023年國家護(hù)理質(zhì)量數(shù)據(jù)平臺(tái)
評(píng)論
0/150
提交評(píng)論