




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機軟件基礎第一篇C語言程序設計基礎第四章函數一、函數的概念1.函數:是一個能獨立完成一定功能的程序段。2.函數的種類:庫函數和用戶自定義函數。庫函數名類型函數#include<stdio.h>輸入、輸出類getchar(),putchar();scanf(),printf();
gets(),puts()等函數。#include<string.h>字符串處理類strlen(),strcat(),strcmp(),strcpy()等函數。#include<math.h>數學類fabs(),sqrt(),sin(),cos()等函數。一、函數的概念例4-1求s=2!+3!+7!main(){inti,p,q,r,s;p=1;for(i=1;i<=2;i++)p=p*i;q=1;for(i=1;i<=3;i++)q=q*i;r=1;for(i=1;i<=7;i++)r=r*i;s=p+q+r;printf("s=%d\n",s);}一、函數的概念例4-1
求s=2!+3!+7!intf1(intn)
/*fl函數的首部*/{intx=1,i;
/*函數體中的說明部分*/for(i=1;i<=n;i++)
/*以下為函數體的語句部*/x=x*i;return(x);
/*返回計算結果x的值*/}main()
/*程序由此開始*/{ints;
/*函體中變量定義*/s=f1(2)+f1(3)+f1(7);
/*調用fl函數,計算2!+3!+7!的值*/printf("2!+3!+7!=%d\n",s);
/*輸出結果*/}
/*程序到此結束*/一、函數的概念3.函數的定義:由函數首部和函數體兩部分組成。函數定義一般形式:函數類型函數名(形式參數表列){說明部分;語句部分;}注意:函數體中說明部分包括:(1)函數體中所用量的說明;(2)對將要調用函數的說明。一、函數的概念函數定義說明:(1)函數類型是函數執行完后返回值的類型;(2)函數名是由用戶自己命名的標識符;(3)形式參數類似于數學函數中的自變量;(4)定義形參的兩種方法:a.在形參表列中逐個指明形參的類型,形式為:(類型1形參1,類型2形參2,…)如:intsum(floatx,floaty,floatz)b.在括號內只寫形參名,在括號外單獨定義其類型,如:intsum(x,y,z)floatx,y;intz;二、C程序的結構1.C程序結構:(1)一個C程序必須有而且只能有1個主函數;(2)C程序的執行總是從主函數開始到主函數結束;(3)函數定義不能嵌套;(4)函數調用可以嵌套,但只能是主函數調用子函數,子函數不能調用主函數。二、C程序的結構2.書寫順序:若A函數調用B函數,則其書寫順序要求:(1)一般情況下,B函數寫在A函數的前面;(2)B函數的類型為int或char時,B可以放在A后面;(3)如果B函數的類型不為int或char,但又想將B放在A后邊,則必須在A函數體的說明部分對B函數進行聲明,聲明形式為:函數B的類型B函數名(類型1形參1,類型2形參2)或函數B的類型B函數名(類型1,類型2)注意:對調用的函數聲明時,其形參名可以和定義時的形參名不同。(1)floatfa(intx,inty){……}main(){……fa(1,3);……}
(2)main(){floatfa(intx,inty);……fa(1,3);……}
floatfa(intx,inty){……}(3)main(){floatfa(int,int);……fa(1,3);……}
floatfa(intx,inty){……}(4)main(){……fa(1,3);……}
intfa(intx,inty){……}三、函數的參數和返回值1.函數的參數——定義定義示例形參:在函數定義的首部出現的參數,稱為形參。main(){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;renturn(z);}
實參:在調用函數時使用的參數,稱為實參。形參實參一、函數的概念例4-2求兩整數之和的程序如下:intsum(intx,inty)
/*定義含兩個形參的sum函數*/{intz;
/*函數體中z變量定義*/z=x+y;return(z);
/*返回兩整數之和*/}main()
/*程序由此開始*/{inta,b,c;scanf("%d,%d",&a,&b);/*輸入a、b兩變量的值*/c=sum(a,b);
/*調用函數sum,其中a、b為實參*/printf("sum=%d\n",c);
/*輸出sum函數調用結果*/}
/*程序到此結束*/三、函數的參數和返回值1.函數的參數——形參與實參之間的關系相同點不同點個數相等實參必須有確定的數值順序一致形參必須指定類型類型相符注意:如果形參與實參的類型不一致,則在調用函數時,則自動按形參類型轉換。形參在函數被調用之前不占內參;函數調用時為形參分配內存;調用結束時,所分配的內存自動釋放。三、函數的參數和返回值2.函數的返回值沒有返回值的函數有返回值的函數
若函數中,renturn語句后面無表達式,這時函數沒有返回值。
沒有返回值的函數,其定義類型為空類型,用類型名void表示。若函數中,return語句后面有表達式,則該函數一定有返回值。return后面表達式值的類型以所在函數的類型為準。當函數類型為int時,函數類型名int可以不寫,系統默認為int。四、函數的調用1.函數調用的兩種情況沒有返回值的調用有返回值的調用調用格式函數名(實參表列);函數名(實參表列);說明(1)這種調用是語句的調用,沒有返回值;(2)被調函數執行完后,返回帶主調函數中調用語句的下一條語句繼續執行。(1)這種調用為表達式調用,只能出現在表達式所能出現的地方;(2)被調函數中一定有“return表達式;”語句,被調函數調用完后執行renturn語句,將表達式的值返回到調用表達式處參加運算;四、函數的調用例4-3下面是求兩個數最大值的程序。main()/*程序由此開始*/{voidmax(int,int);/*對被調空類型函數max的聲明*/inta,b;scanf("%d,%d",&a,&b);max(a,b);/*用語句調用max函數*/}/*程序到此結束*/voidmax(intx,inty)/*被調函數是空類型,無返回值*/{intz;z=x>y?x:y;printf("max=%d\n",z);}/*返回主調函數main中調用語句"max(a,b);"的下一句*/四、函數的調用例4-4將例4-3求兩數最大值改為表達式調用。main(){inta,b;scanf("%d,%d",&a,&b);printf("max=%d\n",max(a,b));/*輸出max調用結果,"max(a,b)"是調用表達式*/}intmax(intx,inty)/*max為整型函數*/{intz;z=x>y?x:y;returnz;}四、函數的調用2.函數調用時的數據傳遞之一:單向值傳遞方式定義:調用函數時,將實參計算出來,賦給形參,即:數據只能從實參單向傳遞給形參。特點:(2)函數中對形參的操作不會影響到主調用函數中的實參;(3)單向傳遞時,實參可以是常數,已有值的變量或表達式。而形參一般是變量。(1)函數調用時,為形參臨時分配一個存儲空間,而且調用結束后,將所分配的臨時存儲空間收回;四、函數的調用例4-5分析程序,寫出運算結果。main(){voidf2(int,int);/*對將要調用的空類型函數f2的聲明*/inta=2,b=8;f2(a,b);/*用語句調用f2函數*/printf("a=%d,b=%d\n",a,b);/*語句調用完后返回到該語句*/}voidf2(x,y)/*f2函數為空類型*/intx,y;/*形參類型說明*/{intm;m=x;x=y;y=m;/*x,y兩變量交換值*/printf("x=%d,y=%d\n",x,y);return;}四、函數的調用2.函數調用時的數據傳遞之二:地址傳遞方式定義:調用函數時,傳遞的相應參數是一個地址,即變量的存儲地址,對這個地址內的數據進行訪問或修改會影響到實參。特點:(1)函數調用時,不會為形參分配存儲空間;(2)形參所指向的是存放實參的存儲地址;(3)對形參的修改,相當于在對實參進行修改。四、函數的調用例4-6編寫將數組a中最大數和最小數對調的程序#defineM6/*程序中凡是出現M的地方,均用6替換*/main()/*程序由此開始*/{voidf3(intx[]);/*對將要調用的空類型函數f3聲明*/inta[M],i;for(i=0;i<M;i++)scanf("%d",&a[i]);/*輸入a數組各元素值*/f3(a);/*語句調用,f3函數調用完后返回到下一句*/for(i=0;i<M;i++)printf("%4d",a[i]);/*輸出對調后的a數組值*/printf("\n");}/*程序到此結束*/四、函數的調用voidf3(intx[]){intmax,maxi,min,mini,i,w;max=min=x[0];maxi=mini=0;for(i=1;i<M;i++){if(x[i]>max)/*求最大值max及它的序號maxi*/{max=x[i];maxi=i;}if(x[i]<min)/*求最小值min及它的序號mini*/{min=x[i];mini=i;}}w=x[maxi];x[maxi]=x[mini];/*最大值,最小值交換位置*/x[mini]=w;}/*返回到main主調函數中"f3(a);"語句的下一句*/四、函數的調用例4-7把A[n][n]二維數組對角線元素置l,并求其余元素之和,要求用函數完成。四、函數的調用main()/*程序由此開始*/{inta[4][4],i,j,s;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*輸入數組各元素值*/s=f4(a);/*s中存放除對角線元素外其余元素之和*/for(i=0;i<4;i++){for(j=0;j<4;j++)printf("%4d",a[i][j]);/*輸出對角線元素置1后的數組*/printf("\n");}四、函數的調用intf4(intx[][4]){intsum=0,i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j||i+j==3)/*對角線元素包含主對角及副對角元素*/x[i][j]=1;/*置l*/elsesum=sum+x[i][j];/*其余元素求和*/return(sum);/*返回給主調函數中S變量*/}四、函數的調用3.函數調用時的數據傳遞之三:返回值傳遞方式定義:使用“return表達式;”語句,將值回傳到主調函數。特點:(1)使用“return表達式;”語句,來回傳值;(2)使用“返回值類型函數名(參數列表)”形式,來定義函數。五、局部變量和全局變量局部變量全局變量概念在函數內部定義的變量在函數外部定義的變量作用域所在的函數整個程序說明不同函數中可以使用相同的變量名,但它們是不同的量,相互不干擾。(1)全局變量在程序執行過程中,一直占用存儲空間,降低了空間利用率;(2)全局變量牽制了各個函數,降低了各函數之間的相對對立性;(3)各函數執行時,都可能改變全局變量的值,程序容易出錯。四、函數的調用例4-8intf5(inta,intb)/*函數f5*/{a=a+b;b=a+b;printf("al=%d,bl=%d\n",a,b);}main()/*程序由此開始*/{inta=5,b=8;f5(a,b);printf("a2=%d,b2=%d\n",a,b);}/*程序到此結束*/四、函數的調用例4-9main(){inta=1,b=2,c=3;a++;c+=b;{intb=4,c;c=2*b;a+=c;printf("al=%d,bl=%d,cl=%d\n",a,b,c);}printf("a2=%d,b2=%d,c2=%d\n",a,b,c);}四、函數的調用例4-10輸出l~4的階乘值intf7(intn)/*函數f7*/{inti,s=1;for(i=1;i<=n;i++)s=s*i;returns;}main()/*主函數*/{inti;for(i=1;i<=4;i++)printf("%1d!=%d\n",i,f7(i));}
四、函數的調用例4-11編寫求N個數的最大數、最小數及N個數的平均值的程序。要求主函數中輸入這N個數,輸出上述三個結果,f81函數中求最大值、最小值,f82函數中求平均值。#defineN5floatmax,min;/*定義max,min為全局變量*/voidf81(floatx[],intn){inti; for(i=0;i<=n;i++){if(x[i]>max)max=x[i];if(x[i]<min)min=x[i];}}floatf82(floatx[],intn){floats=0.0;inti;for(i=0;i<=n;i++)s=s+x[i];s=s/(n+1);returns;}main()/*程序由此開始*/{floata[N],ave;inti;for(i=0;i<=N;i++)scanf("%f",&a[i]);max=min=a[0];f81(a,N);ave=f82(a,N);printf("max=%f,min=%f,ave=%f\n",max,min,ave);}四、函數的調用例4-12intx=3,y=8;/*定義x,y為全局變量*/f9(intx,inty)/*形參x、y為局部變量,僅在f9函數中有效*/{intm;m=x+y;/*m、x、y有效范圍*/return(m);}main(){inty=10;/*局部變量y僅在主函數中有效*/printf("%d\n",f9(x,y));/*全局變量x=3僅在主函數中有效*/}無分號六、用static聲明的局部變量autoregisterstatic類型自動型寄存器型靜態型存儲區內存的堆棧區CPU的寄存器區內存的數據區特點在調用函數時,分配一個臨時的存儲空間,而且調用結束時將所分配的臨時存儲空間收回;如果不賦初值,則其中是一個不確定的值。訪問效率高;調用函數結束時,所占用的寄存器被回收。函數調用結束時,所占用的存儲區不會被回收,即變量的值不會因為函數調用結束而消失。四、函數的調用例4-13計算并輸出1~4的階乘main(){inti;for(i=1;i<=4;i++)printf("%1d!=%d\n",i,fl0(i));}intfl0(intn){staticintf=1;f=f*n;return(f);}四、函數的調用例4-14main(){intk=4,m=1,p;p=f11(k,m);printf("%d,",p);p=f11(k,m);printf("%d",p);}
f11(a,b)inta,b;{staticintm,i=2;i*=m+2;m=i+a+b;return(m);}七、函數的遞歸調用程序設計中常常要用到遞歸的方法,遞歸過程結構清晰,思路明了,程序易讀。如果在一個函數的定義中又引用了自身,那么這個函數稱為是遞歸定義的。例如自然數的集合可遞歸定義為:
1)1是自然數。
2)一個自然數的后繼仍為一個自然數。又比如n!的遞歸定義為:七、函數的遞歸調用
例4-15采用歸遞方法,編程將一個正整數逆序輸出。例如,若輸入1234,則輸出4321。voidf12(intn){if(n<10)printf("%1d",n);/*余下1位數輸出,函數執行完畢*/else{printf("%ld",n%10);/*輸出右邊的數*/f12(n/10);}/*去掉右邊數后余下的數,直接調用本函數fl2*/}/*返回*/main()/*主程序開始*/{intn;scanf("%d",&n);/*輸入整數*/f12(n);/*調用f12函數*/}七、函數的遞歸調用例4-16編寫求n!的遞歸程序。七、函數的遞歸調用floatf13(intn){if(n==0||n==1)return(1.0);elsereturn(n*f13(n-1));}main(){intn;
floatw;scanf("%d",&n);w=f13(n);printf("%d!=%f\n",n,w);}七、函數的遞歸調用例4-17用梯形法計算七、函數的遞歸調用七、函數的遞歸調用例4-17用梯形法計算floatf14(floatx){floaty;y=2.0*x*x+3.0*x+1.0;return(y);}main(){floata,b,h,w,s=0.0,y1,y2;inti,n;
scanf("%d,%f,%f",&n,&a,&b);
/*輸入等分數n,積分區間下上限a,b*/
h=(b-a)/n;
/*梯形的高*/
y1=f14(a);
/*第一個梯形的上底*/
for(i=1;i<=n;i++)
{y2=f14(a+i*h);
/*第i個梯形的下底*/
w=(y1+y2)*h/2.0;/*第i個梯形的面積*/
s=s+w;
/*梯形面積累加*/
y1=y2;/*第i個梯形的下底為第i+1個梯形的上底*/}
printf("s=%f\n",s);}七、函數的遞歸調用例4-18輸入三個整數分別賦予變量a、b、c。判斷它們是否能成為三角形的三邊,若可以,則計算其面積并輸出結果。要求輸入數據的合理性及求面積均使用函數。#include<math.h>
/*程序中用到了數學系統函數*/inta,b,c,w;
/*a、b、c、w為全局變量*/floats;
/*面積S為全局變量*/main(){
intenter();
/*合理性判斷函數的聲明*/
floatarea(int,int,int);/*計算面積函數的聲明*/
w=enter();
/*調用合理性判斷函數*/
if(w)
/*若a、b、e為三角形三邊*/
{
s=area(a,b,c);/*調用計算面積函數*/
printf("s=%f\n",s);}
else/*若a、b、c不為三角形三邊*/
printf("Badinput!\n");}
七、函數的遞歸調用intenter()
/*合理性判斷函數*/{scanf("%d,%d,%d",&a,&b,&c);/*輸入a、b、c值*/if(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b)return(1);
/*可以構成三角形三邊*/elsereturn(0);
/*不可以構成三角形三邊*/}floatarea(inta,intb,intc)
/*計算面積函數*/{
floatL,s;
L=(a+b+c)/2.0;
/*計算半周長*/
s=sqrt(L*(L-a)*(L-b)*(L-c));
/*求面積*/
return(s);}歷年真題演練1.(2010.4單選)執行下列C程序,輸出結果是()intt=1;voidsum(intp){intt=10; t+=p++; printf("%d",t);}main(){intm=5; sum(m); t+=m++; printf(",%d\n",t);}A15,6B16,6C17,6D17,7歷年真題演練2.(2010.4填空)用數組元素作為實參,則實參向形參傳遞的是。3.(2010.4程序設計)編寫C語言函數f(floatx),并用主函數調用該函數,輸出計算結果。歷年真題演練
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學年安徽省淮南市大通區數學三上期末試題含解析
- 2024年西藏林芝地區米林縣數學三年級第一學期期末質量跟蹤監視模擬試題含解析
- 2024年柳州市三江侗族自治縣三上數學期末學業質量監測模擬試題含解析
- 2024年淮安市楚州區三年級數學第一學期期末質量跟蹤監視模擬試題含解析
- 分析化學第1章 分析化學概論課件
- 行政法學全球視野試題及答案
- 執業護士考試患者關懷與心理疏導能力的提升與溝通技巧試題及答案
- 自考行政管理的考試技巧分享試題及答案
- 疾病預防控制的護理試題與答案
- 2025年執業藥師考試常見誤區大全試題及答案
- 大數據導論(計科2103-4)學習通超星期末考試答案章節答案2024年
- 《地方導游基礎知識》7.3 青海 地方導游基礎知識-題庫及答案
- 小學美術人教版六年級上冊 教案-點的集合
- 浙江省金華市義烏市東陽市2024年小升初英語試卷( 含筆試解析無聽力原文無音頻)
- 感覺統合教育指導師理論考試復習題庫(含答案)
- SQL語句創建學生信息數據庫表的示例學生信息數據庫表
- 輿情風險應對處置
- 2024河南中考數學備考 二次函數圖象與性質綜合題、交點問題 (課件)
- 快速入門穿越機-讓你迅速懂穿越機
- 數字電子技術(廣東工業大學)智慧樹知到期末考試答案章節答案2024年廣東工業大學
- 人工智能對書法技法的革新
評論
0/150
提交評論