**科技大学信息科学技术学院软件 15 级 2015-2016 学年第一学期学习了如
下课程:软件技术导论(2 学分)、C 语言程序设计(3.5 学分)、高等数学(5 学
分)、体育(2 学分)、英语(3 学分)、中国革命史(2 学分)6 门课程,为了对
学生的考试成绩进行分析、统计、排名、学分等进行有效管理,结合学生的学号、
姓名、学年度(2015-2016 第一学期可用 15161 标识)信息,编程实现如下功能:
(1)根据考试成绩计算每位同学本学期取得的学分,例如:C 语言程序设计
3.5 学分,甲同学考试成绩(包括重考成绩)>=60,即取得该门课程的 3.5 学分,
否则该门课程学分为 0;
(2)计算上述 6 门功课的平均分,每位同学考试成绩的平均分。
(3)为进行奖学金评定,对所有学生的进行由高到低的排序,排序的规则
是学分高的在前、学分低的在后,学分相同的情况下,平均分高的在前,平均分
低的在后。
要求:
1.首先根据题目要求进行数据结构的设计,即学生包含哪些分量,这些分量
又是何种类型,长度是多少?
2.根据功能需求设计程序的结构
3.编程实现程序功能。
#include <stdio.h>
#include <stdlib.h>
#define
MAX 100
struct student
{
char
name[12];
float a[9];
char
xuehao[10],year[5];
}stu[MAX];
/*输入数据,计算每个人的总学分和平均分*/
void input( struct student s[], int x)
{
int i,n;
printf("请输入学生人数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i].a[7]=0;
printf("请输入学年度\n");
scanf("%s",&s[i].year);
printf("请输入学生学号\n");
scanf("%s",&s[i].xuehao);
printf("请输入学生姓名\n");
scanf("%s",s[i].name);
printf("请输入软件技术导论成绩\n");
scanf("%f",&s[i].a[0]);
while(s[i].a[i]<0||s[i].a[0]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[0]);
}
if(s[i].a[0]>=60)
s[i].a[7]+=2;
else
s[i].a[7]+=0;
printf("请输入C语言程序设计成绩\n");
scanf("%f",&s[i].a[1]);
while(s[i].a[1]<0||s[i].a[1]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[1]);
}
if(s[i].a[1]>=60)
s[i].a[7]+=3.5;
else
s[i].a[7]+=0;
printf("请输入高等数学成绩\n");
scanf("%f",&s[i].a[2]);
while(s[i].a[2]<0||s[i].a[2]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[2]);
}
if(s[i].a[2]>=60)
s[i].a[7]+=5;
else
s[i].a[7]+=0;
printf("请输入体育成绩\n");
scanf("%f",&s[i].a[3]);
while(s[i].a[3]<0||s[i].a[3]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[3]);
}
if(s[i].a[3]>=60)
s[i].a[7]+=2;
else
s[i].a[7]+=0;
printf("请输入英语成绩\n");
scanf("%f",&s[i].a[4]);
while(s[i].a[4]<0||s[i].a[4]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[4]);
}
if(s[i].a[4]>=60)
s[i].a[7]+=3;
else
s[i].a[7]+=0;
printf("请输入中国革命史成绩\n");
scanf("%f",&s[i].a[5]);
while(s[i].a[5]<0||s[i].a[5]>100)
{
printf("输入数据错误,请重新输入\n");
scanf("%f",&s[i].a[5]);
}
if(s[i].a[5]>=60)
s[i].a[7]+=2;
else
s[i].a[7]+=0;
}
}
void average( struct student s[], int x)
{
int i,j,n;
printf("请输入学生人数\n");
scanf("%d",&n);
/*计算每个学生的平均分*/
for(i=0;i<n;i++)
{
s[i].a[6]=0;
for(j=0;j<6;j++)
s[i].a[6]+=s[i].a[j];
s[i].a[6]/=6;
};
/*计算六门功课的平均分*/
for(j=0;j<6;j++)
{
s[n].a[j]=0;
for(i=0;i<n;i++)
s[n].a[j]+=s[i].a[j];
s[n].a[j]=s[n].a[j]/n;
}
}
void paixu( struct student s[], int x)
{
int i,j,n;
printf("请输入学生人数\n");
scanf("%d",&n);
/*对所有学生进行由高到低排序*/
for(i=0;i<n;i++)
{
s[i].a[8]=s[i].a[7];
};
for(i=0;i<n;i++)
{
if(s[i].a[8]<s[i+1].a[8])
{
strcpy(s[n+1].xuehao,s[i].xuehao);
strcpy(s[i].xuehao,s[i+1].xuehao);
strcpy(s[i+1].xuehao,s[n+1].xuehao);
strcpy(s[n+1].name,s[i].name);
strcpy(s[i].name,s[i+1].name);
strcpy(s[i+1].name,s[n+1].name);
for(j=0;j<8;j++)
{
s[n+1].a[j]=s[i].a[j];
s[i].a[j]=s[i+1].a[j];
s[i+1].a[j]=s[n+1].a[j];
};
};
if(s[i].a[8]=s[i+1].a[8])
{
if(s[i].a[6]<s[i+1].a[6])
{
strcpy(s[n+1].xuehao,s[i].xuehao);
strcpy(s[i].xuehao,s[i+1].xuehao);
strcpy(s[i+1].xuehao,s[n+1].xuehao);
strcpy(s[n+1].name,s[i].name);
strcpy(s[i].name,s[i+1].name);
strcpy(s[i+1].name,s[n+1].name);
for(j=0;j<8;j++)
{
s[n+1].a[j]=s[i].a[j];
s[i].a[j]=s[i+1].a[j];
s[i+1].a[j]=s[n+1].a[j];
}
}
}
}
}
int main ()
{
int i,n;
input(stu,MAX);
average(stu,MAX);
paixu(stu,MAX);
printf("请输入学生人数\n");
scanf("%d",&n);
/*输出每位学生考试成绩数据*/
printf("/
学 年 度 / 学 号 / 姓 名 /软件技术导论/C语言程序设计/ 高等数学 / 体 育 / 英 语 / 中国革命史 / 平均分 / 总学分
/\n");
for(i=0;i<n;i++)
printf("|%8s|%8s|%8s|%14.2f|%14.2f|%10.2f|%9.2f|%9.2f|%9.2f|%9.2f|%10.2f|\n",stu[i].year,stu[i].xuehao,stu[i].name,stu[i].a[0],stu[i].a[1],stu[i].a[2],stu[i].a[3],stu[i].a[4],stu[i].a[5],stu[i].a[6],stu[i].a[7]);
printf("/各科平均分数/软件技术导论/C语言程序设计/ 高等数学 / 体 育 / 英 语 /中国革命史/\n");
printf(" |%10.2f|%10.2f|%10.2f|%9.2f|%9.2f|%10.2f|\n",stu[n].a[0],stu[n].a[1],stu[n].a[2],stu[n].a[3],stu[n].a[4],stu[n].a[5]);
return 0;
}