版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、项目五 根据条件进行学生成绩汇总,项目要求 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),老师想统计以下信息:1、统计小组一门课程的总分及平均分;2、统计小组若干门课程的总分及平均分;3、输出排序后小组三门课成绩单。,程序运行结果,项目分析 本项目要完成的功能相对比较多,为了使程序的结构清晰,我们可以将此项目进行分解: A:统计小组一门课程的总分及平均分;B:统计小组若干门课程的总分及平均分;C: 输出小组排序后三门课程的成绩单;M总负责,即制作菜单并根据需要调用相应的函数。 而C这个任务又比较多,所以将它分解为:d:输入记录;e:
2、计算每个同学的总分及平均分,f:是排序;g:输出排序后的记录。 这样的编程方式结构清晰,特别是对功能复杂的程序。 我们将A,B,C,D、e、f、g称为函数,M称为主函数。一个完整的C语言程序是由一个main()函数及若干个其他函数组成。在前面各项目中介绍的程序都只有一个主函数main(),但实用程序往往由多个函数组成。,首先,要了解函数的定义; 第二,要懂得函数的调用; 第三,函数的其他知识。,任务1 统计小组一门课程的总分及平均分,一、问题情景 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组一门课程的总分及
3、平均分。即完成本项目中的第一个要求。 分析:主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以程序的执行过程中多次用一条线划界。所以问题就归结为制作一条线的函数及求一门课程的总分及平均分。,#include stdio.h void ppp() printf(-n); float avg1(int n) int x,i; float s=0; ppp(); printf(请输入本小组的考试成绩n); for(i=1;i=n;i+) scanf(%d, ,main() int k,n,km; float sum,average; char ch; ppp(); pri
4、ntf(t班级成绩统计n); ppp(); printf(1、统计小组一门课程的总分及平均分n,n); printf(2、统计小组若干门课程的总分及平均分n); printf(3、输出小组排序后三门课程的成绩单n); printf(请输入13之间的一个数:); scanf(%d, ,无参函数,有参函数,三、相关知识,(一) 无参函数 1、无参函数的一般形式 类型说明符 函数名() 声明部分 语句 ,无参函数的调用 函数说明语句 函数名();,函数类型 函数名() 函数体; main() 语句; 函数名(); 语句;,函数类型 函数名(); main() 语句; 函数名(); 语句; 函数类型
5、函数名() 函数体;,函数说明语句,【例5-1】输出十行十列的星号(要求用函数调用方式解决),方法一(主函数在前) #include stdio.h void pp(); main() int i; for(i=1;i=10;i+) pp(); void pp() printf(*n);,方法二(主函数在后) #include stdio.h void pp() printf(*n); main() int i; for(i=1;i=10;i+) pp(); ,void 表示这个函数无返回值;pp是函数名,【例5-2】用菜单的形式分别选择百钱买百鸡,九九表,水仙花数,分析:百钱买百鸡,九九表,
6、水仙花数分别在项目三的例3-12、例3-11、例3-18中介绍过。本题就是将例3-12、例3-11、例3-18改为函数,然后在主函数中调用即可。所以本程序中有三个无参函数,即sxhs()、jjb()、bqmbj()分别是求水仙花数、求九九表、求百钱买百鸡。,#include stdio.h void sxhs(); void jjb(); void bqmbj(); main() int i; printf(1.水仙花数n); printf(2.乘法九九表n); printf(3.百钱买百鸡n); printf(请选择13的菜单:); scanf(%d, ,/*水仙花数*/ void sxhs
7、() int i,a,b,c; printf(n下列数字为水仙花数: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); ,/*乘法九九表*/ void jjb() int i,j; printf(n乘法九九表n); for(i=1;i=9;i+) for(j=1;j=i;j+) printf(%-5d,i*j); printf(n); ,/*百钱买百鸡*/ void bqmbj() int x,y,z; printf(公鸡数 母鸡数 小
8、鸡数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 %4dn,x,y,z);,(二) 空函数,类型说明符 函数名() “小括弧”中是空的,“花括弧”中也是空的。此函数的没有任何功能,只是占一个位置而已。这样做的好处是将来扩充新的功能方便。,(三)有参函数,1、有参函数的一般形式 类型说明符 函数名(形参类型 形参名,形参类型 形参名,形参类型 形参名) 声明部分 语句 return 语句 “小括弧”中的形参,可以有一个,也可以有多个。函数体中的最后一个语句,通常是retur
9、n语句,其作用是带回一个返回值。若没有返回值,则可以省略return语句。 2、有参函数的调用 与无参函数类似,只不过需要有形参。即:函数名(实参列表); 具体有以下二种:,函数类型 函数名(形参列表) 函数体; main() 语句; 函数名(实参列表); 语句;,函数类型 函数名(形参列表); main() 语句; 函数名(实参列表); 语句; 函数类型 函数名(形参列表) 函数体;,【例5-3】求Cmn=m!/(n!(m-n)!),分析:如果有一个函数jc(k),其功能是求k!,即jc(5)就是5!,jc(8)就是8!,jc(10)就是10!,显然对m!/(n!(m-n)!)来说,就是jc
10、(m)/(jc(n)*jc(m-n)即可。,#include stdio.h int jc(int k); /*函数说明语句*/ main() int m,n,c; printf(请输入m,n的值:); scanf(%d%d, ,#include stdio.h /*阶乘的函数*/ int jc(int k) int i; int t=1; for(i=1;i=k;i+) t=t*i; return t; /*主函数*/ main() int m,n,c; printf(请输入m,n的值:); scanf(%d%d, ,C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递。,【例5
11、-4】调用函数时的数据传递。输入二个数x,y,求二个数中的大数。,#include stdio.h int max(int x,int y) int t,max; if(xy) t=x;x=y;y=t; max=x; printf(在函数中的x,y的值为x=%d,y=%dn,x,y); return max; ,main() int x,y,mm; printf(请输入x,y的值:); scanf(%d,%d,尽管在主函数和max()函数中都定义了名为x,y的变量,但它们是属于不同的实体,它们仅仅是名称相同而已,就好比有二个人都叫“李小芳”,但一个是计算机班的“李小芳”,但另一个是国贸班的“李
12、小芳”。,任务2 统计小组若干门课程的总分及平均分,一、问题情景 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组若干门课程的总分及平均分。即完成本项目中的第二个要求。,分析:由图可分析出主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以在程序的执行过程中出现:求小组的若干门成绩的平均分及总分的函数又调用了一条线的函数ppp()。,二、具体实现 #include stdio.h /*输出线条函数*/ ppp() printf(-n); /*某个小组若干门课程的平均分与总分函数*/ v
13、oid avgevery(int n,int km) int x,i,j; float s,avg; for(j=1;j=km;j+) s=0; printf(请输入本小组第%d门考试成绩n,j); ppp(); for(i=1;i=n;i+) scanf(%d, ,/*主函数*/ main() int k,n,km; float sum,average; char ch; ppp(); printf(t班级成绩统计n); ppp(); printf(1、统计小组一门课程的总分及平均分n,n); printf(2、统计小组若干门课程的总分及平均分n); printf(3、输出小组排序后三门课程
14、的成绩单n); printf(请输入13之间的一个数:); scanf(%d,三、相关知识,嵌套调用的定义:即在调用一个函数的过程中,可以再调用一个函数。,执行main函数中调用a1函数时,即转去执行a1函数;在a1函数中调用a2函数时,又去执行a2函数;a2函数执行完毕返回a1函数断点继续执行;a1函数执行完毕返回main函数的断点继续执行,直至程序执行结束。,例题,【例5-5】函数的嵌套调用。求Cmn=m!/(n!(m-n)!)。要求用函数的嵌套方式完成。,分析:假设有3人参加, C负责计算jc(k), B向C要jc(k),然后计算Cmn;A负责输入m,n二个数,然后直接问B要Cmn的结果
15、。,#include stdio.h /*c的程序为*/ int jc(int k) int i; int t=1; for(i=1;i=k;i+) t=t*i; return t; ,/*而B的程序为:*/ int cmn(int m,int n) int z; z= jc(m)/(jc(n)*jc(m-n); return z;,/*A的程序为:*/ main() int m,n,c; printf(请输入m,n的值:); scanf(%d%d, ,这个程序就是A要调用B,而B要调用C,所以就称为函数的嵌套。,main() int k,n,km; float sum,average; ch
16、ar ch; ppp(); printf(t班级成绩统计n); ppp(); printf(1、统计小组一门课程的总分及平均分n,n); printf(2、统计小组若干门课程的总分及平均分n); printf(3、输出小组排序后三门课程的成绩单n); printf(请输入13之间的一个数:); scanf(%d, ,现在回头分析本任务中的具体实现:主函数调用avgevery()函数,而avgevery()函数又调用ppp()函数,即属于函数的嵌套。,/*输出线条函数*/ ppp() printf(-n); /*某个小组若干门课程的平均分与总分函数*/ void avgevery(int n,i
17、nt km) int x,i,j; float s,avg; for(j=1;j=km;j+) s=0; printf(请输入本小组第%d门考试成绩n,j); ppp(); for(i=1;i=n;i+) scanf(%d, ,函数avgevery(int n,int km)有二个参数,因为需要传递二个值,即小组的人数及课程门数;,四、知识扩展,函数的递归调用就是在调用一个函数的过程中,又出现直接或间接地调用该函数本身。,【例5-5】猜年龄。5个小朋友排着队做游戏。第1个小朋友3岁,其余的年龄一个比一个大2岁,问第5个小朋友的年龄是多大?,分析:要知道第5个小朋友的年龄,则一定要知道第4个小朋
18、友的年龄; 要知道第4个小朋友的年龄,则一定要知道第3个小朋友的年龄; 要知道第3个小朋友的年龄,则一定要知道第2个小朋友的年龄 要知道第2个小朋友的年龄,则一定要知道第1个小朋友的年龄 而第一个小朋友的的年龄是已知的,是3岁,这样倒推就能知道第5个小朋友的年龄。若用age(n)表示第n个小朋友的年龄,则有公式:,3 (n=1) age= age(n-1)+2 (n1),#include stdio.h int age( int n ) int c; if (n=1) c=10; else c=age(n-1)+2; return c; main() printf(第五个小朋友的年龄为%dn,
19、age(5);,运行结果如下: 第五个小朋友的年龄为11,【例5-6】求1+2+3+n的和。,分析:可写成,1 (n=1) sum(n)= sum(n-1)+n (n1),程序如下: #include stdio.h int sum(int n) int y; if(n=1)y=1; else y=sum(n-1)+n; return y;,main() int n; scanf(%d,任务3 输出排序后小组三门课成绩单,一、问题情景 一个班有40位学生参加了期终考试(考了三门课),请输出学生排序后的成绩单。,分析:本项目要完成的功能相对比较多,为了使程序的结构清晰,我们可以将些项目进行分解:
20、 A:完成三门课成绩的输入;B:计算每个同学的总分与平均分;C:对三门课的成绩进行排序;D:输出函数 E:总负责,调用A、B、C、D即可。,二、具体实现(假设本小组只有5个同学) #include stdio.h #include string.h #define N 5 /*输出线条函数*/ ppp() printf(-n); ,/*输入函数A*/ void input(int scoreN3,char nameN10) int i,j; for (i=0;iN;i+) printf(第%d个同学的姓名及三门课的成绩:,i+1); scanf(%s,namei); for(j=0;j3;j+
21、) scanf(%d, ,/*计算每个同学的总分与平均分B*/ void sumavg(int scoreN3,float sum,float avg) int i,j; for(i=0;iN;i+) for(j=0;j3;j+) sumi=sumi+scoreij; avgi=sumi/3.0; ,/*排序函数C*/ void px(int score3,float sum,float avg,char name10) int i,j; float t; char nn10; for(i=0;iN-1;i+) for(j=0;jN-1-i;j+) if(sumjsumj+1) t=sumj;
22、sumj=sumj+1;sumj+1=t; t=avgj;avgj=avgj+1;avgj+1=t; /这个同学的所有数据都要交换 t=scorej0;scorej0=scorej+10;scorej+10=t; t=scorej1;scorej1=scorej+11;scorej+11=t; t=scorej2;scorej2=scorej+12;scorej+12=t; strcpy(nn,namej);strcpy(namej,namej+1);strcpy(namej+1,nn);,/*输出函数D*/ void print(int score 3,float sumr ,float a
23、vgr ,char name 10) int i,j; ppp(); printf(输出排序后五个同学三门课的成绩:n); ppp(); printf(序号t姓名t课1t课2t课3t总分t平均分n); for (i=0;iN;i+) printf(%d:t,i+1); printf(%st,namei); for(j=0;j3;j+) printf(%dt,scoreij); printf(%.0ft%.1ft,sumri,avgri); printf(n); ppp(); ,/*主函数*/ main() int i,j; int scoreN3,t; char nameN10,nn10; f
24、loat sumrN=0,avgrN; /每个同学的总分及平均分 /*调用输入记录函数*/ input(score,name); /*调用计算总分与平均分的函数*/ sumavg(score ,sumr,avgr); /*调用排序函数*/ px(score,sumr,avgr,name); /*调用输出函数*/ print(score,sumr,avgr,name); ,新的知识点是:数组作为函数名时,是如何传递的。,(三)相关知识,使用数组名作为函数参数时,实参与形参都应使用数组名(或指针变量,见项目六)。当数组名作为函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数
25、组,实参和形参的地址是相同的,即当形参的值发生变化时,实参的值也发生了变化。,【例5-7】有二个学生A,B合力完成下面一个问题:求20个学生的平均成绩。他们的分工是这样的: B完成20个数的平均值,不负责数据的输入;A完成20个数的输入,然后问B要20个数的平均值后输出。,分析:B所做的是求平均值的average( )函数:已经有二十个数了,放在数组a20中,现在只要将这20个数相加后除以20,然后将结果交给A就行了。 A所做的是主函数main():输入20个数,并将其放在数组中,调用B所做的函数,将输入的20个数传递给B,然后接过B的结果,并将其输出。,#include stdio.h /*
26、B所完成的程序*/ float average(int b20) /b20表示从A中拿到的20个数 int i,s; float avg; s=0; for (i=0;i20;i+) s=s+bi; /将20个数相加 avg=s/20.0; return avg; /结果交给对方 ,/*A所完成的程序*/ main() int i,a20; /定义20个数,将存放20个数据 float avg; printf(请输入20个同学的成绩n); for (i=0;i20;i+) scanf(%d, ,注意,(4)形参数组也可不指定大小,或者在被调函数中另设一个参数,来传递数组的大小。如上面的程序可改
27、为:,(1)数组名作为函数参数,应该在主调函数和被调函数中分别定义数组,如上面程序中的b是形参数组,a是实参数组,分别在其所在的函数中定义。,(2)实参数组与形参数组类型应当相同,如果不同,将会出错,如上面程序中的形参数组b是整型,实参数组a也是整型。,(3) 实参数组与形参数组大小可以不同也可以相同,C编译器对形参数组大小不做检查,只是将实参数组的首地址传递给形参数组。如上面程序中的float average(int b20)改为float average(int b10),并不影响程序的正常运行,最后的结果也是相同的,我们甚至可以写成float average(int b ),即只要b是数
28、组即可。,(5)形参数组与实参数组是占用同一个地址,所以是地址传递,即当形参的值发生变化时,实参的值也会跟着变化。,#include stdio.h float average(int b ,int n) int i,s; float avg; s=0; for (i=0;in;i+) s=s+bi; /将20个数相加 avg=(float)s/n; return avg; /结果交给对方 ,【例5-8】输入十个同学的成绩,要求用函数进行排序(降序)。即有二个学生A,B合力完成下面一个问题:将10个学生的成绩排序(降序)。他们的分工是这样的:A是完成主函数的编写:也就是完成10个数的输入,调用
29、B编写的函数sort( ),就得到排序完的10个数,然后进行输出。B所编写的函数sort( )的功能是完成10个数的排序,不负责数据的输入。,#include stdio.h void sort(int b); main() int a10,i; printf(请输入十个同学的成绩n); for(i=0;i10;i+) scanf(%d,void sort(int b) /*函数的功能就是选择法进行排序*/ int i,j,t; for (i=0;i9;i+) for(j=i+1;j10;j+) if(bibj) t=bi;bi=bj;bj=t; ,任务4 举一反三,【例5-9】请仿照例5-2
30、编写一个用菜单的形式分别选择1-100的奇数和,韩信点兵问题。(韩信点兵问题在例3-24),分析:1-100的奇数和,韩信点兵分别在项目三的习题、例3-24中介绍过。本题就是将它改为函数,然后在主函数中调用即可。所以本程序中有二个无参函数,即hxdb ( )、sum( )分别是韩信点兵、1-100的奇数和。,#include stdio.h void hxdb() /韩信点兵 long i; for(i=1;i+) if(i%3=2 ,void sum() /1-100的奇数和 int i,s=0; for(i=1;i=100;i=i+2) s=s+i; printf(1-100奇数的和为%d
31、n,s); ,main() int i; printf(1.韩信点兵n); printf(2.1-100的奇数和n); printf(请选择12的菜单:); scanf(%d, ,【例5-10】编写一个函数,编写x!,在主函数中调用它。,#include stdio.h int jc(int x) int i,t=1; for(i=1;i=x;i+) t=t*i; return t; main() int n; printf(请输入n的值); scanf(%d, ,【例5-11】试编程利用海伦公式求三角形面积。有三人负责完成。B负责判断能否构成三角形;C负责计算三角形的面积,而A是总负责,其职责是输入三个数,调用函数B看是否能构成三角形,若能,则调用c。,#include stdio.h #include math.h /*B所完成的函数*/ int istriangle(int a,int b,int c) /判断能否构成三角形 int t; if(a+bc ,/*C所完成的函数*/ float area(int a,int b,int c) /计算三角形面积 float s,l; l=(a+b+c)/2.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026顺德疾控面试题目及答案
- 2026思谋科技面试题及答案
- 2026思政教学部面试题及答案
- 餐厅案例分析课件
- 慈善在我们身边课件
- 纯数字制作课件
- 城市租房数据课件
- 催收员转正课件
- 参赛游戏案例课件
- 彩色油画棒课件
- 2026年国家工作人员学法用法考试题库及答案
- 测绘人员保密协议的范本6篇
- 2026国新数据有限责任公司招聘4人笔试参考题库及答案解析
- 2026年华电集团招聘考试专业知识题库
- 浙商银行笔试测评题库
- 老年糖尿病患者足部胼胝护理专家共识解读课件
- 人间共鸣四部合唱谱SATB靳
- 电焊工职业技能初级工理论试题及答案
- 中央中国船级社2025年人才招聘111人笔试历年参考题库附带答案详解
- 幼儿园餐具消毒培训
- DB23∕T 3636-2023 玉米秸秆黄贮技术规程
评论
0/150
提交评论