学生成绩管理
一、程序说明
假设某班有不超过40人(具体人数在程序运行时由键盘录入)参加本学期的期末考试,考试科目为语文(CN),数学(MT),英语(EN),科学(SC)。要求编写一个学生成绩管理系统,实现对班级学生成绩的录入、修改、查找、删除、显示、排序、统计、保存等操作的管理。
二、程序设计要求
系统主菜单应包括:
- 录入每个同学的学号、姓名、性别和各科的考试成绩;
- 成绩修改:可以根据输入的学号修改成绩;在修改之前需要用户进一步确认,确认无误后再进行操作。
- 计算每门课程的总分和平均分;
- 计算每个学生所有课程的总分和平均分;
- 按每个学生的总分进行排序;
- 按学号排出成绩表;
- 按姓名的字典顺序排出成绩表;
- 按姓名查询学生的各科成绩、总分、平均分及在班级的排名;
- 按学号查询学生的各科成绩、总分、平均分及在班级的排名;
- 对每门课程按优(90~100)、良(80~89)、中(70~79)、及格(60~69)、不及格(0~59)统计人数,及所占的百分比。
- 输出每个学生的姓名、学号、性别、各门课程的考试成绩、总分、平均分及在班级内的排名;
- 输出班级每门课程的统计数据:包括每门课程的平均分、每门课程优、良、中、及格、不及格的人数及所占百分比;
- 将每个学生的相关信息写入文件保存;
- 从文件中读出相关信息并进行处理;
- 退出系统
执行一个具体的功能之后,程序将重新显示菜单,直至选择退出系统的功能。
==main.c==👇
#include "class.h"
int main(){
Class X;
init(&X);
puts("1)load from std");
puts("2)load from file");
puts("3)save to file");
puts("4)modify the score");
puts("5)sort by sum");
puts("6)sort by number");
puts("7)sort by name");
puts("8)find by name");
puts("9)find by number");
puts("10)print all the date");
puts("11)print class date");
puts("12)exit");
int d;
char tmp[100];
while(1) {
scanf("%d",&d);
if(d == 1) load_from_std(&X);
if(d == 2) load_from_file(&X);
if(d == 3) save_to_file(&X);
if(d == 4) {scanf("%s",tmp);fun0(&X,tmp);}
if(d == 5) fun1(&X);
if(d == 6) fun2(&X);
if(d == 7) fun3(&X);
if(d == 8) {scanf("%s",tmp);fun4(&X,tmp);}
if(d == 9) {scanf("%s",tmp);fun5(&X,tmp);}
if(d == 10) fun6(&X);
if(d == 11) fun7(&X);
if(d == 12) break;
}
return 0;
};
==class.h==👇
//
// Created by limbo_null on 12/21/17.
//
#include "student.h"
#ifndef UNTITLED_CLASS_H
#define UNTITLED_CLASS_H
typedef struct {
int tot;
student stu[50];
int sum_CN,sum_MT,sum_EN,sum_SC;
int CA,CB,CC,CD,CE,MA,MB,MC,MD,ME,EA,EB,EC,ED,EE,SA,SB,SC,SD,SE;
}Class;
void init(Class *x) {
x->tot = 0;
x->sum_CN=x->sum_MT=x->sum_EN=x->sum_SC = 0;
x->CA=x->CB=x->CC=x->CD=x->CE=x->SA=x->SB=x->SC=x->SD=x->SE=x->MA=x->MB=x->MC=x->MD=x->ME=x->EA=x->EB=x->EC=x->ED=x->EE=0;
}
void sort(Class *x,int (*cmp)(student *a,student *b)) {
int i,j;
student tmp;
for(i = 1 ; i < x->tot ; ++i)
for(j = i+1 ; j <= x->tot ; ++j)
if((*cmp)(&x->stu[i],&x->stu[j])) {
tmp = x->stu[i];
x->stu[i] = x->stu[j];
x->stu[j] = tmp;
}
}
void fun0(Class *x,char *number) {
int i;
int a,b,c,d;
for(i = 1 ; i <= x->tot ; ++i)
if(!strcmp(number,x->stu[i].number)) {
puts("put the new score\nCN EN MT SC");
scanf("%d%d%d%d",&a,&b,&c,&d);
puts("Y/n");
char c = getchar();
if(c == 'n') return ;
else {
if(x->stu[i].CN >= 90) --x->CA;
else {
if(x->stu[i].CN >= 80) --x->CB;
else {
if(x->stu[i].CN >= 70) --x->CC;
else {
if(x->stu[i].CN >= 60) --x->CD;
else --x->CE;
}
}
}
if(x->stu[i].MT >= 90) --x->MA;
else {
if(x->stu[i].MT >= 80) --x->MB;
else {
if(x->stu[i].MT >= 70) --x->MC;
else {
if(x->stu[i].MT >= 60) --x->MD;
else --x->ME;
}
}
}
if(x->stu[i].EN >= 90) --x->EA;
else {
if(x->stu[i].EN >= 80) --x->EB;
else {
if(x->stu[i].EN >= 70) --x->EC;
else {
if(x->stu[i].EN >= 60) --x->ED;
else --x->EE;
}
}
}
if(x->stu[i].SC >= 90) --x->SA;
else {
if(x->stu[i].SC >= 80) --x->SB;
else {
if(x->stu[i].SC >= 70) --x->SC;
else {
if(x->stu[i].SC >= 60) --x->SD;
else --x->SE;
}
}
}
x->sum_CN += a-x->stu[i].CN;
x->sum_EN += b-x->stu[i].EN;
x->sum_MT += c-x->stu[i].MT;
x->sum_SC += d-x->stu[i].SC;
if(a >= 90) ++x->CA;
else {
if(a >= 80) ++x->CB;
else {
if(a >= 70) ++x->CC;
else {
if(a >= 60) ++x->CD;
else ++x->CE;
}
}
}
if(b >= 90) ++x->EA;
else {
if(b >= 80) ++x->EB;
else {
if(b >= 70) ++x->EC;
else {
if(b >= 60) ++x->ED;
else ++x->EE;
}
}
}
if(c >= 90) ++x->MA;
else {
if(c >= 80) ++x->MB;
else {
if(c >= 70) ++x->MC;
else {
if(c >= 60) ++x->MD;
else ++x->ME;
}
}
}
if(d >= 90) ++x->SA;
else {
if(d >= 80) ++x->SB;
else {
if(d >= 70) ++x->SC;
else {
if(d >= 60) ++x->SD;
else ++x->SE;
}
}
}
}
}
}
void fun1(Class *x) {
int i;
sort(x,&cmp_sum);
for(i = 1 ; i <= x->tot ; ++i)
show(&x->stu[i]);
}
void fun2(Class *x) {
int i;
sort(x,&cmp_num);
for(i = 1 ; i <= x->tot ; ++i)
show(&x->stu[i]);
}
void fun3(Class *x) {
int i;
sort(x,&cmp_name);
for(int i = 1 ; i <= x->tot ; ++i)
show(&x->stu[i]);
}
void fun4(Class *x,char *name) {
int i;
sort(x,&cmp_sum);
for(i = 1 ; i <= x->tot ; ++i)
if(!strcmp(name,x->stu[i].name)) {
printf("%d: ",i);show(&x->stu[i]);
break;
}
}
void fun5(Class *x,char *number) {
int i;
sort(x,&cmp_sum);
for(i = 1 ; i <= x->tot ; ++i)
if(!strcmp(number,x->stu[i].number)) {
printf("%d ",i);show(&x->stu[i]);
break;
}
}
void fun6(Class *x) {
int i;
sort(x,&cmp_sum);
for(i = 1 ; i <= x->tot ; ++i) {
printf("Rank:%d ",i);
show(&x->stu[i]);
}
}
void fun7(Class *x) {
printf("CN %lf %d %d %d %d %d %lf %lf %lf %lf %lf\n",x->sum_CN/(double)x->tot,x->CA,x->CB,x->CC,x->CD,x->CE,x->CA/(double)x->tot,x->CB/(double)x->tot,x->CC/(double)x->tot,x->CD/(double)x->tot,x->CE/(double)x->tot);
printf("MT %lf %d %d %d %d %d %lf %lf %lf %lf %lf\n",x->sum_MT/(double)x->tot,x->MA,x->MB,x->MC,x->MD,x->ME,x->MA/(double)x->tot,x->MB/(double)x->tot,x->MC/(double)x->tot,x->MD/(double)x->tot,x->ME/(double)x->tot);
printf("EN %lf %d %d %d %d %d %lf %lf %lf %lf %lf\n",x->sum_EN/(double)x->tot,x->EA,x->EB,x->EC,x->ED,x->EE,x->EA/(double)x->tot,x->EB/(double)x->tot,x->EC/(double)x->tot,x->ED/(double)x->tot,x->EE/(double)x->tot);
printf("SC %lf %d %d %d %d %d %lf %lf %lf %lf %lf\n",x->sum_SC/(double)x->tot,x->SA,x->SB,x->SC,x->SD,x->SE,x->SA/(double)x->tot,x->SB/(double)x->tot,x->SC/(double)x->tot,x->SD/(double)x->tot,x->SE/(double)x->tot);
}
void load_from_std(Class *x) {
puts("enter the number of students");
scanf("%d",&x->tot);
puts("number name sex CN MT EN SC");
int i;
for(i = 1 ; i <= x->tot ; ++i) {
get(&x->stu[i]);
x->sum_CN += x->stu[i].CN;
x->sum_MT += x->stu[i].MT;
x->sum_SC += x->stu[i].SC;
x->sum_EN += x->stu[i].EN;
x->stu[i].sum = x->stu[i].EN+x->stu[i].MT+x->stu[i].CN+x->stu[i].SC;
x->stu[i].ave = x->stu[i].sum/4.0;
if(x->stu[i].CN >= 90) ++x->CA;
else {
if(x->stu[i].CN >= 80) ++x->CB;
else {
if(x->stu[i].CN >= 70) ++x->CC;
else {
if(x->stu[i].CN >= 60) ++x->CD;
else ++x->CE;
}
}
}
if(x->stu[i].MT >= 90) ++x->MA;
else {
if(x->stu[i].MT >= 80) ++x->MB;
else {
if(x->stu[i].MT >= 70) ++x->MC;
else {
if(x->stu[i].MT >= 60) ++x->MD;
else ++x->ME;
}
}
}
if(x->stu[i].EN >= 90) ++x->EA;
else {
if(x->stu[i].EN >= 80) ++x->EB;
else {
if(x->stu[i].EN >= 70) ++x->EC;
else {
if(x->stu[i].EN >= 60) ++x->ED;
else ++x->EE;
}
}
}
if(x->stu[i].SC >= 90) ++x->SA;
else {
if(x->stu[i].SC >= 80) ++x->SB;
else {
if(x->stu[i].SC >= 70) ++x->SC;
else {
if(x->stu[i].SC >= 60) ++x->SD;
else ++x->SE;
}
}
}
}
}
void save_to_file(Class *x) {
FILE *fp = fopen("date","w");
fprintf(fp,"%d\n",x->tot);
int i;
fprintf(fp,"%d %d %d %d\n%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
x->sum_CN,x->sum_MT,x->sum_EN,x->sum_SC,
x->CA,x->CB,x->CC,x->CD,x->CE,
x->MA,x->MB,x->MC,x->MD,x->ME,
x->EA,x->EB,x->EC,x->ED,x->EE,
x->SA,x->SB,x->SC,x->SD,x->SE);
for(i = 1 ; i <= x->tot ; ++i)
fprintf(fp,"%s %s %s %d %d %d %d\n",x->stu[i].number, x->stu[i].name,x->stu[i].sex,x->stu[i].CN,x->stu[i].MT,x->stu[i].EN,x->stu[i].SC);
fclose(fp);
}
void load_from_file(Class *x) {
FILE *fp = fopen("date","r");
fscanf(fp,"%d",&x->tot);
int i;
fscanf(fp,"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n",
&x->sum_CN,&x->sum_MT,&x->sum_EN,&x->sum_SC,
&x->CA,&x->CB,&x->CC,&x->CD,&x->CE,
&x->MA,&x->MB,&x->MC,&x->MD,&x->ME,
&x->EA,&x->EB,&x->EC,&x->ED,&x->EE,
&x->SA,&x->SB,&x->SC,&x->SD,&x->SE);
for(i = 1 ; i <= x->tot ; ++i) {
fscanf(fp,"%s%s%s%d%d%d%d",x->stu[i].number,x->stu[i].name,x->stu[i].sex,&x->stu[i].CN,&x->stu[i].MT,&x->stu[i].EN,&x->stu[i].SC);
x->stu[i].sum = x->stu[i].EN+x->stu[i].MT+x->stu[i].CN+x->stu[i].SC;
x->stu[i].ave = x->stu[i].sum/4.0;
}
fclose(fp);
}
#endif //UNTITLED_CLASS_H
==student.h==👇
//
// Created by limbo_null on 12/21/17.
//
#ifndef UNTITLED_STUDENT_H
#define UNTITLED_STUDENT_H
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[100],number[100],sex[100];
int CN,MT,EN,SC;
int sum;double ave;
}student;
void get(student *a) {
scanf("%s%s%s%d%d%d%d",a->number,a->name,a->sex,&a->CN,&a->MT,&a->EN,&a->SC);
}
int cmp_CN(student *a,student *b) {
if(a->CN < b->CN) return 1;
else return 0;
}
int cmp_MT(student *a,student *b) {
if(a->MT < b->MT) return 1;
else return 0;
}
int cmp_EN(student *a,student *b) {
if(a->EN < b->EN) return 1;
else return 0;
}
int cmp_SC(student *a,student *b) {
if(a->SC < b->SC) return 1;
else return 0;
}
int cmp_num(student *a,student *b) {
if(a->number > b->number) return 1;
else return 0;
}
int cmp_name(student *a,student *b) {
if(strcmp(a->name,b->name) < 0) return 1;
else return 0;
}
int cmp_sum(student *a,student *b) {
if(a->sum < b->sum) return 1;
else return 0;
}
void show(student *x) {
printf("%s %s %s %d %d %d %d %d %d %lf\n",x->number,x->name,x->sex,x->sum,x->CN,x->MT,x->EN,x->SC,x->MT+x->EN+x->SC+x->CN,(x->MT+x->EN+x->SC+x->CN)/4.0);
}
#endif //UNTITLED_STUDENT_H
来源:CSDN
作者:无限遐想计划
链接:https://blog.csdn.net/qq_43571150/article/details/103460561