内容正文:
项目五 根据条件进行学生成绩汇总
项目要求
一个班有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;}}
}
$$