您的位置:首页 > 其它

进阶项目8.2学生成绩统计

2016-07-31 22:29 417 查看
任务和代码:(5)score.txt中是一些同学的学号、姓名、C++、高数、英语成绩,利用前面定义的结构体数组,读取文件score.txt中的数据,完成下面的应用:

从文件中读出数据,存放到结构体数组中;

求出每名同学的总分(可以在读入过程中“顺便”计算);

输出结构体数组中所有同学的记录;

按总分排序(降序);

输出排序后的成绩单;
有30名同学可以获得奖学金,规则是总分高者优先,有挂科不能得奖学金。请输出可以得奖学金同学的名单。若符合得将的最后一名同学有重复(例如总分全为S),则总分为S的同学全得奖。

/*
文件名:main.c
作者:小风景
完成日期:2016.7.31
问题描述:(5)score.txt中是一些同学的学号、姓名、C++、高数、英语成绩,利用前面定义的结构体数组,读取文件score.txt中的数据,完成下面的应用:

从文件中读出数据,存放到结构体数组中;
求出每名同学的总分(可以在读入过程中“顺便”计算);
输出结构体数组中所有同学的记录;
按总分排序(降序);
输出排序后的成绩单;
有30名同学可以获得奖学金,规则是总分高者优先,有挂科不能得奖学金。请输出可以得奖学金同学的名单。若符合得将的最后一名同学有重复(例如总分全为S),则总分为S的同学全得奖。
程序输出:
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Student
{
char num[13];
char name[10];
int c;
int math;
int english;
int grade;
double average;
}StudentInfo;

int number = 0;

int GetStudentScore(StudentInfo *student,char *filename);
void output(StudentInfo *student);
int Sort(StudentInfo *student);
int ExcellentStudent(StudentInfo *student);
int Test(StudentInfo *student);

int main()
{
int result = 0;
char file[10] = "score.txt";
StudentInfo student[1024] = {0}; //定义学生结构体变量存放学生的信息
StudentInfo *p = student; //定义结构指针指向结构体

printf("从%s中读取学生的信息...\n",file);
result = GetStudentScore(p,file);
if(result != 0)
{
printf("get studeng info in error!\n");
exit(1);
}

printf("输出所有同学的记录:\n");
output(p);

printf("按总分排序后所有同学的成绩单:\n");
result = Sort(p);
if(result != 0)
{
printf("sort studeng info in error!\n");
exit(1);
}

printf("获得奖学金的同学名单如下:\n");
result = ExcellentStudent(p);
if(result != 0)
{
printf("output excellent studeng info in error!\n");
exit(1);
}

return result;
}

/*
函数功能:从传入文件中读取信息放到传入的结构体数组中
返回值:成功返回0。
*/
int GetStudentScore(StudentInfo *student,char *filename)
{
FILE *fp;

if((fp = fopen(filename,"r")) == NULL)
{
printf("open %s is error",filename);
return -1;
}

while(!feof(fp))
{
fscanf(fp,"%s %s %d %d %d",student->num,student->name,&student->c,&student->math,&student->english);
student->grade = student->c + student->math + student->english;
student->average = student->grade / 3.0;
student++;
number ++;
}

fclose(fp);
return 0;
}

/*
函数功能:输出结构体的学生信息
返回值:空。
*/
void output(StudentInfo *student)
{
int i = 0;

for(i = 0;i < number;i++)
{
printf("%8s\t%10s\t%4d\t%4d\t%4d\t%4d\n",student->num,student->name,student->c,
student->math,student->english,student->grade);
student++;
}
printf("\n\n");
return;
}

/*
函数功能:输出排序后的学生信息
返回值:成功返回0。
*/
int Sort(StudentInfo *student)
{
int i = 0;
int j = 0;
int temp = 0;

for(i = 0;i < number - 1;i++)
{
for(j = 0;j < number - i - 1;j++)
{
if((student+j)->grade < (student+j + 1)->grade)
{
temp = (student+j + 1)->grade;
(student+j + 1)->grade = (student+j)->grade;
(student+j)->grade = temp;
}
}
}

output(student);
return 0;
}

/*
函数功能:输出获奖学生的信息
返回值:成功返回0。
*/
int ExcellentStudent(StudentInfo *student)
{
int laststudent = 0;
int i = 0;
int num = 0;

for(i = 0;i < number;i++)
{
//判断输出是否满三十人,当输出满三十人后,后面同学的分数如果和第三十人相同,则也可获奖,输出后面童鞋的信息
if(num == 30)
{
if((student+i)->grade == laststudent)
{
printf("%8s\t%10s\t%4d\t%4d\t%4d\t%4d\n",(student+i)->num,(student+i)->name,(student+i)->c,
(student+i)->math,(student+i)->english,(student+i)->grade);
continue;
}
else
{
break;
}
}
//判断同学是否满足获奖的资格
if(Test(student+i) == 0)
{
num++;
printf("%8s\t%10s\t%4d\t%4d\t%4d\t%4d\n",(student+i)->num,(student+i)->name,(student+i)->c,
(student+i)->math,(student+i)->english,(student+i)->grade);
laststudent = (student+i)->grade;
}
}

return 0;
}

/*
函数功能:成册输入的学生信息师傅满足获奖条件
返回值:空。
*/
int Test(StudentInfo *student)
{
if((student->c < 60) || (student->math < 60) || (student->english < 60))
{
return -1;
}

return 0;
}


程序运行结果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: