C语言问题

从键盘输入一个班(全班最多不超过30人)学生的学号和三门课的成绩,当输入的学号为负值或人数超过30时,输入结束。编程计算每个学生的总分和平均分;计算每门课的总分和平均分,并打印学生成绩表(按照总分由高到低的顺序)。成绩表包括名次、学号、各门课的成绩、总分及平均分。打印序号、每门课的总分和平均分。要求:
输入的学生学号及各门课的分数请在Input()函数实现;计算每个学生的总分和平均分请在Total1()函数实现;计算每门课的总分和平均分请在Total2()函数实现;对每个学生按照总分由高到低排序请在Total3()函数实现;打印学生成绩表及每门课的总分和平均分请在Print()函数实现。
Input函数原型如下: int Input(long num[], int score[][3]);
参数说明:数组 num 存放学生的学号,数组 score 存放学生的分数
返回值:返回班级的实际人数
5. Total1函数原型如下 void Total1(int score[][3], float sum[],float aver[],int n);
参数说明:数组 score存放学生的分数,数组 sum存放每个学生的总分,数组aver存放每个学生的平均分,n班级实际人数返回值:无
6. Total2函数原型如下: void Total2(int score[][3],float sum[],float aver[],int n);
参数说明:数组 score存放学生的分数,数组 sum存放每门课的总分,数组aver存放每门课的平均分,n班级实际人数 返回值:无
5.Total3函数原型如下: void Total3(long num[],int score[][3],float sum[],float aver[],int n);
参数说明:数组 num 存放学生的学号,数组 score存放学生的分数,数组 sum存放每个学生的总分,数组aver存放每个学生的平均分,n班级实际人数返回值:无
6.Print函数原型如下: void Print(long num[],int score[][3],float sum1[],float aver1[],float sum2[],float aver2[],int n);
输入要求: 按行输入,数据之间用空格分隔,详见输入样例
输出要求:"Pos\tNumber\tGrad1\tGrad2\tGrad3\tSum1\tAver1\n",
"No\tSum2\tAver2\n",详见输出样例
Input sample1:
19001 90 89 78
19002 76 90 98
19003 88 77 66
19004 56 65 44
19005 98 90 97
-1 8 9 0
Output sample1:
Pos Number Grad1 Grad2 Grad3 Sum1 Aver1
1 19005 98 90 97 285 95
2 19002 76 90 98 264 88
3 19001 90 89 78 257 86
4 19003 88 77 66 231 77
5 19004 56 65 44 165 55
No Sum2 Aver2
1 408 82
2 411 82
3 383 77

#include <stdio.h>

//输入的学生学号及各门课的分数请在Input()函数实现;
int Input(long num[], int score[][3])
{
int n,r;
printf("请输入学生的学号和三门课的成绩:\n");
for (n=0; n<30; ++n)
{
r=scanf("%ld", &num[n]);
if (r!=1) break;
if (num[n]<0) break;
r=scanf("%d%d%d",score[n]+0,score[n]+1,score[n]+2);
if (r!=3) break;
}
return n;
}

//计算每个学生的总分和平均分请在Total1()函数实现;
void Total1(int score[][3], float sum[],float aver[],int n)
{
int i,j,s;
for (i=0; i<n; ++i)
{
for (s=j=0; j<3; ++j) s+=score[i][j];  
sum[i]=(float)s;
aver[i]=((float)s)/3;
}
}

//计算每门课的总分和平均分请在Total2()函数实现
void Total2(int score[][3],float sum[],float aver[],int n)
{
int i,j,s;
for (j=0; j<3; ++j)
{
for (s=i=0; i<n; ++i) s+=score[i][j];  
sum[j]=(float)s;
aver[j]=((float)s)/n;
}
}

//对每个学生按照总分由高到低排序请在Total3()函数实现
void Total3(long num[],int score[][3],float sum[],float aver[],int n)
{
int i,j,k,N;
long NUM; int SCORE[3]; float SUM; float AVER;
for (i=0,N=n-1; i<N; ++i)
for (j=i+1; j<n; ++j)
{
if (sum[j]>sum[i])
{
NUM=num[i]; 
for (k=0; k<3; ++k) SCORE[k]=score[i][k]; 
SUM=sum[i]; 
AVER=aver[i];

num[i]=num[j]; 
for (k=0; k<3; ++k) score[i][k]=score[j][k]; 
sum[i]=sum[j]; 
aver[i]=aver[j];

num[j]=NUM; 
for (k=0; k<3; ++k) score[j][k]=SCORE[k]; 
sum[j]=SUM; 
aver[j]=AVER;
}
}
}

//打印学生成绩表及每门课的总分和平均分请在Print()函数实现。
void Print(long num[],int score[][3],float sum1[],
   float aver1[],float sum2[],float aver2[],int n)
{
int i,j;
printf("Pos\tNumber\tGrad1\tGrad2\tGrad3\tSum1\tAver1\n");
for (i=0; i<n; ++i)
{
printf("%d\t%ld\t",i+1, num[i]);
for (j=0; j<3; ++j) printf("%d\t", score[i][j]);
printf("%.0f\t%.1f\n",sum1[i], aver1[i]);
}

printf("No\tSum2\tAver2\n");
for (i=0; i<3; ++i)
printf("%d\t%.0f\t%.2f\n",i+1, sum2[i], aver2[i]);
}

#define N 30
int main()
{
long num[N];
int n;
int score[N][3];
float sum1[N];
float aver1[N];
float aver2[3];
float sum2[3];

n=Input(num, score);
if (n<=0) return -1;
Total1(score, sum1, aver1, n);
Total2(score, sum2, aver2, n);
Total3(num, score, sum1, aver1, n);
Print(num, score, sum1, aver1, sum2, aver2, n);
return 0;
}

温馨提示:答案为网友推荐,仅供参考
相似回答