一、学生成绩管理系统是什么?
系统结构图
当我们将目光聚焦于教育领域的信息化建设时,一个基于 C 语言打造的学生成绩管理系统犹如一颗璀璨的明星,闪耀着独特的光芒。它是数据与逻辑的精妙交织,以代码为画笔,在内存与算法的画布上勾勒出清晰的学生学业轮廓。从学生信息的精准录入,到成绩数据的有序存储,再到复杂的统计分析与便捷的查询检索,每一个环节都蕴含着 C 语言的强大魅力与编程者的智慧匠心。此刻,就让我们踏入这个由 C 语言构建的学生成绩管理系统的奇妙世界,去探寻其中的奥秘与精彩。
能够方便地查询和变更学生的基本数据(例如增删改查),节省大量工作时间,有效地提高学生信息管理的效率。
主程序流程图
结构体的设计
typedef struct{
char clas[10];//班级
char student_number[20]; //学号
char name[20]; //姓名
char course_number[20]; //课程号
char course_name[10]; //课程名
float score; //分数
}MESSAGE;
函数及全局变量的设计
void Welcome();
void Password();
int showsel();
void choice();
void WriteData();
void ReadData();
void scorelist();
void scorein();
void del();
void Chinese();
void coursenumber();
void Edit();
void edit();
void English();
void Math();
void Searchfor();
void Searchname();
void Searchnumber();
void sum();
void tongji();
详细设计及实现
欢迎界面
void Welcome()
{
system("title 程序设计课程设计");
system("color F4");
system("cls"); //清屏
printf("\n\n\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t| 学生成绩管理系统1.0版 |\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\n\t\t");system("date/t");//系统日期
printf("\n\t\t");system("time/t");//系统时间
}
密码登录
void Password()
{ static int a=0;
char pw[8];//密码长度为7
printf("\n请输入登录密码():");
gets(pw);
if(strcmp(pw,"123")==0)
choice();
else
{ a++;
if(a==3)
{printf("错误三次,稍后再试");
return 0;}
printf("\n密码错误,请重新输入密码\n");
Password();//三次错误结束程序
}
}
菜单界面
int showsel()
{ int sel;
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n") ;
printf("\t\t┃ 学生成绩管理系统 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 0. 退出系统 ┃\n");
printf("\t\t┃ 1. 浏览学生成绩信息 ┃\n");
printf("\t\t┃ 2. 录入学生成绩信息 ┃\n");
printf("\t\t┃ 3. 查询学生成绩信息 ┃\n");
printf("\t\t┃ 4. 编辑学生成绩信息 ┃\n");
printf("\t\t┃ 5. 学生成绩统计 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\t\t请输入要选择的功能编号:");
scanf("%d",&sel);
return sel;
}
成绩信息录入
void scorein(){
char name_[10],stu_num[10];
char course_name[10],course_number[10],clas[10];//这里的数组长度和结构体不一致,要改
float score;
int flag=0,i;
char choice[3];
do
{ scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n\n");
printf(" \t\t【温馨提醒:请不要输错课程号】\n");
printf(" \t\t【001语文】【002数学】【003英语】\n\n");//这里的编号和已有的数据不一致,要改
printf(" \t\t请输入学号:");
scanf("%s",stu_num);
if(strcmp(stu_num,"000")==0)break;//这里的break可以结束整个循环
for(i=0;i<scornum;i++){
if(strcmp(stu_num,scor[i].student_number)==0){
flag=1; break; }//如果该生已存在,则将标志位置1
}
if(flag==1 )
{ printf(" \n\t\t该学生已存在,是否需要录入该学生其他课程成绩?\n \t\t【按1继续输入;输入0退出输入】:");
scanf(" \t\t%s",choice);
if(strcmp(choice,"0")==0)break;//break可以结束整个循环
if(strcmp(choice,"1")==0)
{flag=0;}
}
if(flag==0){
scornum++;
printf("\n");
strcpy(scor[scornum-1].student_number,stu_num);
printf(" \t\t请输入班级:");fflush(stdin);gets(scor[scornum-1].clas);
printf(" \t\t请输入姓名:");fflush(stdin);gets(scor[scornum-1].name);
printf(" \t\t请输入课程号:");fflush(stdin);gets(scor[scornum-1].course_number);
printf(" \t\t请输入课程名:");fflush(stdin);gets(scor[scornum-1].course_name);
for(i=0;i<scornum;i++)//循环对比
{if(strcmp(scor[i].course_name,scor[scornum-1].course_name)==0 ) //确认课程
{
if(strcmp(scor[i].course_number,scor[scornum-1].course_number)){printf(" \t\t课程号与课程名冲突\n"); //判断输入的课程号是否与已录入的该课程的课程号相同
printf(" \t\t请重新输入课程号:");fflush(stdin);gets(scor[scornum-1].course_number);
printf(" \t\t请重新输入课程名:");fflush(stdin);gets(scor[scornum-1].course_name);
}}}
printf(" \t\t请输入分数:");scanf("%f",&scor[scornum-1].score);
printf(" \t\t录入信息成功~");
system("cls");
scorein();//调用自身,进行下个学生的输入
break;}
}while(1);
WriteData();//修改后写入文档
}
成绩信息查询
void scorelist()
{ int i;
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 学生成绩信息 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ %-10s%-10s%-10s%-10s%-15s%-6s┃\n","班级","学号","姓名","课程号","课程名","分数");
for(i=0;i<scornum;i++){
printf("\t\t┃ %-10s%-10s%-10s%-10s%-15s%-6.1f┃\n",
scor[i].clas,scor[i].student_number,scor[i].name,scor[i].course_number,scor[i].course_name,scor[i].score);}
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
成绩信息编辑
/*删除信息*/
void del()
{ char stu_name[10];
char stu_course[10];//根据姓名和课程号删除
int i,j;
while(1){
system("cls");
scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n");
printf(" \t\t请输入需要删除信息的学生姓名:");
scanf("%s",stu_name);
if(strcmp(stu_name,"000")==0)break;
printf(" \t\t请输入需要删除信息的课程名:");
scanf("%s",stu_course);
if(strcmp(stu_course,"000")==0)break;
for(i=0;i<scornum;i++)
if(strcmp(stu_name,scor[i].name)==0 &&strcmp(stu_course,scor[i].course_name)==0){
for(j=i;j<scornum-1;j++)
{ strcpy(scor[j].clas,scor[j+1].clas);
strcpy(scor[j].student_number,scor[j+1].student_number);
strcpy(scor[j].name,scor[j+1].name);
strcpy(scor[j].course_number,scor[j+1].course_number);
strcpy(scor[j].course_name,scor[j+1].course_name);
scor[j].score=scor[j+1].score;
}
printf(" \t\t删除成功!");
getch();
scornum--;
system("cls");
WriteData(); //修改后一定要写入文档
}
}
}
/*修改信息*/
void edit()
{ char stu_name[10];
char stu_course[10];//根据姓名和课程号删除
int i,j,t;
while(1){
system("cls");
scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n");
printf(" \t\t请输入需要编辑信息的学生姓名:");
scanf("%s",stu_name);
if(strcmp(stu_name,"000")==0)break;
printf(" \t\t请输入需要编辑信息的课程名:");
scanf("%s",stu_course);
if(strcmp(stu_course,"000")==0)break;
for(i=0;i<scornum;i++)
if(strcmp(stu_name,scor[i].name)==0 &&strcmp(stu_course,scor[i].course_name)==0)
{printf("\t\t请输入学生该课程的新成绩:");
scanf("%d",&t); //覆盖原来成绩
scor[i].score=t;
}
printf(" \t\t修改成功!");
getch();
WriteData();
edit(); }
}
成绩信息统计
void sum()
{ int i,y,j[100]={0},b=0,d=0;
char name[10]={0},stu_num[10]={0},clas[10]={0};
float a[100],c=0,w,e;
char back[100];
system("cls");
printf("\t\t\t考试成绩总分分析\n");
printf("\t\t%-10s%-10s%-10s%-10s%-10s%-10s\n","序号","班级","学号","姓名","总分","录入科目数");
for(y=0;y<scornum;y++)
{if(scor[y].score==-1)
continue;
a[y]=scor[y].score;
j[y]=1;
for(i=y+1;i<scornum;i++)
{if(strcmp(scor[y].student_number,scor[i].student_number)==0)
{ a[y]+=scor[i].score;
j[y]++;
scor[i].score=-1;
}}}
for(y=0;y<scornum;y++)
{if(scor[y].score==-1) continue;}
for(i=y+1;i<scornum;i++)
{
if(a[y]>a[i])
{
strcpy(scor[100].clas,scor[i].clas);
strcpy(scor[i].clas,scor[y].clas);
strcpy(scor[y].clas,scor[100].clas);
strcpy(scor[100].student_number,scor[i].student_number);
strcpy(scor[i].student_number,scor[y].student_number);
strcpy(scor[y].student_number,scor[100].student_number);
strcpy(scor[100].name,scor[i].name);
strcpy(scor[i].name,scor[y].name);
strcpy(scor[y].name,scor[100].name);
c=a[y];a[y]=a[i];a[i]=c;
d=j[y];j[y]=j[i];j[i]=d;
}}
for(y=0;y<scornum;y++)
{if(scor[y].score==-1) continue;
printf("\t\t%-10d%-10s%-10s%-10s%-10.1f%-10d\n",++b,scor[y].clas,scor[y].student_number,scor[y].name,a[y],j[y]);}
printf(" \t\t【输入000返回上一级界面】\n");
scanf("%s",back);
if(strcmp(back,"000")==0)
tongji();
}
总代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define Max 100//能够支持的最大成绩记录个数
/************************结构体定义区******************************/
typedef struct{
char clas[10];//班级
char student_number[20]; //学号
char name[20]; //姓名
char course_number[20]; //课程号
char course_name[10]; //课程名
float score; //分数
}MESSAGE;
/************************函数申明区******************************/
void Welcome();
void Password();
int showsel();
void choice();
void WriteData();
void ReadData();
void scorelist();
void scorein();
void del();
void Chinese();
void coursenumber();
void Edit();
void edit();
void English();
void Math();
void Searchfor();
void Searchname();
void Searchnumber();
void sum();
void tongji();
/************************全局变量定义区******************************/
int scornum=3;//当前已有的成绩记录个数
MESSAGE scor[Max]={{"物联","wl123","叶凡","C1002","数学",73},
{"大数据","dsj123","林木","C1001","语文",95},
{"智能","zn123","景天","C1003","英语",91}};
//写入数据
void WriteData(){
FILE *fp;//操作文件
if((fp=fopen("wengencong wangshuai.txt","w"))==NULL){
printf("Can not open the file!\n");
return;//如果打开失败,直接结束该函数
}
fwrite(&scornum,sizeof(int),1,fp);//存储学生成绩的文档
fwrite(scor,sizeof(MESSAGE),scornum,fp);
fclose(fp);
}
//读取数据
void ReadData(){
FILE *fp;
if((fp=fopen("wengencong wangshuai.txt","r"))==NULL){
printf("Can not open the file!\n");
return;}
fread(&scornum,sizeof(int),1,fp);//存储学生成绩的文档
fread(scor,sizeof(MESSAGE),scornum,fp);
fclose(fp);
}
/****欢迎界面*****/
void Welcome()
{
system("title 程序设计课程设计");
system("color F4");
system("cls"); //清屏
printf("\n\n\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t| 学生成绩管理系统1.0版 |\n");
printf("\t\t|----------------------------------------|\n");
printf("\t\t|----------------------------------------|\n");
printf("\n\t\t");system("date/t");//系统日期
printf("\n\t\t");system("time/t");//系统时间
}
/****密码登入***/
void Password()
{ static int a=0;
char pw[8];//密码长度为7
printf("\n请输入登录密码():");
gets(pw);
if(strcmp(pw,"123")==0)
choice();
else
{ a++;
if(a==3)
{printf("错误三次,稍后再试");
return 0;}
printf("\n密码错误,请重新输入密码\n");
Password();//三次错误结束程序
}
}
/* 主菜单功能选择的代码 */
int showsel()
{ int sel;
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n") ;
printf("\t\t┃ 学生成绩管理系统 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 0. 退出系统 ┃\n");
printf("\t\t┃ 1. 浏览学生成绩信息 ┃\n");
printf("\t\t┃ 2. 录入学生成绩信息 ┃\n");
printf("\t\t┃ 3. 查询学生成绩信息 ┃\n");
printf("\t\t┃ 4. 编辑学生成绩信息 ┃\n");
printf("\t\t┃ 5. 学生成绩统计 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\t\t请输入要选择的功能编号:");
scanf("%d",&sel);
return sel;
}
/* 菜单选择 */
void choice(){
int sel;
do{
ReadData(); //读取数据
system("cls");
sel=showsel(); //调用上面的菜单显示并获取用户输入的功能编号
switch(sel) {
case 0: break;
case 1: system("cls"); scorelist();getch();break;
case 2: system("cls");scorein(); break;
case 3: system("cls");Searchfor();break;
case 4: system("cls");Edit();break;
case 5: system("cls");tongji();break;
}
}while(sel);
}
/* 成绩信息浏览代码 */
void scorelist()
{ int i;
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 学生成绩信息 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ %-10s%-10s%-10s%-10s%-15s%-6s┃\n","班级","学号","姓名","课程号","课程名","分数");
for(i=0;i<scornum;i++){
printf("\t\t┃ %-10s%-10s%-10s%-10s%-15s%-6.1f┃\n",
scor[i].clas,scor[i].student_number,scor[i].name,scor[i].course_number,scor[i].course_name,scor[i].score);}
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
/* 成绩信息录入的代码 */
void scorein(){
char name_[10],stu_num[10];
char course_name[10],course_number[10],clas[10];//这里的数组长度和结构体不一致,要改
float score;
int flag=0,i;
char choice[3];
do
{ scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n\n");
printf(" \t\t【温馨提醒:请不要输错课程号】\n");
printf(" \t\t【001语文】【002数学】【003英语】\n\n");//这里的编号和已有的数据不一致,要改
printf(" \t\t请输入学号:");
scanf("%s",stu_num);
if(strcmp(stu_num,"000")==0)break;//这里的break可以结束整个循环
for(i=0;i<scornum;i++){
if(strcmp(stu_num,scor[i].student_number)==0){
flag=1; break; }//如果该生已存在,则将标志位置1
}
if(flag==1 )
{ printf(" \n\t\t该学生已存在,是否需要录入该学生其他课程成绩?\n \t\t【按1继续输入;输入0退出输入】:");
scanf(" \t\t%s",choice);
if(strcmp(choice,"0")==0)break;//break可以结束整个循环
if(strcmp(choice,"1")==0)
{flag=0;}
}
if(flag==0){
scornum++;
printf("\n");
strcpy(scor[scornum-1].student_number,stu_num);
printf(" \t\t请输入班级:");fflush(stdin);gets(scor[scornum-1].clas);
printf(" \t\t请输入姓名:");fflush(stdin);gets(scor[scornum-1].name);
printf(" \t\t请输入课程号:");fflush(stdin);gets(scor[scornum-1].course_number);
printf(" \t\t请输入课程名:");fflush(stdin);gets(scor[scornum-1].course_name);
for(i=0;i<scornum;i++)//循环对比
{if(strcmp(scor[i].course_name,scor[scornum-1].course_name)==0 ) //确认课程
{
if(strcmp(scor[i].course_number,scor[scornum-1].course_number)){printf(" \t\t课程号与课程名冲突\n"); //判断输入的课程号是否与已录入的该课程的课程号相同
printf(" \t\t请重新输入课程号:");fflush(stdin);gets(scor[scornum-1].course_number);
printf(" \t\t请重新输入课程名:");fflush(stdin);gets(scor[scornum-1].course_name);
}}}
printf(" \t\t请输入分数:");scanf("%f",&scor[scornum-1].score);
printf(" \t\t录入信息成功~");
system("cls");
scorein();//调用自身,进行下个学生的输入
break;}
}while(1);
WriteData();//修改后写入文档
}
/*二级查询界面菜单*/
void Searchfor()
{
system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n") ;
printf("\t\t┃ 学生成绩查询功能 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 0. 退出系统 ┃\n");
printf("\t\t┃ 1. 通过学生学号查询 ┃\n");
printf("\t\t┃ 2. 通过学生姓名查询 ┃\n");
printf("\t\t┃ 3. 通过课程号查询 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\t\t请输入要选择的功能编号:");
int optfind = 0;
scanf("%d", &optfind);
switch (optfind)
{
case 1:
Searchnumber();
break;
case 2:
Searchname();
break;
case 3:
coursenumber();
break;
default:
break;
}}
//通过学生学号查询
void Searchnumber()
{ char t[100];
int j,p,f;
do {
system("cls"); //清屏
printf("请输入要查询的学生学号:\n");
scanf("%s",t);
p=0;
for(j=0;j<scornum;j++)
{if(strcmp(scor[j].student_number,t)==0) //对比和查询输出同学号学生
{p=1;
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[j].clas,scor[j].student_number,scor[j].name,scor[j].course_number,scor[j].course_name,scor[j].score);
break;}
}
if(p==0)
printf("查无此人\n");
printf("结束查询返回上一级界面输入0\n");
scanf("%d",&f);
}while(f);
Searchfor(); //返回上一级菜单
}
/*根据姓名查询*/
void Searchname()
{ char t[100];
int j,p,f;
do {
system("cls");
printf("请输入要查询的学生姓名:\n"); //对比和查询输出与输入一样的学生
scanf("%s",t);
p=0;
for(j=0;j<scornum;j++)
{if(strcmp(scor[j].name,t)==0)
{p=1;
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[j].clas,scor[j].student_number,scor[j].name,scor[j].course_number,scor[j].course_name,scor[j].score);
break;}
}
if(p==0)
printf("查无此人\n");
printf("结束查询返回上一级界面输入0\n");
scanf("%d",&f);
}while(f);
Searchfor();
}
/*根据课程号查询*/
void coursenumber()
{ char t[100];
int j,p,f,i=0;
do {
system("cls");
printf("请输入要查询的课程号:\n");//对比和查询输出与输入一样的课程号
scanf("%s",t);
p=0;
for(j=0;j<scornum;j++)
{if(strcmp(scor[j].course_number,t)==0)
{p=1;i++;
if(i==1)
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[j].clas,scor[j].student_number,scor[j].name,scor[j].course_number,scor[j].course_name,scor[j].score);
}
}
if(p==0)
printf("查无此课程\n");
printf("结束查询返回上一级界面输入0\n");
scanf("%d",&f);
}while(f);
Searchfor();
}
/*二级编辑菜单*/
void Edit()
{ system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n") ;
printf("\t\t┃ 学生成绩编辑界面 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 0. 退出界面 ┃\n");
printf("\t\t┃ 1. 删除学生成绩 ┃\n");
printf("\t\t┃ 2. 修改学生成绩 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\t\t请输入要选择的功能编号:");
int optfind = 0;
scanf("%d", &optfind);
switch (optfind)
{
case 1:
del();
break;
case 2:
edit();
break;
default:
break;
}}
/*删除信息*/
void del()
{ char stu_name[10];
char stu_course[10];//根据姓名和课程号删除
int i,j;
while(1){
system("cls");
scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n");
printf(" \t\t请输入需要删除信息的学生姓名:");
scanf("%s",stu_name);
if(strcmp(stu_name,"000")==0)break;
printf(" \t\t请输入需要删除信息的课程名:");
scanf("%s",stu_course);
if(strcmp(stu_course,"000")==0)break;
for(i=0;i<scornum;i++)
if(strcmp(stu_name,scor[i].name)==0 &&strcmp(stu_course,scor[i].course_name)==0){
for(j=i;j<scornum-1;j++)
{ strcpy(scor[j].clas,scor[j+1].clas);
strcpy(scor[j].student_number,scor[j+1].student_number);
strcpy(scor[j].name,scor[j+1].name);
strcpy(scor[j].course_number,scor[j+1].course_number);
strcpy(scor[j].course_name,scor[j+1].course_name);
scor[j].score=scor[j+1].score;
}
printf(" \t\t删除成功!");
getch();
scornum--;
system("cls");
WriteData(); //修改后一定要写入文档
}
}
}
/*修改信息*/
void edit()
{ char stu_name[10];
char stu_course[10];//根据姓名和课程号删除
int i,j,t;
while(1){
system("cls");
scorelist();//首先展示已有的成绩
printf(" \t\t【输入000返回主界面】\n");
printf(" \t\t请输入需要编辑信息的学生姓名:");
scanf("%s",stu_name);
if(strcmp(stu_name,"000")==0)break;
printf(" \t\t请输入需要编辑信息的课程名:");
scanf("%s",stu_course);
if(strcmp(stu_course,"000")==0)break;
for(i=0;i<scornum;i++)
if(strcmp(stu_name,scor[i].name)==0 &&strcmp(stu_course,scor[i].course_name)==0)
{printf("\t\t请输入学生该课程的新成绩:");
scanf("%d",&t); //覆盖原来成绩
scor[i].score=t;
}
printf(" \t\t修改成功!");
getch();
WriteData();
edit(); }
}
/*二级统计菜单*/
void tongji()
{ system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n") ;
printf("\t\t┃ 学生成绩统计界面 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 0. 退出界面 ┃\n");
printf("\t\t┃ 1. 数学统计结果 ┃\n");
printf("\t\t┃ 2. 语文统计结果 ┃\n");
printf("\t\t┃ 3. 英语统计结果 ┃\n");
printf("\t\t┃ 4. 总分统计结果 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\t\t请输入要选择的功能编号:");
int optfind = 0;
scanf("%d", &optfind);
switch (optfind)
{
case 1:
Math();
break;
case 2:
Chinese();
break;
case 3:
English();
break;
case 4:
sum();
break;
default:
break;
}}
/*数学统计结果*/
void Math(){
float avg=0,sum=0,max=0,min=100,tongguo;
int i,j=0,Pass=0,y,unPass=0;
char back[100];
system("cls");
for(i=0;i<scornum;i++)
{if(strcmp(scor[i].course_number,"C1002")==0)
{ j++;
if(scor[i].score>=60){Pass++;}
else {unPass++;}
if(max<=scor[i].score)
{max=scor[i].score;}
if(min>=scor[i].score)
{min=scor[i].score;}
sum=sum+scor[i].score;
}}avg=sum/j;
tongguo=Pass*1.0/j*100;
printf("数学考试成绩分析\t\t\n");
printf("通过数学考试人数:\t%d\n",Pass);
printf("没有通过数学考试人数:\t%d\n",unPass);
printf("数学考试合格率:\t%.2f%%\n",tongguo);
printf("数学平均分:\t%0.2f\n",avg);
printf("数学最高分:\t%0.2f\n", max);
printf("数学最低分:\t%0.2f\n\n", min);
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
for(y=0;y<scornum;y++)
{ if(strcmp(scor[y].course_number,"C1002")==0)
{ printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[y].clas,scor[y].student_number,scor[y].name,scor[y].course_number,scor[y].course_name,scor[y].score);
}
}
printf(" \t\t【输入000返回上一级界面】\n");
scanf("%s",back);
if(strcmp(back,"000")==0)
tongji();
}
/*语文统计结果*/
void Chinese(){
float avg=0,sum=0,max=0,min=100,tongguo;
int i,j=0,Pass=0,y,unPass=0;
char back[100];
system("cls");
for(i=0;i<scornum;i++)
{if(strcmp(scor[i].course_number,"C1001")==0)
{ j++;
if(scor[i].score>=60){Pass++;}
else {unPass++;}
if(max<=scor[i].score)
{max=scor[i].score;}
if(min>=scor[i].score)
{min=scor[i].score;}
sum=sum+scor[i].score;
}}avg=sum/j;
tongguo=Pass*1.0/j*100;
printf("语文考试成绩分析\n");
printf("通过语文考试人数:\t%d\n",Pass);
printf("没有通过语文考试人数:\t%d\n",unPass);
printf("语文考试合格率:\t%.2f%%\n",tongguo);
printf("语文平均分:\t%0.2f\n",avg);
printf("语文最高分:\t%0.2f\n", max);
printf("语文最低分:\t%0.2f\n\n", min);
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
for(y=0;y<scornum;y++)
{ if(strcmp(scor[y].course_number,"C1001")==0)
{ printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[y].clas,scor[y].student_number,scor[y].name,scor[y].course_number,scor[y].course_name,scor[y].score);
}
}
printf(" \t\t【输入000返回上一级界面】\n");
scanf("%s",back);
if(strcmp(back,"000")==0)
tongji();
}
/*英语统计结果*/
void English(){
float avg=0,sum=0,max=0,min=100,tongguo;
int i,j=0,Pass=0,y,unPass=0;
char back[100];
system("cls");
for(i=0;i<scornum;i++)
{if(strcmp(scor[i].course_number,"C1003")==0)
{ j++;
if(scor[i].score>=60){Pass++;}
else {unPass++;}
if(max<=scor[i].score)
{max=scor[i].score;}
if(min>=scor[i].score)
{min=scor[i].score;}
sum=sum+scor[i].score;
}}avg=sum/j;
tongguo=Pass*1.0/j*100;
printf("英语考试成绩分析\n");
printf("通过英语考试人数:\t%d\n",Pass);
printf("没有通过英语考试人数:\t%d\n",unPass);
printf("英语考试合格率:\t%.2f%%\n",tongguo);
printf("英语平均分:\t%0.2f\n",avg);
printf("英语最高分:\t%0.2f\n", max);
printf("英语最低分:\t%0.2f\n\n", min);
printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6s\n","班级","学号","姓名","课程号","课程名","分数");
for(y=0;y<scornum;y++)
{ if(strcmp(scor[y].course_number,"C1003")==0)
{ printf("\t\t%-10s%-10s%-10s%-10s%-15s%-6.1f\n",
scor[y].clas,scor[y].student_number,scor[y].name,scor[y].course_number,scor[y].course_name,scor[y].score);
}
}
printf(" \t\t【输入000返回上一级界面】\n");
scanf("%s",back);
if(strcmp(back,"000")==0)
tongji();
}
/*总分统计结果*/
void sum()
{ int i,y,j[100]={0},b=0,d=0;
char name[10]={0},stu_num[10]={0},clas[10]={0};
float a[100],c=0,w,e;
char back[100];
system("cls");
printf("\t\t\t考试成绩总分分析\n");
printf("\t\t%-10s%-10s%-10s%-10s%-10s%-10s\n","序号","班级","学号","姓名","总分","录入科目数");
for(y=0;y<scornum;y++)
{if(scor[y].score==-1)
continue;
a[y]=scor[y].score;
j[y]=1;
for(i=y+1;i<scornum;i++)
{if(strcmp(scor[y].student_number,scor[i].student_number)==0)
{ a[y]+=scor[i].score;
j[y]++;
scor[i].score=-1;
}}}
for(y=0;y<scornum;y++)
{if(scor[y].score==-1) continue;}
for(i=y+1;i<scornum;i++)
{
if(a[y]>a[i])
{
strcpy(scor[100].clas,scor[i].clas);
strcpy(scor[i].clas,scor[y].clas);
strcpy(scor[y].clas,scor[100].clas);
strcpy(scor[100].student_number,scor[i].student_number);
strcpy(scor[i].student_number,scor[y].student_number);
strcpy(scor[y].student_number,scor[100].student_number);
strcpy(scor[100].name,scor[i].name);
strcpy(scor[i].name,scor[y].name);
strcpy(scor[y].name,scor[100].name);
c=a[y];a[y]=a[i];a[i]=c;
d=j[y];j[y]=j[i];j[i]=d;
}}
for(y=0;y<scornum;y++)
{if(scor[y].score==-1) continue;
printf("\t\t%-10d%-10s%-10s%-10s%-10.1f%-10d\n",++b,scor[y].clas,scor[y].student_number,scor[y].name,a[y],j[y]);}
printf(" \t\t【输入000返回上一级界面】\n");
scanf("%s",back);
if(strcmp(back,"000")==0)
tongji();
}
int main()
{
Welcome();
Password();
WriteData();// 该指令用于自动生成文档,执行一次后,就可以注释掉,如果不注释,则每次运行后都会覆盖掉修改的数据
return 0;
}