C语言:输入10人,语 数 外 分数 求平均分 总分 并排列(从小大大) 输出

sorry,但输出的成绩单要有姓名,学号

对程序稍加修改,添加了有关姓名和学号的输入部分,并已通过运行验证,代码如下仅供参考:
说明:方便验证减少不必要的重复输入,这里我用了随机数产生成绩,姓名和学号用了默认值,你可以按注释的提示稍加修改,即可以进行人工的输入
#include "stdio.h"
#include "string.h"
#define a 11
#define b 5
#include "time.h"//这两个头文件的引入是为了随机数和随机数种子
#include "stdlib.h"
void av(float student[a][b]){//求每个人总成绩并保存入数组
int i,j;
for(i=0;i<a-1;i++){
student[i][b-1]=0;
for(j=1;j<b-1;j++)
student[i][b-1]+=student[i][j];
}
}
void sum(float student[a][b]){//求所有人某科总成绩并保存
int i,j;
for(j=1;j<b;j++)
student[a-1][j]=0;
for(i=0;i<a-1;i++){
student[a-1][3]+=student[i][3];
student[a-1][1]+=student[i][1];
student[a-1][2]+=student[i][2];
student[a-1][4]+=student[i][4];
}
}
void input(float student[a][b]){//输入
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<a-1;i++){
student[i][0]=i+1;
/*printf("依次输入第%d个人语、数、外每科成绩:",i+1);*/
for(j=1;j<b-1;j++)
/*scanf("%d",&student[i][j]);*/
student[i][j]=rand()%50+51;//此处为了方便检验程序,用了随机数来代替了手工的输入,想输入只需注释此句,将/**/注释的两句取消注释即可。如果是手工的输入,最好是一个人的不同科成绩用空格分开,输入完一个人的三门成绩后,敲回车继续下一个人的成绩
}
}

void sort(float student[a][b],char name[10][20],char number[10][20]){//最简单的选择排序
int i,j,min;
float num;
char str[20];
for(i=0;i<a-2;i++){
min=i;
for(j=i+1;j<a-1;j++)//每次找出一个最小的值放到合适的位置
if(student[min][b-1]>student[j][b-1])
min=j;
for(j=0;j<b;j++){
num=student[i][j];
student[i][j]=student[min][j];
student[min][j]=num;
}
strcpy(str,name[i]);
strcpy(name[i],name[min]);
strcpy(name[min],str);
strcpy(str,number[i]);
strcpy(number[i],number[min]);
strcpy(number[min],str);
}
}
void myprint(float student[a][b],char name[10][20],char number[10][20]){//输出结果
printf(" 输入时的序号 学号 姓名 语文 数学 外语 三科总成绩 平均成绩\n\n");//此处的空格或许会因为百度网页的原因而与我的不符,从而使得显示的不是很整齐自己稍加修改即可
for(int i=0;i<a-1;i++){
printf("%3.0f",student[i][0]);
printf("%12s",number[i]);
printf("%8s",name[i]);
for(int j=1;j<b;j++)

printf("%10.1f",student[i][j]);
printf("%15.2f",student[i][b-1]/(float)(b-2));
printf("\n");
}
printf("各平均分对应为:%5.2f%11.2f%10.2f%10.2f\n\n",student[a-1][1]/(float)(a-1),student[a-1][2]/(float)(a-1),student[a-1][3]/(float)(a-1),student[a-1][4]/(float)(a-1));

}
void main(){
char name[10][20]={"张三","李四","王五","赵六","刘七","马八","大毛","二毛","三毛","小毛"};
char number[10][20]={"20070201","20070202","20070203","20070204","20070205","20070206","20070207","20070208","20070209","20070210"};
//int i;
float student[a][b];
/*printf("请输入学生的学号和姓名:\n");/为了验证方便,所以使用了默认值。如果要自己输入可以去掉int i行和此行到for结束部分注释内容即可输入学生的姓名和学号
for(i=0;i<10;i++){
scanf("%s",number[i]);
scanf("%s",name[i]);
printf("\n");
}*/

input(student);
av(student);
sum(student);
printf("\n\n输入的各同学的成绩如下所示:\n\n");
myprint(student,name,number);
sort(student,name,number);
printf("\n\n按升序排序后各同学的成绩如下所示:\n\n");
myprint(student,name,number);
}

因为程序很简单,所以只是进行了简单的注释,想来你一定可以很容易就读懂的,呵呵,祝你的问题早日解决!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-16
#include <stdio.h>
int main()
{
struct score
{
int chi;
int mat;
int eng;
double avg;
} stu[10],tem;
int i,j;
for(i=0;i<=9;i++)
{
printf("输入第%d个学生的成绩(用空格顿开,用回车结束)\n",i);
scanf("%d%d%d",&stu[i].chi,&stu[i].mat,&stu[i].eng);
}
for(i=0;i<=9;i++)
stu[i].avg=(stu[i].chi+stu[i].mat+stu[i].eng)/3.0;
for(i=0;i<=8;i++)
for(j=0;j<=8-i;j++)
if(stu[j].avg<stu[j+1].avg)
{
tem=stu[j];
stu[j]=stu[j+1];
stu[j+1]=tem;
}
printf("名次 语文 数学 英语 平均分\n");
for(i=0;i<=9;i++)
printf("%-10d%-10d%-10d%-10d%-10.3f\n",i+1,stu[i].chi,stu[i].mat,stu[i].eng,stu[i].avg);
return 0;

}
相似回答