版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目五根據(jù)條件進(jìn)行學(xué)生成績匯總項目要求一個班有40位學(xué)生(分成五個組,但每個組的人數(shù)不一樣)參加了期終考試(考了三門課,分別是數(shù)學(xué)、語文、英語),老師想統(tǒng)計以下信息:1、統(tǒng)計小組一門課程的總分及平均分;2、統(tǒng)計小組若干門課程的總分及平均分;3、輸出排序后小組三門課成績單。程序運行結(jié)果項目分析本項目要完成的功能相對比較多,為了使程序的結(jié)構(gòu)清晰,我們可以將此項目進(jìn)行分解:A:統(tǒng)計小組一門課程的總分及平均分;B:統(tǒng)計小組若干門課程的總分及平均分;C:輸出小組排序后三門課程的成績單;M總負(fù)責(zé),即制作菜單并根據(jù)需要調(diào)用相應(yīng)的函數(shù)。而C這個任務(wù)又比較多,所以將它分解為:d:輸入記錄;e:計算每個同學(xué)的總分及平均分,f:是排序;g:輸出排序后的記錄。這樣的編程方式結(jié)構(gòu)清晰,特別是對功能復(fù)雜的程序。我們將A,B,C,D、e、f、g稱為函數(shù),M稱為主函數(shù)。一個完整的C語言程序是由一個main()函數(shù)及若干個其他函數(shù)組成。在前面各項目中介紹的程序都只有一個主函數(shù)main(),但實用程序往往由多個函數(shù)組成。首先,要了解函數(shù)的定義;第二,要懂得函數(shù)的調(diào)用;第三,函數(shù)的其他知識。
任務(wù)1統(tǒng)計小組一門課程的總分及平均分一、問題情景一個班有40位學(xué)生(分成五個組,但每個組的人數(shù)不一樣)參加了期終考試(考了三門課,分別是數(shù)學(xué)、語文、英語),請你用菜單的方式:求小組一門課程的總分及平均分。即完成本項目中的第一個要求。分析:主函數(shù)的功能是設(shè)計一個菜單,由所選擇的菜單調(diào)用相應(yīng)的函數(shù),但為了界面清晰,所以程序的執(zhí)行過程中多次用一條線劃界。所以問題就歸結(jié)為制作一條線的函數(shù)及求一門課程的總分及平均分。#include"stdio.h"voidppp(){printf("-------------------------------------\n");}floatavg1(intn){intx,i;floats=0;ppp();printf("請輸入本小組的考試成績\n");for(i=1;i<=n;i++){scanf("%d",&x);s+=x;}returns;}main(){intk,n,km;floatsum,average;charch;ppp();printf("\t班級成績統(tǒng)計\n");ppp();printf("1、統(tǒng)計小組一門課程的總分及平均分\n",n);printf("2、統(tǒng)計小組若干門課程的總分及平均分\n");printf("3、輸出小組排序后三門課程的成績單\n");printf("請輸入1~3之間的一個數(shù):");scanf("%d",&k);ppp();if(k==1){printf("請輸入統(tǒng)計的小組的人數(shù)n=");scanf("%d",&n);ppp();sum=avg1(n);
average=sum/n;printf("本小組的總分=%.0f\t平均分=%.1f\n",sum,average);ppp();}}無參函數(shù)有參函數(shù)三、相關(guān)知識(一)無參函數(shù)1、無參函數(shù)的一般形式類型說明符函數(shù)名(){聲明部分語句}無參函數(shù)的調(diào)用函數(shù)說明語句函數(shù)名();函數(shù)類型函數(shù)名(){函數(shù)體;}main(){語句;函數(shù)名();語句;}函數(shù)類型函數(shù)名();main(){語句;函數(shù)名();語句;}函數(shù)類型函數(shù)名(){函數(shù)體;}函數(shù)說明語句【例5-1】輸出十行十列的星號(要求用函數(shù)調(diào)用方式解決)
方法一(主函數(shù)在前)#include"stdio.h"voidpp();main(){inti;for(i=1;i<=10;i++)pp();}voidpp(){printf("**********\n");}方法二(主函數(shù)在后)#include"stdio.h"voidpp(){printf("**********\n");}main(){inti;for(i=1;i<=10;i++)pp();}void表示這個函數(shù)無返回值;pp是函數(shù)名
【例5-2】用菜單的形式分別選擇百錢買百雞,九九表,水仙花數(shù)
分析:百錢買百雞,九九表,水仙花數(shù)分別在項目三的例3-12、例3-11、例3-18中介紹過。本題就是將例3-12、例3-11、例3-18改為函數(shù),然后在主函數(shù)中調(diào)用即可。所以本程序中有三個無參函數(shù),即sxhs()、jjb()、bqmbj()分別是求水仙花數(shù)、求九九表、求百錢買百雞。#include"stdio.h"voidsxhs();voidjjb();voidbqmbj();main(){inti;printf("1.水仙花數(shù)\n");printf("2.乘法九九表\n");printf("3.百錢買百雞\n");printf("請選擇1~3的菜單:");scanf("%d",&i);if(i==1)sxhs();//當(dāng)x=1,調(diào)用求水仙花數(shù)的函數(shù)if(i==2)jjb();if(i==3)bqmbj();}/*水仙花數(shù)*/voidsxhs(){inti,a,b,c;printf("\n下列數(shù)字為水仙花數(shù):\n");for(i=100;i<=999;i++) { a=i/100; b=(i-a*100)/10; c=i-a*100-b*10; if(i==a*a*a+b*b*b+c*c*c) printf("%d\n",i); }}/*乘法九九表*/voidjjb(){inti,j;printf("\n乘法九九表\n");for(i=1;i<=9;i++){for(j=1;j<=i;j++) {printf("%-5d",i*j);}printf("\n");}}/*百錢買百雞*/voidbqmbj(){intx,y,z;printf("公雞數(shù)母雞數(shù)小雞數(shù)\n");for(x=1;x<=50;x++)for(y=1;y<=33;y++){z=100-x-y;if(2*x+3*y+0.5*z==100)printf("%4d%4d%4d\n",x,y,z);}}(二)空函數(shù)類型說明符函數(shù)名(){}“小括弧”中是空的,“花括弧”中也是空的。此函數(shù)的沒有任何功能,只是占一個位置而已。這樣做的好處是將來擴(kuò)充新的功能方便。(三)有參函數(shù)1、有參函數(shù)的一般形式類型說明符函數(shù)名(形參類型形參名,形參類型形參名,……形參類型形參名){聲明部分語句return語句}“小括弧”中的形參,可以有一個,也可以有多個。函數(shù)體中的最后一個語句,通常是return語句,其作用是帶回一個返回值。若沒有返回值,則可以省略return語句。2、有參函數(shù)的調(diào)用與無參函數(shù)類似,只不過需要有形參。即:函數(shù)名(實參列表);具體有以下二種:函數(shù)類型函數(shù)名(形參列表){函數(shù)體;}main(){語句;函數(shù)名(實參列表);語句;}函數(shù)類型函數(shù)名(形參列表);main(){語句;函數(shù)名(實參列表);語句;}函數(shù)類型函數(shù)名(形參列表){函數(shù)體;}【例5-3】求Cmn=m!/(n!(m-n)!)分析:如果有一個函數(shù)jc(k),其功能是求k!,即jc(5)就是5!,jc(8)就是8!,jc(10)就是10!,顯然對m!/(n!(m-n)!)來說,就是jc(m)/(jc(n)*jc(m-n))即可。#include"stdio.h"intjc(intk);/*函數(shù)說明語句*/main(){intm,n,c;printf("請輸入m,n的值:");scanf("%d%d",&m,&n);c=jc(m)/(jc(n)*jc(m-n));printf("Cmn的值為%d\n",c);}/*階乘的函數(shù)*/intjc(intk){inti;intt=1;for(i=1;i<=k;i++)t=t*i;returnt;}#include"stdio.h"/*階乘的函數(shù)*/intjc(intk){inti;intt=1;for(i=1;i<=k;i++)t=t*i;returnt;}/*主函數(shù)*/main(){intm,n,c;printf("請輸入m,n的值:");scanf("%d%d",&m,&n);c=jc(m)/(jc(n)*jc(m-n));printf("Cmn的值為%d\n",c);}C語言規(guī)定,實參變量對形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞?!纠?-4】調(diào)用函數(shù)時的數(shù)據(jù)傳遞。輸入二個數(shù)x,y,求二個數(shù)中的大數(shù)。
#include"stdio.h"intmax(intx,inty){intt,max;if(x<y){t=x;x=y;y=t;}max=x;printf("在函數(shù)中的x,y的值為x=%d,y=%d\n",x,y);returnmax;}main(){intx,y,mm;printf("請輸入x,y的值:");scanf("%d,%d",&x,&y);printf("調(diào)用函數(shù)前x,y的值為x=%d,y=%d\n",x,y);mm=max(x,y);printf("mm的值為%d\n",mm);printf("調(diào)用函數(shù)后x,y的值為x=%d,y=%d\n",x,y);}
盡管在主函數(shù)和max()函數(shù)中都定義了名為x,y的變量,但它們是屬于不同的實體,它們僅僅是名稱相同而已,就好比有二個人都叫“李小芳”,但一個是計算機(jī)班的“李小芳”,但另一個是國貿(mào)班的“李小芳”。
【例5-5】請仿照例5-2編寫一個用菜單的形式分別選擇1-100的奇數(shù)和,韓信點兵問題。(韓信點兵問題在例3-20)#include"stdio.h"voidhxdb()//韓信點兵{longi;for(i=1;;i++)if(i%3==2&&i%5==2&&i%7==4&&i%13==6&&i%17==2&&i%19==10)break;printf("韓信統(tǒng)領(lǐng)的兵數(shù)有:%ld\n",i);}voidsum()//1-100的奇數(shù)和{inti,s=0;for(i=1;i<=100;i=i+2)s=s+i;printf("1-100奇數(shù)的和為%d\n",s);}分析:1-100的奇數(shù)和,韓信點兵分別在項目三的實踐訓(xùn)練、例3-24中介紹過。本題就是將它改為函數(shù),然后在主函數(shù)中調(diào)用即可。所以本程序中有二個無參函數(shù),即hxdb()、sum()分別是韓信點兵、1-100的奇數(shù)和。main(){inti;printf("1.韓信點兵\n");printf("2.1-100的奇數(shù)和\n");printf("請選擇1~2的菜單:");scanf("%d",&i);if(i==1)hxdb();//當(dāng)x=1,調(diào)用韓信點兵函數(shù)if(i==2)sum();}【例5-6】編寫一個函數(shù):x!,在主函數(shù)中調(diào)用它。#include"stdio.h"intjc(intx){inti,t=1;for(i=1;i<=x;i++)t=t*i;returnt;}main(){intn;printf("請輸入n的值");scanf("%d",&n);printf("%d!=%d\n",n,jc(n));}分析:1-100的奇數(shù)和,韓信點兵分別在項目三的實踐訓(xùn)練、例3-24中介紹過。本題就是將它改為函數(shù),然后在主函數(shù)中調(diào)用即可。所以本程序中有二個無參函數(shù),即hxdb()、sum()分別是韓信點兵、1-100的奇數(shù)和?!纠?-7】編寫一個函數(shù):求二個數(shù)的最大公約數(shù),在主函數(shù)中調(diào)用它。#include"stdio.h"intgy(intx,inty){inti;for(i=x;i>=1;i--)if(x%i==0&&y%i==0)returni;}main(){intn,m;printf("請輸入n、m的值");scanf("%d%d",&n,&m);printf("%d與%d的最大公約數(shù)=%d\n",n,m,gy(n,m));}【例5-8】編寫一個函數(shù):輸出一排星號,在主函數(shù)中調(diào)用它,使之輸出如下圖形。#include"stdio.h"voidxh(intn){inti;for(i=1;i<=n;i++)printf("*");}main(){intm,i;printf("請輸入m的值");scanf("%d",&m);for(i=1;i<=m;i++){xh(i);printf("\n");}}*********************任務(wù)2統(tǒng)計小組若干門課程的總分及平均分一、問題情景一個班有40位學(xué)生(分成五個組,但每個組的人數(shù)不一樣)參加了期終考試(考了三門課,分別是數(shù)學(xué)、語文、英語),請你用菜單的方式:求小組若干門課程的總分及平均分。即完成本項目中的第二個要求。分析:由圖可分析出主函數(shù)的功能是設(shè)計一個菜單,由所選擇的菜單調(diào)用相應(yīng)的函數(shù),但為了界面清晰,所以在程序的執(zhí)行過程中出現(xiàn):求小組的若干門成績的平均分及總分的函數(shù)又調(diào)用了一條線的函數(shù)ppp()。二、具體實現(xiàn)#include"stdio.h"/*輸出線條函數(shù)*/ppp(){printf("-------------------------------------\n");}/*某個小組若干門課程的平均分與總分函數(shù)*/voidavgevery(intn,intkm){intx,i,j;floats,avg;for(j=1;j<=km;j++){s=0;printf("請輸入本小組第%d門考試成績\n",j);ppp();for(i=1;i<=n;i++){scanf("%d",&x);s+=x;}avg=s/n;printf("第%d課程的總分=%.0f\t平均分=%.1f\n",j,s,avg);ppp();}}/*主函數(shù)*/main(){intk,n,km;floatsum,average;charch;ppp();printf("\t班級成績統(tǒng)計\n");ppp();printf("1、統(tǒng)計小組一門課程的總分及平均分\n",n);printf("2、統(tǒng)計小組若干門課程的總分及平均分\n");printf("3、輸出小組排序后三門課程的成績單\n");printf("請輸入1~3之間的一個數(shù):");scanf("%d",&k);ppp();if(k==2){printf("請輸入統(tǒng)計的小組的人數(shù)n=");scanf("%d",&n);ppp();printf("請輸入要統(tǒng)計的課程門數(shù)km=");scanf("%d",&km);ppp();avgevery(n,km);}三、相關(guān)知識嵌套調(diào)用的定義:即在調(diào)用一個函數(shù)的過程中,可以再調(diào)用一個函數(shù)。main()函數(shù)調(diào)用a1函數(shù)a1函數(shù)調(diào)用a2函數(shù)a2函數(shù)結(jié)束①②③④⑤⑥⑦⑧⑨執(zhí)行main函數(shù)中調(diào)用a1函數(shù)時,即轉(zhuǎn)去執(zhí)行a1函數(shù);在a1函數(shù)中調(diào)用a2函數(shù)時,又去執(zhí)行a2函數(shù);a2函數(shù)執(zhí)行完畢返回a1函數(shù)斷點繼續(xù)執(zhí)行;a1函數(shù)執(zhí)行完畢返回main函數(shù)的斷點繼續(xù)執(zhí)行,直至程序執(zhí)行結(jié)束。例題【例5-9】函數(shù)的嵌套調(diào)用。求Cmn=m!/(n!(m-n)!)。要求用函數(shù)的嵌套方式完成。分析:假設(shè)有3人參加,C負(fù)責(zé)計算jc(k),B向C要jc(k),然后計算Cmn;A負(fù)責(zé)輸入m,n二個數(shù),然后直接問B要Cmn的結(jié)果。#include"stdio.h"/*c的程序為*/intjc(intk){inti;intt=1;for(i=1;i<=k;i++)t=t*i;returnt;}/*而B的程序為:*/intcmn(intm,intn){intz;z=jc(m)/(jc(n)*jc(m-n));returnz;}/*A的程序為:*/main(){intm,n,c;printf("請輸入m,n的值:");scanf("%d%d",&m,&n);c=cmn(m,n);printf("Cmn的值為%d\n",c);}這個程序就是A要調(diào)用B,而B要調(diào)用C,所以就稱為函數(shù)的嵌套。main(){intk,n,km;floatsum,average;charch;ppp();printf("\t班級成績統(tǒng)計\n");ppp();printf("1、統(tǒng)計小組一門課程的總分及平均分\n",n);printf("2、統(tǒng)計小組若干門課程的總分及平均分\n");printf("3、輸出小組排序后三門課程的成績單\n");printf("請輸入1~3之間的一個數(shù):");scanf("%d",&k);ppp();if(k==2){printf("請輸入統(tǒng)計的小組的人數(shù)n=");scanf("%d",&n);ppp();printf("請輸入要統(tǒng)計的課程門數(shù)km=");scanf("%d",&km);ppp();avgevery(n,km);}}現(xiàn)在回頭分析本任務(wù)中的具體實現(xiàn):主函數(shù)調(diào)用avgevery()函數(shù),而avgevery()函數(shù)又調(diào)用ppp()函數(shù),即屬于函數(shù)的嵌套。/*輸出線條函數(shù)*/ppp(){printf("-------------------------------------\n");}/*某個小組若干門課程的平均分與總分函數(shù)*/voidavgevery(intn,intkm){intx,i,j;floats,avg;for(j=1;j<=km;j++){s=0;printf("請輸入本小組第%d門考試成績\n",j);ppp();for(i=1;i<=n;i++){scanf("%d",&x);s+=x;}avg=s/n;printf("第%d課程的總分=%.0f\t平均分=%.1f\n",j,s,avg);ppp();}}函數(shù)avgevery(intn,intkm)有二個參數(shù),因為需要傳遞二個值,即小組的人數(shù)及課程門數(shù);知識擴(kuò)展函數(shù)的遞歸調(diào)用就是在調(diào)用一個函數(shù)的過程中,又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身?!纠?-10】猜年齡。5個小朋友排著隊做游戲。第1個小朋友3歲,其余的年齡一個比一個大2歲,問第5個小朋友的年齡是多大?分析:要知道第5個小朋友的年齡,則一定要知道第4個小朋友的年齡;要知道第4個小朋友的年齡,則一定要知道第3個小朋友的年齡;要知道第3個小朋友的年齡,則一定要知道第2個小朋友的年齡要知道第2個小朋友的年齡,則一定要知道第1個小朋友的年齡而第一個小朋友的的年齡是已知的,是3歲,這樣倒推就能知道第5個小朋友的年齡。若用age(n)表示第n個小朋友的年齡,則有公式:
3(n=1)
age=
age(n-1)+2(n>1)
#include"stdio.h"intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}main(){printf("第五個小朋友的年齡為%d\n",age(5));}運行結(jié)果如下:第五個小朋友的年齡為11n=5age(4)+2返回值11第一次調(diào)用n=4age(3)+2返回值9第二次調(diào)用n=3age(2)+2返回值7第三次調(diào)用n=2age(1)+2返回值5第四次調(diào)用第五次調(diào)用n=1遞歸結(jié)束返回值3①⑩②③④⑤⑥⑦⑧⑨【例5-11】求1+2+3+……+n的和。分析:可寫成
1(n=1)
sum(n)=
sum(n-1)+n(n>1)
程序如下:#include"stdio.h"intsum(intn){inty;if(n==1)y=1;elsey=sum(n-1)+n;returny;}main(){intn;scanf("%d",&n);printf("%d\n",sum(n));}【例5-12】試編程利用海倫公式求三角形面積。有三人負(fù)責(zé)完成。B負(fù)責(zé)判斷能否構(gòu)成三角形;C負(fù)責(zé)計算三角形的面積,而A是總負(fù)責(zé),其職責(zé)是輸入三個數(shù),調(diào)用函數(shù)B看是否能構(gòu)成三角形,若能,則調(diào)用c。#include"stdio.h"#include"math.h"/*B所完成的函數(shù)*/intistriangle(inta,intb,intc)//判斷能否構(gòu)成三角形{intt;if(a+b>c&&a+c>b&&b+c>a)t=1;elset=0;returnt;}/*C所完成的函數(shù)*/floatarea(inta,intb,intc)//計算三角形面積{floats,l;l=(a+b+c)/2.0;s=sqrt(l*(l-a)*(l-b)*(l-c));returns;}/*A所完成的函數(shù)*/main(){inta,b,c;printf("請輸入三角形a,b,c的值\n");scanf("%d,%d,%d",&a,&b,&c);if(istriangle(a,b,c)==1)printf("三角形的面積為%.1f\n",area(a,b,c));elseprintf("對不起,構(gòu)不成三角形\n");}【例5-13】】用遞歸求n!。#include<stdio.h>longjc(intn){inti;longt;if(n==1)t=1;elset=jc(n-1)*n;returnt;}voidmain(){intn;scanf("%d",&n);printf("%d!=%ld\n",n,jc(n));}}
1(n=1)
n!
=
(n-1)!*n(n>1)
分析:若n=6,則6!=5!*6,5!=4!*5,4!=3!*4,3!=2!*3,2!=1!*2,而1!=1;所以,可以寫成注意書中p172頁上印刷有誤【例5-14】1202年,意大利數(shù)學(xué)家斐波那契出版了他的《算盤全書》,在書中第一次提到了著名的Fibonacci數(shù)列:1,1,2,3,5,8,13,21...,定義如下:
1(n=1)
fibonacci(n)
=1(n=2)
fibonacci(n-1)+fibonacci(n-2)(n>2)
#include<stdio.h>longfab(intn){inti;longt;if(n==1||n==2)t=1;elset=fab(n-1)+fab(n-2);returnt;}voidmain(){intn,i;printf("請輸出要輸出的項數(shù):");scanf("%d",&n);printf("fabonacii數(shù)列如下:\n");for(i=1;i<=n;i++)printf("%-8d",fab(i));printf("\n");}請輸出fibonacci數(shù)列的前n項,程序運行結(jié)果如所示。任務(wù)3輸出排序后小組三門課成績單一、問題情景
一個班有40位學(xué)生參加了期終考試(考了三門課),請輸出學(xué)生排序后的成績單。分析:本項目要完成的功能相對比較多,為了使程序的結(jié)構(gòu)清晰,我們可以將些項目進(jìn)行分解:A:完成三門課成績的輸入;B:計算每個同學(xué)的總分與平均分;C:對三門課的成績進(jìn)行排序;D:輸出函數(shù)E:總負(fù)責(zé),調(diào)用A、B、C、D即可。二、具體實現(xiàn)(假設(shè)本小組只有5個同學(xué))#include"stdio.h"#include"string.h"#defineN5/*輸出線條函數(shù)*/ppp(){printf("--------------------------------------------------\n");}/*輸入函數(shù)A*/voidinput(intscore[N][3],charname[N][10]){inti,j;for(i=0;i<N;i++){printf("第%d個同學(xué)的姓名及三門課的成績:",i+1);scanf("%s",name[i]);for(j=0;j<3;j++)scanf("%d",&score[i][j]);}}/*計算每個同學(xué)的總分與平均分B*/voidsumavg(intscore[N][3],floatsum[],floatavg[]){inti,j;for(i=0;i<N;i++){for(j=0;j<3;j++)sum[i]=sum[i]+score[i][j];avg[i]=sum[i]/3.0;}}/*排序函數(shù)C*/voidpx(intscore[][3],floatsum[],floatavg[],charname[][10]){inti,j;floatt;charnn[10];for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(sum[j]<sum[j+1]){t=sum[j];sum[j]=sum[j+1];sum[j+1]=t;t=avg[j];avg[j]=avg[j+1];avg[j+1]=t;//這個同學(xué)的所有數(shù)據(jù)都要交換t=score[j][0];score[j][0]=score[j+1][0];score[j+1][0]=t;t=score[j][1];score[j][1]=score[j+1][1];score[j+1][1]=t;t=score[j][2];score[j][2]=score[j+1][2];score[j+1][2]=t;strcpy(nn,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],nn);}}/*輸出函數(shù)D*/voidprint(intscore[][3],floatsumr[],floatavgr[],charname[][10]){inti,j;ppp();printf("輸出排序后五個同學(xué)三門課的成績:\n");ppp();printf("序號\t姓名\t課1\t課2\t課3\t總分\t平均分\n");for(i=0;i<N;i++){printf("%d:\t",i+1);printf("%s\t",name[i]);for(j=0;j<3;j++)printf("%d\t",score[i][j]);printf("%.0f\t%.1f\t",sumr[i],avgr[i]);printf("\n");}ppp();}/*主函數(shù)*/main(){inti,j;intscore[N][3],t;charname[N][10],nn[10];floatsumr[N]={0},avgr[N];//每個同學(xué)的總分及平均分/*調(diào)用輸入記錄函數(shù)*/input(score,name);/*調(diào)用計算總分與平均分的函數(shù)*/sumavg(score,sumr,avgr);/*調(diào)用排序函數(shù)*/px(score,sumr,avgr,name);/*調(diào)用輸出函數(shù)*/print(score,sumr,avgr,name);}新的知識點是:數(shù)組作為函數(shù)名時,是如何傳遞的。(三)相關(guān)知識使用數(shù)組名作為函數(shù)參數(shù)時,實參與形參都應(yīng)使用數(shù)組名(或指針變量,見項目六)。當(dāng)數(shù)組名作為函數(shù)實參時,不是把數(shù)組的值傳遞給形參,而是把實參數(shù)組的起始地址傳遞給形參數(shù)組,實參和形參的地址是相同的,即當(dāng)形參的值發(fā)生變化時,實參的值也發(fā)生了變化?!纠?-15】有二個學(xué)生A,B合力完成下面一個問題:求20個學(xué)生的平均成績。他們的分工是這樣的:B完成20個數(shù)的平均值,不負(fù)責(zé)數(shù)據(jù)的輸入;A完成20個數(shù)的輸入,然后問B要20個數(shù)的平均值后輸出。分析:B所做的是求平均值的average()函數(shù):已經(jīng)有二十個數(shù)了,放在數(shù)組a[20]中,現(xiàn)在只要將這20個數(shù)相加后除以20,然后將結(jié)果交給A就行了。
A所做的是主函數(shù)main():輸入20個數(shù),并將其放在數(shù)組中,調(diào)用B所做的函數(shù),將輸入的20個數(shù)傳遞給B,然后接過B的結(jié)果,并將其輸出。#include"stdio.h"/*B所完成的程序*/floataverage(intb[20])//b[20]表示從A中拿到的20個數(shù){inti,s;floatavg;s=0;for(i=0;i<20;i++)s=s+b[i];//將20個數(shù)相加avg=s/20.0;returnavg;//結(jié)果交給對方}/*A所完成的程序*/main(){inti,a[20];//定義20個數(shù),將存放20個數(shù)據(jù)floatavg;printf("請輸入20個同學(xué)的成績\n");for(i=0;i<20;i++)scanf("%d",&a[i]);//輸入20個數(shù)據(jù)avg=average(a);/*調(diào)用average()函數(shù),將數(shù)組a的值傳給average
并接過average的結(jié)果,將其放在avg中*/printf("這些同學(xué)的平均分為%.1f\n",avg);}注意(4)形參數(shù)組也可不指定大小,或者在被調(diào)函數(shù)中另設(shè)一個參數(shù),來傳遞數(shù)組的大小。如上面的程序可改為:(1)數(shù)組名作為函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義數(shù)組,如上面程序中的b是形參數(shù)組,a是實參數(shù)組,分別在其所在的函數(shù)中定義。(2)實參數(shù)組與形參數(shù)組類型應(yīng)當(dāng)相同,如果不同,將會出錯,如上面程序中的形參數(shù)組b是整型,實參數(shù)組a也是整型。(3)實參數(shù)組與形參數(shù)組大小可以不同也可以相同,C編譯器對形參數(shù)組大小不做檢查,只是將實參數(shù)組的首地址傳遞給形參數(shù)組。如上面程序中的floataverage(intb[20])改為floataverage(intb[10]),并不影響程序的正常運行,最后的結(jié)果也是相同的,我們甚至可以寫成floataverage(intb[]),即只要b是數(shù)組即可。(5)形參數(shù)組與實參數(shù)組是占用同一個地址,所以是地址傳遞,即當(dāng)形參的值發(fā)生變化時,實參的值也會跟著變化。#include"stdio.h"floataverage(intb[],intn){inti,s;floatavg;s=0;for(i=0;i<n;i++)s=s+b[i];//將20個數(shù)相加avg=(float)s/n;returnavg;//結(jié)果交給對方}【例5-16】輸入十個同學(xué)的成績,要求用函數(shù)進(jìn)行排序(降序)。即有二個學(xué)生A,B合力完成下面一個問題:將10個學(xué)生的成績排序(降序)。他們的分工是這樣的:A是完成主函數(shù)的編寫:也就是完成10個數(shù)的輸入,調(diào)用B編寫的函數(shù)sort(),就得到排序完的10個數(shù),然后進(jìn)行輸出。B所編寫的函數(shù)sort()的功能是完成10個數(shù)的排序,不負(fù)責(zé)數(shù)據(jù)的輸入。#include"stdio.h"voidsort(intb[]);main(){inta[10],i;printf("請輸入十個同學(xué)的成績\n");for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a);//調(diào)用函數(shù)sort()printf("排序后的成績?yōu)?\n");for(i=0;i<10;i++)printf("%3d",a[i]);printf("\n");}voidsort(intb[])/*函數(shù)的功能就是選擇法進(jìn)行排序*/{inti,j,t;for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(b[i]<b[j]){t=b[i];b[i]=b[
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年物業(yè)與業(yè)主社區(qū)養(yǎng)老服務(wù)體系合同3篇
- 二零二五版高速公路監(jiān)控系統(tǒng)集成采購與安裝合同2篇
- 2025版定制化鐵藝工程勞務(wù)分包服務(wù)合同3篇
- 安徽省高三上學(xué)期校聯(lián)考化學(xué)試卷及答案(含答案解析)
- 二零二五年度木地板產(chǎn)品回收與再利用合同3篇
- 動漫產(chǎn)業(yè)法律法規(guī)與版權(quán)保護(hù)考核試卷
- 城市規(guī)劃與城市能源結(jié)構(gòu)調(diào)整考核試卷
- 塑料加工過程中的物料管理與優(yōu)化考核試卷
- 二零二五版養(yǎng)老設(shè)施建設(shè)項目合伙承包合同樣本3篇
- 2025年度某某酒店電梯設(shè)施維護(hù)保養(yǎng)合同2篇
- 勞務(wù)協(xié)議范本模板
- 2025大巴車租車合同范文
- 老年上消化道出血急診診療專家共識2024
- 人教版(2024)數(shù)學(xué)七年級上冊期末測試卷(含答案)
- 2024年國家保密培訓(xùn)
- 磚廠承包合同簽訂轉(zhuǎn)讓合同
- 思政課國內(nèi)外研究現(xiàn)狀分析
- 皮膚感染的護(hù)理診斷與護(hù)理措施
- 2023年公務(wù)員多省聯(lián)考《申論》題(廣西B卷)
- EPC總承包項目中的質(zhì)量管理體系
- 高中物理考試成績分析報告
評論
0/150
提交評論