项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)

2024-08-10
| 28页
| 31人阅读
| 2人下载
普通

内容正文:

项目五 根据条件进行学生成绩汇总 项目要求 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),老师想统计以下信息:1、统计小组一门课程的总分及平均分;2、统计小组若干门课程的总分及平均分;3、输出排序后小组三门课成绩单。 程序运行结果 项目分析 本项目要完成的功能相对比较多,为了使程序的结构清晰,我们可以将此项目进行分解: A:统计小组一门课程的总分及平均分;B:统计小组若干门课程的总分及平均分;C: 输出小组排序后三门课程的成绩单;M总负责,即制作菜单并根据需要调用相应的函数。 而C这个任务又比较多,所以将它分解为:d:输入记录;e:计算每个同学的总分及平均分,f:是排序;g:输出排序后的记录。 这样的编程方式结构清晰,特别是对功能复杂的程序。 我们将A,B,C,D、e、f、g称为函数,M称为主函数。一个完整的C语言程序是由一个main()函数及若干个其他函数组成。在前面各项目中介绍的程序都只有一个主函数main(),但实用程序往往由多个函数组成。 首先,要了解函数的定义; 第二,要懂得函数的调用; 第三,函数的其他知识。 任务1 统计小组一门课程的总分及平均分 一、问题情景 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组一门课程的总分及平均分。即完成本项目中的第一个要求。 分析:主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以程序的执行过程中多次用一条线划界。所以问题就归结为制作一条线的函数及求一门课程的总分及平均分。 #include "stdio.h" void ppp() {printf("------------------------------------- "); } float avg1(int n) {int x,i; float s=0; ppp(); printf("请输入本小组的考试成绩 "); for(i=1;i<=n;i++) {scanf("%d",&x); s+=x;} return s; } main() {int k,n,km; float sum,average; char ch; ppp(); printf("\t班级成绩统计 "); ppp(); printf("1、统计小组一门课程的总分及平均分 ",n); printf("2、统计小组若干门课程的总分及平均分 "); printf("3、输出小组排序后三门课程的成绩单 "); printf("请输入1~3之间的一个数:"); scanf("%d",&k); ppp(); if (k==1) {printf("请输入统计的小组的人数n="); scanf("%d",&n); ppp(); sum=avg1(n); average=sum/n; printf("本小组的总分=%.0f\t平均分=%.1f ",sum,average); ppp();} } 无参函数 有参函数 三、相关知识 (一) 无参函数 1、无参函数的一般形式 类型说明符 函数名() {声明部分 语句 } 无参函数的调用 函数说明语句 函数名(); 函数类型 函数名() {函数体;} main() {语句; 函数名(); 语句;} 函数类型 函数名(); main() {语句; 函数名(); 语句;} 函数类型 函数名() {函数体;} 函数说明语句 【例5-1】输出十行十列的星号(要求用函数调用方式解决) 方法一(主函数在前) #include "stdio.h" void pp(); main() {int i; for(i=1;i<=10;i++) pp(); } void pp() {printf("********** ");} 方法二(主函数在后) #include "stdio.h" void pp() {printf("********** ");} main() {int i; for(i=1;i<=10;i++) pp(); } void 表示这个函数无返回值;pp是函数名 【例5-2】用菜单的形式分别选择百钱买百鸡,九九表,水仙花数 分析:百钱买百鸡,九九表,水仙花数分别在项目三的例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.水仙花数 "); printf("2.乘法九九表 "); printf("3.百钱买百鸡 "); printf("请选择1~3的菜单:"); scanf("%d",&i); if (i==1)sxhs(); //当x=1,调用求水仙花数的函数 if (i==2)jjb(); if (i==3)bqmbj(); } /*水仙花数*/ void sxhs() { int i,a,b,c; printf(" 下列数字为水仙花数: "); 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 ",i); } } /*乘法九九表*/ void jjb() {int i,j; printf(" 乘法九九表 "); for(i=1;i<=9;i++) {for(j=1;j<=i;j++) {printf("%-5d",i*j);} printf(" "); } } /*百钱买百鸡*/ void bqmbj() {int x,y,z; printf("公鸡数 母鸡数 小鸡数 "); 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 ",x,y,z);}} (二) 空函数 类型说明符 函数名() { } “小括弧”中是空的,“花括弧”中也是空的。此函数的没有任何功能,只是占一个位置而已。这样做的好处是将来扩充新的功能方便。 (三)有参函数 1、有参函数的一般形式 类型说明符 函数名(形参类型 形参名,形参类型 形参名,……形参类型 形参名) {声明部分 语句 return 语句 } “小括弧”中的形参,可以有一个,也可以有多个。函数体中的最后一个语句,通常是return语句,其作用是带回一个返回值。若没有返回值,则可以省略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(m)/(jc(n)*jc(m-n))即可。 #include "stdio.h" int jc(int k); /*函数说明语句*/ main() {int m,n,c; printf("请输入m,n的值:"); scanf("%d%d",&m,&n); c=jc(m)/(jc(n)*jc(m-n)); printf("Cmn的值为%d ",c); } /*阶乘的函数*/ int jc(int k) {int i; int t=1; for(i=1;i<=k;i++) t=t*i; return t; } #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",&m,&n); c=jc(m)/(jc(n)*jc(m-n)); printf("Cmn的值为%d ",c); } C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递。 【例5-4】调用函数时的数据传递。输入二个数x,y,求二个数中的大数。 #include "stdio.h" int max(int x,int y) {int t,max; if(x<y) {t=x;x=y;y=t;} max=x; printf("在函数中的x,y的值为x=%d,y=%d ",x,y); return max; } main() {int x,y,mm; printf("请输入x,y的值:"); scanf("%d,%d",&x,&y); printf("调用函数前x,y的值为x=%d,y=%d ",x,y); mm=max(x,y); printf("mm的值为%d ",mm); printf("调用函数后x,y的值为x=%d,y=%d ",x,y);} 尽管在主函数和max()函数中都定义了名为x,y的变量,但它们是属于不同的实体,它们仅仅是名称相同而已,就好比有二个人都叫“李小芳”,但一个是计算机班的“李小芳”,但另一个是国贸班的“李小芳”。 【例5-5】请仿照例5-2编写一个用菜单的形式分别选择1-100的奇数和,韩信点兵问题。(韩信点兵问题在例3-20) #include "stdio.h" void hxdb() //韩信点兵 {long i; 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("韩信统领的兵数有:%ld ",i); } void sum() //1-100的奇数和 {int i,s=0; for(i=1;i<=100;i=i+2) s=s+i; printf("1-100奇数的和为%d ",s); } 分析:1-100的奇数和,韩信点兵分别在项目三的实践训练、例3-24中介绍过。本题就是将它改为函数,然后在主函数中调用即可。所以本程序中有二个无参函数,即hxdb ( )、sum( )分别是韩信点兵、1-100的奇数和。 main() {int i; printf("1.韩信点兵 "); printf("2.1-100的奇数和 "); printf("请选择1~2的菜单:"); scanf("%d",&i); if (i==1)hxdb(); //当x=1,调用韩信点兵函数 if (i==2)sum(); } 【例5-6】编写一个函数: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",&n); printf("%d!=%d ",n,jc(n)); } 分析:1-100的奇数和,韩信点兵分别在项目三的实践训练、例3-24中介绍过。本题就是将它改为函数,然后在主函数中调用即可。所以本程序中有二个无参函数,即hxdb ( )、sum( )分别是韩信点兵、1-100的奇数和。 【例5-7】编写一个函数:求二个数的最大公约数,在主函数中调用它。 #include "stdio.h" int gy(int x,int y) {int i; for(i=x;i>=1;i--) if(x%i==0 && y%i==0)return i; } main() {int n,m; printf("请输入n、m的值"); scanf("%d%d",&n,&m); printf("%d与%d的最大公约数=%d ",n,m,gy(n,m)); } 【例5-8】编写一个函数:输出一排星号,在主函数中调用它,使之输出如下图形。 #include "stdio.h" void xh(int n) {int i; for(i=1;i<=n;i++) printf("*"); } main() {int m,i; printf("请输入m的值"); scanf("%d",&m); for(i=1;i<=m;i++) {xh(i); printf(" "); } } * ** *** **** ***** ****** 任务2 统计小组若干门课程的总分及平均分 一、问题情景 一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组若干门课程的总分及平均分。即完成本项目中的第二个要求。 分析:由图可分析出主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以在程序的执行过程中出现:求小组的若干门成绩的平均分及总分的函数又调用了一条线的函数ppp()。 二、具体实现 #include "stdio.h" /*输出线条函数*/ ppp() {printf("------------------------------------- "); } /*某个小组若干门课程的平均分与总分函数*/ void avgevery(int n,int km) {int x,i,j; float s,avg; for(j=1;j<=km;j++) {s=0; printf("请输入本小组第%d门考试成绩 ",j); ppp(); for(i=1;i<=n;i++) {scanf("%d",&x); s+=x;} avg=s/n; printf("第%d课程的总分=%.0f\t平均分=%.1f ",j,s,avg); ppp(); } } /*主函数*/ main() {int k,n,km; float sum,average; char ch; ppp(); printf("\t班级成绩统计 "); ppp(); printf("1、统计小组一门课程的总分及平均分 ",n); printf("2、统计小组若干门课程的总分及平均分 "); printf("3、输出小组排序后三门课程的成绩单 "); printf("请输入1~3之间的一个数:"); scanf("%d",&k); ppp(); if(k==2) {printf("请输入统计的小组的人数n="); scanf("%d",&n); ppp(); printf("请输入要统计的课程门数km="); scanf("%d",&km); ppp(); avgevery(n,km);} 三、相关知识 嵌套调用的定义:即在调用一个函数的过程中,可以再调用一个函数。 main()函数 调用a1函数 a1函数 调用a2函数 a2函数 结束 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ 执行main函数中调用a1函数时,即转去执行a1函数;在a1函数中调用a2函数时,又去执行a2函数;a2函数执行完毕返回a1函数断点继续执行;a1函数执行完毕返回main函数的断点继续执行,直至程序执行结束。 例题 【例5-9】函数的嵌套调用。求Cmn=m!/(n!(m-n)!)。要求用函数的嵌套方式完成。 分析:假设有3人参加, C负责计算jc(k), B向C要jc(k),然后计算Cmn;A负责输入m,n二个数,然后直接问B要Cmn的结果。 #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",&m,&n); c=cmn(m,n); printf("Cmn的值为%d ",c); } 这个程序就是A要调用B,而B要调用C,所以就称为函数的嵌套。 main() {int k,n,km; float sum,average; char ch; ppp(); printf("\t班级成绩统计 "); ppp(); printf("1、统计小组一门课程的总分及平均分 ",n); printf("2、统计小组若干门课程的总分及平均分 "); printf("3、输出小组排序后三门课程的成绩单 "); printf("请输入1~3之间的一个数:"); scanf("%d",&k); ppp(); if(k==2) {printf("请输入统计的小组的人数n="); scanf("%d",&n); ppp(); printf("请输入要统计的课程门数km="); scanf("%d",&km); ppp(); avgevery(n,km);} } 现在回头分析本任务中的具体实现:主函数调用avgevery()函数,而avgevery()函数又调用ppp()函数,即属于函数的嵌套。 /*输出线条函数*/ ppp() {printf("------------------------------------- "); } /*某个小组若干门课程的平均分与总分函数*/ void avgevery(int n,int km) {int x,i,j; float s,avg; for(j=1;j<=km;j++) {s=0; printf("请输入本小组第%d门考试成绩 ",j); ppp(); for(i=1;i<=n;i++) {scanf("%d",&x); s+=x;} avg=s/n; printf("第%d课程的总分=%.0f\t平均分=%.1f ",j,s,avg); ppp(); } } 函数avgevery(int n,int km)有二个参数,因为需要传递二个值,即小组的人数及课程门数; 知识扩展 函数的递归调用就是在调用一个函数的过程中,又出现直接或间接地调用该函数本身。 【例5-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" int age( int n ) {int c; if (n==1) c=10; else c=age(n-1)+2; return c;} main() {printf("第五个小朋友的年龄为%d ",age(5));} 运行结果如下: 第五个小朋友的年龄为11 n=5 age(4)+2 返回值11 第一次调用 n=4 age(3)+2 返回值9 第二次调用 n=3 age(2)+2 返回值7 第三次调用 n=2 age(1)+2 返回值5 第四次调用 第五次调用 n=1 递归结束 返回值3 ① ⑩ ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ 【例5-11】求1+2+3+……+n的和。 分析:可写成 1 (n=1) sum(n)= sum(n-1)+n (n>1) 程序如下: #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",&n); printf("%d ",sum(n));} 【例5-12】试编程利用海伦公式求三角形面积。有三人负责完成。B负责判断能否构成三角形;C负责计算三角形的面积,而A是总负责,其职责是输入三个数,调用函数B看是否能构成三角形,若能,则调用c。 #include "stdio.h" #include "math.h" /*B所完成的函数*/ int istriangle(int a,int b,int c) //判断能否构成三角形 {int t; if(a+b>c && a+c>b && b+c>a)t=1; else t=0; return t; } /*C所完成的函数*/ float area(int a,int b,int c) //计算三角形面积 {float s,l; l=(a+b+c)/2.0; s=sqrt(l*(l-a)*(l-b)*(l-c)); return s; } /*A所完成的函数*/ main() {int a,b,c; printf("请输入三角形a,b,c的值 "); scanf("%d,%d,%d",&a,&b,&c); if (istriangle(a,b,c)==1) printf("三角形的面积为%.1f ",area(a,b,c)); else printf("对不起,构不成三角形 "); } 【例5-13】】用递归求n!。 #include <stdio.h> long jc(int n) {int i; long t; if (n==1)t=1; else t=jc(n-1)*n; return t; } void main() { int n; scanf("%d",&n); printf("%d!=%ld ",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年,意大利数学家斐波那契出版了他的《算盘全书》,在书中第一次提到了著名的Fibonacci数列: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> long fab(int n) {int i; long t; if (n==1 || n==2)t=1; else t=fab(n-1)+fab(n-2); return t; } void main() { int n,i; printf("请输出要输出的项数:"); scanf("%d",&n); printf("fabonacii数列如下: "); for(i=1;i<=n;i++) printf("%-8d",fab(i)); printf(" "); } 请输出fibonacci数列的前n项,程序运行结果如所示。 任务3 输出排序后小组三门课成绩单 一、问题情景 一个班有40位学生参加了期终考试(考了三门课),请输出学生排序后的成绩单。 分析:本项目要完成的功能相对比较多,为了使程序的结构清晰,我们可以将些项目进行分解: A:完成三门课成绩的输入;B:计算每个同学的总分与平均分;C:对三门课的成绩进行排序;D:输出函数 E:总负责,调用A、B、C、D即可。 二、具体实现(假设本小组只有5个同学) #include "stdio.h" #include "string.h" #define N 5 /*输出线条函数*/ ppp() {printf("-------------------------------------------------- "); } /*输入函数A*/ void input(int score[N][3],char name[N][10]) {int i,j; for (i=0;i<N;i++) {printf("第%d个同学的姓名及三门课的成绩:",i+1); scanf("%s",name[i]); for(j=0;j<3;j++) scanf("%d",&score[i][j]);} } /*计算每个同学的总分与平均分B*/ void sumavg(int score[N][3],float sum[],float avg[]) {int i,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;} } /*排序函数C*/ void px(int score[][3],float sum[],float avg[],char name[][10]) {int i,j; float t; char nn[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; //这个同学的所有数据都要交换 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);}} /*输出函数D*/ void print(int score[ ][3],float sumr[ ],float avgr[ ],char name[ ][10]) {int i,j; ppp(); printf("输出排序后五个同学三门课的成绩: "); ppp(); printf("序号\t姓名\t课1\t课2\t课3\t总分\t平均分 "); 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(" "); } ppp(); } /*主函数*/ main() {int i,j; int score[N][3],t; char name[N][10],nn[10]; float sumr[N]={0},avgr[N]; //每个同学的总分及平均分 /*调用输入记录函数*/ input(score,name); /*调用计算总分与平均分的函数*/ sumavg(score ,sumr,avgr); /*调用排序函数*/ px(score,sumr,avgr,name); /*调用输出函数*/ print(score,sumr,avgr,name); } 新的知识点是:数组作为函数名时,是如何传递的。 (三)相关知识 使用数组名作为函数参数时,实参与形参都应使用数组名(或指针变量,见项目六)。当数组名作为函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,实参和形参的地址是相同的,即当形参的值发生变化时,实参的值也发生了变化。 【例5-15】有二个学生A,B合力完成下面一个问题:求20个学生的平均成绩。他们的分工是这样的: B完成20个数的平均值,不负责数据的输入;A完成20个数的输入,然后问B要20个数的平均值后输出。 分析:B所做的是求平均值的average( )函数:已经有二十个数了,放在数组a[20]中,现在只要将这20个数相加后除以20,然后将结果交给A就行了。 A所做的是主函数main():输入20个数,并将其放在数组中,调用B所做的函数,将输入的20个数传递给B,然后接过B的结果,并将其输出。 #include "stdio.h" /*B所完成的程序*/ float average(int b[20]) //b[20]表示从A中拿到的20个数 {int i,s; float avg; s=0; for (i=0;i<20;i++) s=s+b[i]; //将20个数相加 avg=s/20.0; return avg; //结果交给对方 } /*A所完成的程序*/ main() {int i,a[20]; //定义20个数,将存放20个数据 float avg; printf("请输入20个同学的成绩 "); for (i=0;i<20;i++) scanf("%d",&a[i]); //输入20个数据 avg=average(a); /*调用average()函数,将数组a的值传给average 并接过average的结果,将其放在avg中*/ printf("这些同学的平均分为%.1f ",avg); } 注意 (4)形参数组也可不指定大小,或者在被调函数中另设一个参数,来传递数组的大小。如上面的程序可改为: (1)数组名作为函数参数,应该在主调函数和被调函数中分别定义数组,如上面程序中的b是形参数组,a是实参数组,分别在其所在的函数中定义。 (2)实参数组与形参数组类型应当相同,如果不同,将会出错,如上面程序中的形参数组b是整型,实参数组a也是整型。 (3) 实参数组与形参数组大小可以不同也可以相同,C编译器对形参数组大小不做检查,只是将实参数组的首地址传递给形参数组。如上面程序中的float average(int b[20])改为float average(int b[10]),并不影响程序的正常运行,最后的结果也是相同的,我们甚至可以写成float average(int b[ ]),即只要b是数组即可。 (5)形参数组与实参数组是占用同一个地址,所以是地址传递,即当形参的值发生变化时,实参的值也会跟着变化。 #include "stdio.h" float average(int b[ ],int n) {int i,s; float avg; s=0; for (i=0;i<n;i++) s=s+b[i]; //将20个数相加 avg=(float)s/n; return avg; //结果交给对方 } 【例5-16】输入十个同学的成绩,要求用函数进行排序(降序)。即有二个学生A,B合力完成下面一个问题:将10个学生的成绩排序(降序)。他们的分工是这样的:A是完成主函数的编写:也就是完成10个数的输入,调用B编写的函数sort( ),就得到排序完的10个数,然后进行输出。B所编写的函数sort( )的功能是完成10个数的排序,不负责数据的输入。 #include "stdio.h" void sort(int b[]); main() {int a[10],i; printf("请输入十个同学的成绩 "); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a); //调用函数sort() printf("排序后的成绩为: "); for(i=0;i<10;i++) printf("%3d",a[i]); printf(" ");} void sort(int b[]) /*函数的功能就是选择法进行排序*/ {int i,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[j];b[j]=t;} } 【例5-17】将例5-16改成:在函数中进行 n个学生成绩从高到低排名。即有二个学生A,B合力完成下面一个问题:将n个学生的成绩进行排序(降序)。他们的分工是这样的:A是完全成主函数的编写:也就是完成n个数的输入,调用B编写的函数sort(),就得到排序后的n个数,然后进行输出。B所编写的函数sort()的功能是完成n个数的排序,不负责数据的输入。 #include "stdio.h" void sort(int b[],int n); main() {int a[100],i,n; printf("请输入参加排序的学生数n="); scanf("%d",&n); printf("请输入%d个同学的成绩 ",n); for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,n); //调用函数sort() printf("排序后的成绩为: "); for(i=0;i<n;i++) printf("%3d",a[i]); printf(" ");} void sort(int b[],int n) //函数的功能就是选择法进行排序 {int i,j,t; for (i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(b[i]<b[j]) {t=b[i];b[i]=b[j];b[j]=t;} } 【例5-18】将5-17题改成:在函数中进行 n个学生成绩排名。升序还是降序由函数中的style参数决定。 分析:在编写的函数sort( )中加入一个参数style,若style的值为'a',则排列方式为升序,若style的值为'd',则排列的方式为降序。 #include "stdio.h" void sort(int b[],int n,char style); main() {int a[100],i,n;char style; printf("请输入参加排序的学生数n="); scanf("%d",&n); printf("请输入%d个同学的成绩 ",n); for(i=0;i<n;i++) scanf("%d",&a[i]); getchar(); //吸收输入为数据的回车符 printf("请输入排序的方式,升序输入a,降序输入d "); scanf("%c",&style); sort(a,n,style); //调用函数sort() printf("排序后的成绩为: "); for(i=0;i<n;i++) printf("%3d",a[i]); printf(" ");} void sort(int b[],int n,char style) //函数的功能就是选择法进行排序 {int i,j,t; if (style=='d') {for (i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(b[i]<b[j]) {t=b[i];b[i]=b[j];b[j]=t;}} else {for (i=0;i<n-1;i++) 升序 for(j=i+1;j<n;j++) if(b[i]>b[j]) {t=b[i];b[i]=b[j];b[j]=t;}} } $$

资源预览图

项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
1
项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
2
项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
3
项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
4
项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
5
项目五 根据条件进行学生成绩汇总(课件)-《 C语言程序设计》同步教学(电子工业出版社)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。