学生成绩管理程序
实现功能目标:
能够对学生成绩按照下列进行统计,并对学生进行综合成绩的评价(公式自定)。
具体功能及要求如下:
二、 输入学生姓名学号,及五门成绩,并计算每个学生五门功课的平均分,并按平均分排列名次,若平均分相同则名次并列;结果写入文件并按格式打印在屏幕上。
三、 统计全班每门课程的平均分,并计算各分数段(60以下,60~69,70~79,80~89,90以上)的学生人数;结果写入文件,并按格式在屏幕上打印;
四、 在屏幕上打印出所有不及格学生的下列信息:学号,不及格的课程名,该不及格课程成绩;
五、文件格式要求
1.原始数据文件格式 (具体数据和项目自行编写) 学号 姓名 英语 C语言 高等数学…………..
1 张三 76 89 78 2 李四 …. …. ….
2.输出数据文件(由程序自动生成)
1) 学生综合成绩文件。
2) 学号 姓名 英语 C语言 高等数学 …………….平均成绩 名次
1 张三 76 89 78 ………….. 2 李四 …. …. ….
3)统计结果文件。
4)分数段 英语 C语言 高等数学 …………………. <60 2 … 60~69 8 … 70~79 5 … 80~89 10 …
六、结合学生的多门成绩,设定各科权重,对学生进行总成绩的评价,最后对综合成
解决方案:50分
以上是和你开玩笑,下面玩真的:
#define NUM 5
typedef struct
{
char id[20];
char name[20];
int grades[5];
double ave;
int rank;
}STU;
int cmpByAve(STU *a, STU *b)
{
return b->ave - a->ave;
}
char course_name[5][20];
FILE *f;
int i, j, k, sum;
int rank;
int count[5];
int main(void)
{
//打开原始数据文件
if (NULL == (f = fopen("原始成绩.txt", "w")))
{
fprintf(stderr, "Can not open file:原始成绩.txt\n");
return 1;
}
//录入学生信息
printf("Input the course name of the 5 courses:\n");
for (i = 0; i < 5; i++) scanf("%19s", course_name[i]);
fprintf(f, "%-20s%-20s%-20s%-20s%-20s%-20s%-20s%-20s%-6s\n", "stu_num", "name", course_name[0], course_name[1], course_name[2], course_name[3], course_name[4], "average", "rank");
STU *pStu = malloc(sizeof(STU)*NUM);
for (i = 0; i < NUM; i++)
{
printf("Input student %d:id name grade1 grade2 grade3 grade4 grade5:\n", i + 1);
scanf("%s%s%d%d%d%d%d", pStu[i].id, pStu[i].name, &pStu[i].grades[0], &pStu[i].grades[1], &pStu[i].grades[2], &pStu[i].grades[3], &pStu[i].grades[4]);
pStu[i].ave = 1.0 * (pStu[i].grades[0] + pStu[i].grades[1] + pStu[i].grades[2] + pStu[i].grades[3] + pStu[i].grades[4]) / 5;
}
//按平均成绩排名
qsort(pStu, NUM, sizeof(STU), cmpByAve);
rank = k = 1;
pStu[0].rank = 1;
for (i = 1; i < NUM; i++)
{
if (pStu[i].ave == pStu[i - 1].ave) k++;
else
{
rank += k;
k = 1;
}
pStu[i].rank = rank;
}
//写入文件
for (i = 0; i < NUM; i++)
{
fprintf(f, "%-20s%-20s%-20d%-20d%-20d%-20d%-20d%-20.2f%-4d\n",
pStu[i].id, pStu[i].name, pStu[i].grades[0], pStu[i].grades[1],
pStu[i].grades[2], pStu[i].grades[3], pStu[i].grades[4], pStu[i].ave,
pStu[i].rank);
}
fclose(f);
//f = NULL;
//打开统计结果数据文件
if (NULL == (f = fopen("统计结果.txt", "w")))
{
fprintf(stderr, "Can not open file:统计结果.txt\n");
return 1;
}
fprintf(f, "%-20s%-8s%-8s%-8s%-8s%-9s average\n", " ", "(0, 60)", "[60, 70)", "[70, 80)", "[80, 90)", "[90, 100]");
//统计成绩
for (i = 0; i < 5; i++)
{
sum = 0;
memset(count, 0, NUM * sizeof(STU));
for (j = 0; j < NUM; j++)
{
if (pStu[j].grades[i] < 60) count[0]++;
else if (pStu[j].grades[i] < 70) count[1]++;
else if (pStu[j].grades[i] < 80) count[2]++;
else if (pStu[j].grades[i] < 90) count[3]++;
else count[4]++;
sum += pStu[j].grades[i];
}
fprintf(f, "%-20s%-8d%-8d%-8d%-8d%-9d%-5.2f\n", course_name[i], count[0], count[1], count[2], count[3], count[4], 1.0 * sum / NUM);
}
fclose(f);
//释放内存
free(pStu);
return 0;
}