c语言课程设计 学生成绩管理系统
学生成绩管理系统要求:
1、系统功能以菜单方式工作;
2、数据的输入;
3、数据的插入;
4、数据的输出;
5、数据的删除;
6、数据的查找,通常以两种方式进行查找,如姓名、学号;
目录
1.结构体和全局变量的定义
2.主菜单函数
3.增添信息函数
4.判断函数
5.按学号查询函数
6.按姓名查询函数
7.整合函数
8.删除函数
9.修改函数
10.输出全部信息函数
11.按总成绩排名函数
12.写入函数
13.读入函数
14.主函数
15.源代码
系统简介
系统主要分为增、删、改、查四个基本模块,还具备文件的读写功能,自动检测存档后,进入学生成绩管理系统。
代码如下:
1.结构体和全局变量的定义
/*结构体*/
struct student
{long id;//学号char name[10];//姓名int age;//年龄float Chinese;//语文成绩float English;//英语成绩float Math;//数学成绩float sum;//总成绩
};/*全局变量*/
struct student s[100];//学生信息数组
int count;//统计入库的学生数量
2.主菜单函数
void Menu() //主菜单
{printf("\n 主菜单\n\n\n");printf(" 1.增添信息 ");printf(" 2.删除信息\n\n");printf(" 3.修改信息 ");printf(" 4.查询信息\n\n");printf(" 5.保存并退出系统\n\n");
}
3.增添信息函数
增添信息时有以下几点设计:
1.用户只能输入八位学号,用户输入错误时提醒用户重新输入
2.学号唯一,当用户输入重复学号时,提醒用户重新输入
void Addstudent() //增添信息
{long id; //学号char name[10]; //姓名int age; //年龄int i;float Chinese; //语文成绩float English; //英语成绩float Math; //数学成绩printf("\n 请依次输入学生的学号、姓名、年龄和各科成绩,并按下回车键\n\n");printf(" 请输入八位位学号:");scanf("%ld",&id);
again: while(id>99999999||id<9999999) //判断用户输入的学号是否为8位{printf("\n 输入错误,请输入正确的八位学号:");scanf("%ld",&id);}s[count].id=id;for(i=0;i<count;i++){if(s[i].id==s[count].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id); //重新为id赋值s[count].id=id;goto again;} elses[count].id=id;}printf(" 请输入姓名:"); scanf("%s",name);strcpy(s[count].name,name); printf(" 请输入年龄:");scanf("%d",&age);s[count].age = age; printf(" 请输入语文成绩:");scanf("%f",&Chinese);s[count].Chinese = Chinese;printf(" 请输入数学成绩:");scanf("%f",&Math);s[count].Math = Math;printf(" 请输入英语成绩:");scanf("%f",&English);s[count].English = English;s[count].sum=s[count].Chinese+s[count].Math+s[count].English; //计算出总分printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[count].id,s[count].name,s[count].age,s[count].Chinese,s[count].Math,s[count].English,s[count].sum);//该学生的全部信息printf("\n 录入成功!请继续操作。\n\n"); //提示录入成功count++; //已入库学生数+1output();
}
4.判断函数
判断函数的作用是判断用户输入的数值是否在阈值之内,若不在阈值内,提醒用户重新输入,若函数调用为a=Judge(1,3),则a的阈值为[1,3]
int Judge(int a,int b) //int a,int b为阈值,判断用户是否输入正确,如果用户输入的数值不在阈值内,提醒用户重新输入
{int judge;scanf("%d",&judge); //函数自带输入功能,使用时变量=函数调用即可if(judge>b||judge<a)while(judge>b||judge<a) //在阈值之外时提醒用户重新输入{ printf("\n 输入错误,请重新输入:");scanf("%d",&judge);}elsereturn judge; //将用户输入的阈值内的正确值返回
}
5.按学号查询函数
在通过学号查到到数组的同时,将找到的结果返回,方便后期的调用
struct student id_Find() //按学号查询
{int i;long id;printf("\n 请输入学号:");
Again: scanf("%ld",&id);for(i=0;i<=count;i++) //用for循环对数组进行检索,将目标学号找到后,把整个数组中的信息输出出来if(s[i].id==id){printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return s[i]; //将找到的数组返回}if(s[i].id!=id) //用户输入不存在的学号时提醒用户重新输入{printf("\n 未找到该学号,请重新输入:");goto Again;}
}
6.按姓名查询函数
在通过姓名查到到数组的同时,将找到的结果返回,方便后期的调用
struct student name_Find() //按姓名查找
{char name[10];int i;printf("\n 请输入姓名:");
Again:scanf("%s",name);for(i=0;i<=count;i++) //用for循环对数组进行检索,将目标学号找到后,把整个数组中的信息输出出来{if(strcmp(s[i].name,name)==0) //用strcmp函数判断字符串相等{printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return s[i]; //将找到的数组返回 }}if(strcmp(s[i].name,name)!=0) //用户输入不存在的姓名时提醒用户重新输入{printf("\n 未找到该姓名,请重新输入:");goto Again;}
}
7.整合函数
整合函数的作用就是将按学号查询和按姓名查询两个函数整合,方便后期的调用,若Find(1)则调用按学号查找的函数,若Find(2)则调用按姓名查找的函数
struct student Find(int a) //将按学号查找和按姓名查找两个功能整合到一起
{int i;for(i=0;i<=count;i++){if(a==1){s[i]=id_Find(); //如果a=1时,将调用按学号查找的函数return s[i]; //返回按学号查找到的数组}else if(a==2){s[i]=name_Find(); //如果a=2时,将调用按姓名查找的函数return s[i]; //返回按姓名查找的数组}}
}
8.删除函数
覆盖要删除信息的数组
void delete_student(int a) //删除学生信息的函数,a用来判断按学号/姓名删除
{int i,j;//中间变量int num;//中间变量for(i=0;i<=count;i++){s[i]=Find(a);printf("\n\n 1.确认删除 2.取消删除\n\n 请选择:");num=Judge(1,2);if (num==1)//确认删除{for (j=i;j<=count;j++)s[j]=s[j+1]; //将要删除的学生信息覆盖printf("\n 删除成功! \n");count--;//学生总数减一return;}else if(num==2)//取消删除{printf("\n 已取消删除! \n");return;}}
}
9.修改函数
修改成绩
void change_score(int a) //修改成绩的函数,a用来判断按学号/姓名修改
{int i,choice;for(i=0;i<=count;i++){s[i]=Find(a);printf("\n\n 1.语文 2.数学 3.英语\n");printf("\n 请输入您想修改的科目:");choice=Judge(1,3);printf("\n 请输入修改后的分数:");//根据用户的选择,将不同科目的分数重新赋值if(choice==1)scanf("%f",&s[i].Chinese);else if(choice==2)scanf("%f",&s[i].Math);else if(choice==3)scanf("%f",&s[i].English);s[i].sum =s[i].Chinese+s[i].Math+s[i].English; //重新计算学生的总成绩printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return; //结束函数}
}
修改学号
void change_id(int a) //修改学号的函数,a用来判断按学号/姓名修改
{int i;long id;int num;for(i=0;i<=count;i++){s[i]=Find(a);printf(" 请输入修改后的八位位学号:");scanf("%ld",&id);
again:while(id>99999999||id<9999999) //判断用户输入的学号是否为八位{printf("\n 输入错误,请输入正确的八位学号:");scanf("%ld",&id);}s[i].id=id; for(num=0;num<i;num++) //判断i之前是否有相同的学号{ if(s[i].id==s[num].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id);s[i].id=id; goto again; //保证用户重新输入的学号为八位,并重新判断是否已经存在} elses[i].id=id;}for(num=i+1;num<=count;num++) //判断i之后是否有相同的学号{ if(s[i].id==s[num].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id);s[i].id=id; goto again; //保证用户重新输入的学号为八位,并重新判断是否已经存在} elses[i].id=id;}printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return;}
}
修改姓名
void change_name(int a) //修改姓名的函数,a用来判断按学号/姓名修改
{int i;char name[10];for(i=0;i<=count;i++){s[i]=Find(a);printf("\n 请输入修改后的姓名:");scanf("%s",name);strcpy(s[i].name,name); //将姓名重新赋值printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return; //结束函数}
}
修改年龄
void change_age(int a) //修改年龄的函数,a用来判断按学号/姓名删除
{int i;for(i=0;i<=count;i++){s[i]=Find(a); //把函数返回的值赋值给s[i]printf("\n 请输入修改后的年龄:");scanf("%d",s[i].age); //将年龄重新赋值printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return;}
}
10.输出全部信息函数
系统中很多地方要用到输出全部信息,方便用户的查看
void output() //输出全部学生信息的函数
{int i;printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n"); //显示顶部文字信息for(i=0;i<count;i++) //通过for循环把数组中的每条信息输出在文字信息的下方printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return;
}
11.按总成绩排名函数
通过数组之间的相互赋值,按照总成绩从高到低排序
void total_score() //按总分排名从高到底排序的函数
{int i,j; //外层循环的参数,内层循环的参数struct student m; //定义一个用来替换数组的中间变量for(i=0;i<=count;i++)for(j=i+1;j<=count+1;j++) //j=i+1获取s[i]后面的元素s[j]if(s[j].sum>s[i].sum) //通过总分的比较,用赋值的方法调换数组中信息的顺序{m=s[i];s[i]=s[j];s[j]=m;}output(); //最后将所有的信息输出return;
}
12.写入函数
void WriteFile() //写入文件
{FILE *fp;int i;if ((fp=fopen("Database.txt","wb"))==NULL) //以二进制写方式打开文件{printf("\n 不能打开文件!\n");return;}if (fwrite(&count,sizeof(int),1,fp)!=1){printf("\n 写入文件错误!\n");}for (i=0;i<count;i++){if (fwrite(&s[i],sizeof(struct student),1,fp)!=1){printf("\n 写入文件错误!\n");}}printf("\n 保存成功!\n");fclose(fp);output(); //将保存的信息全部输出,方便用户查看
}
13.读入函数
void ReadFile() //读取文件
{FILE *fp;int i;if ((fp=fopen("Database.txt","rb"))==NULL) //以以二进制读的方式打开文件{printf("\n 不能打开文件!\n");return;}if (fread(&count,sizeof(int),1,fp)!=1){count=-1;}else{for(i=0;i<count;i++){fread(&s[i],sizeof(struct student),1,fp);}printf("\n 读取成功\n\n");output(); //输出读取到的全部信息,方便用户查看}fclose(fp);
}
14.主函数
主函数是函数的主体,用switch以及switch的嵌套构成系统的主体框架,主函数中实现了开头自动检索存档和持续操作的功能
/*主函数*/
void main()
{int choice,choice1;int judge1;FILE *fp;printf("\n\n *****欢迎使用学生成绩管理系统*****\n\n\n\n");
//系统开始自动检索有无存档if ((fp=fopen("Database.txt","rb"))==NULL)goto Start; //若无存档,直接跳至主菜单else{printf("\n 检测到有存档,是否打开\n"); //若有存档,询问是否打开printf("\n 1.打开存档 2.取消打开\n\n 请选择:");judge1=Judge(1,2);if(judge1==1) //若打开,调用读取文件函数ReadFile();if(judge1==2) //若不打开,跳至主菜单goto Start;}
Start:Menu(); //主菜单printf("\n 请选择您要使用的功能,输入序号并按回车:");choice=Judge(1,5); //choice的范围是[1,5]switch(choice){case 1: //增添信息printf("\n\n ***增添信息***\n\n\n");
Start1_1: //实现持续录入Addstudent(); //调用增添信息的函数printf("\n 1.继续录入 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2); if(judge1==1)goto Start1_1;if(judge1==2)goto Start;break;case 2: //删除信息printf("\n\n ***删除信息***\n\n\n"); printf(" 1.按学号删除 2.按姓名删除\n\n\n");printf(" 请输入您的选择:"); choice=Judge(1,2);switch(choice){case 1: //按学号删除
Start2_1: //实现持续按学号删除delete_student(1);printf("\n 1.继续删除 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start2_1;if(judge1==2)goto Start;break;case 2: //按姓名删除
Start2_2: //实现持续按姓名删除delete_student(2);printf("\n 1.继续删除 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start2_2;if(judge1==2)goto Start;break;}break;case 3: //修改信息printf("\n\n ***修改信息***\n\n\n");printf(" 1.按学号修改 2.按姓名修改\n\n\n");printf("\n 请输入您的选择:");choice=Judge(1,2);switch(choice){case 1: //case 1为按学号修改printf("\n\n 1.修改学号 2.修改姓名\n\n");printf("\n\n 3.修改年龄 4.修改成绩\n\n");printf("\n 请输入您的选择:");choice1=Judge(1,4);switch(choice1){case 1: //按学号修改学号
Start3_1_1:change_id(1);printf("\n 1.继续修改学号 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_1;if(judge1==2)goto Start;break;case 2: //按学号修改姓名
Start3_1_2: change_name(1);printf("\n 1.继续修改姓名 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_2;if(judge1==2)goto Start;break;case 3: //按学号修改年龄
Start3_1_3:change_age(1);printf("\n 1.继续修改年龄 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_3;if(judge1==2)goto Start;break;case 4: //按学号修改成绩
Start3_1_4:change_score(1);printf("\n 1.继续修改成绩 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_4;if(judge1==2)goto Start;break;}break;case 2: //按姓名修改printf("\n\n 1.修改学号 2.修改姓名\n\n");printf("\n\n 3.修改年龄 4.修改成绩\n\n");printf("\n 请输入您的选择:");choice1=Judge(1,4);switch(choice1){case 1: //按姓名修改学号
Start3_2_1:change_id(2);printf("\n 1.继续修改学号 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_1;if(judge1==2)goto Start;break;case 2: //按姓名修改姓名
Start3_2_2:change_name(2); printf("\n 1.继续修改姓名 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_2;if(judge1==2)goto Start;break;case 3: //按姓名修改年龄
Start3_2_3:change_age(2); printf("\n 1.继续修改年龄 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_3;if(judge1==2)goto Start;break;case 4: //按姓名修改成绩
Start3_2_4:change_score(2);printf("\n 1.继续修改成绩 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_4;if(judge1==2)goto Start;break;}break;}break;case 4: //查询信息printf("\n\n ***查询信息***\n\n\n");printf(" 1.学号查询 2.姓名查询\n\n\n");printf(" 3.输出全部信息 4.按总分从高到低排序\n\n\n");printf(" 5.保存文档\n\n\n 请输入您的选择:");printf(" 请输入您的选择:"); choice=Judge(1,4);switch(choice){case 1: //按学号查询
Start4_1:id_Find();printf("\n 1.继续查询 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start4_1;if(judge1==2)goto Start;break;case 2: //按姓名查询
Start4_2:name_Find();printf("\n 1.继续查询 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start4_2;if(judge1==2)goto Start;break;case 3: //输出全部信息output();printf("\n\n 1.返回主菜单\n\n 请选择:");judge1=Judge(1,1);if(judge1==1)goto Start;case 4: //按总成绩排名total_score();printf("\n\n 1.返回主菜单\n\n 请选择:");judge1=Judge(1,1);if(judge1==1)goto Start;case 5: //保存文件WriteFile();goto Start;}break;case 5: //保存文件并退出WriteFile();printf("\n 已退出并保存系统,感谢您的使用!");break;}}
15.源代码
代码中还有很多不够优秀的地方,请谅解,欢迎大神们的指点
有问题请联系博主vx: gennnnn1
#include<stdio.h>
#include<string.h>/*结构体*/
struct student
{long id;//学号char name[10];//姓名int age;//年龄float Chinese;//语文成绩float English;//英语成绩float Math;//数学成绩float sum;//总成绩
};/*全局变量*/
struct student s[100];//学生信息数组
int count;//统计入库的学生数量/*函数声明*/
void Menu(); //主菜单
void Addstudent(); //增添学生信息的函数
int Judge(int a,int b); //a,b为阈值,Judge函数判断数字是否在阈值范围内
struct student id_Find(); //学号查询的函数,返回找到的学生信息数组
struct student name_Find(); //姓名查询的函数,返回找到的学生信息代码
void delete_student(int a); //删除学生的函数
void WriteFile(); //写入文件的函数
void ReadFile(); //读入系统的函数
void change_score(int a); //修改成绩的函数,a=1时通过学号修改,a=2时通过姓名修改
struct student Find(); //整合学号查询和姓名学习的函数
void change_id(int a); //修改学号的函数
void change_name(int a); //修改姓名的函数
void change_age(int a); //修改年龄的函数
void output(); //输出全部信息的函数
void total_score(); //按总成绩排名/*主函数*/
void main()
{int choice,choice1;int judge1;FILE *fp;printf("\n\n *****欢迎使用学生成绩管理系统*****\n\n\n\n");
//系统开始自动检索有无存档if ((fp=fopen("Database.txt","rb"))==NULL)goto Start; //若无存档,直接跳至主菜单else{printf("\n 检测到有存档,是否打开\n"); //若有存档,询问是否打开printf("\n 1.打开存档 2.取消打开\n\n 请选择:");judge1=Judge(1,2);if(judge1==1) //若打开,调用读取文件函数ReadFile();if(judge1==2) //若不打开,跳至主菜单goto Start;}
Start:Menu(); //主菜单printf("\n 请选择您要使用的功能,输入序号并按回车:");choice=Judge(1,5); //choice的范围是[1,5]switch(choice){case 1: //增添信息printf("\n\n ***增添信息***\n\n\n");
Start1_1: //实现持续录入Addstudent(); //调用增添信息的函数printf("\n 1.继续录入 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2); if(judge1==1)goto Start1_1;if(judge1==2)goto Start;break;case 2: //删除信息printf("\n\n ***删除信息***\n\n\n"); printf(" 1.按学号删除 2.按姓名删除\n\n\n");printf(" 请输入您的选择:"); choice=Judge(1,2);switch(choice){case 1: //按学号删除
Start2_1: //实现持续按学号删除delete_student(1);printf("\n 1.继续删除 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start2_1;if(judge1==2)goto Start;break;case 2: //按姓名删除
Start2_2: //实现持续按姓名删除delete_student(2);printf("\n 1.继续删除 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start2_2;if(judge1==2)goto Start;break;}break;case 3: //修改信息printf("\n\n ***修改信息***\n\n\n");printf(" 1.按学号修改 2.按姓名修改\n\n\n");printf("\n 请输入您的选择:");choice=Judge(1,2);switch(choice){case 1: //case 1为按学号修改printf("\n\n 1.修改学号 2.修改姓名\n\n");printf("\n\n 3.修改年龄 4.修改成绩\n\n");printf("\n 请输入您的选择:");choice1=Judge(1,4);switch(choice1){case 1: //按学号修改学号
Start3_1_1:change_id(1);printf("\n 1.继续修改学号 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_1;if(judge1==2)goto Start;break;case 2: //按学号修改姓名
Start3_1_2: change_name(1);printf("\n 1.继续修改姓名 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_2;if(judge1==2)goto Start;break;case 3: //按学号修改年龄
Start3_1_3:change_age(1);printf("\n 1.继续修改年龄 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_3;if(judge1==2)goto Start;break;case 4: //按学号修改成绩
Start3_1_4:change_score(1);printf("\n 1.继续修改成绩 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_1_4;if(judge1==2)goto Start;break;}break;case 2: //按姓名修改printf("\n\n 1.修改学号 2.修改姓名\n\n");printf("\n\n 3.修改年龄 4.修改成绩\n\n");printf("\n 请输入您的选择:");choice1=Judge(1,4);switch(choice1){case 1: //按姓名修改学号
Start3_2_1:change_id(2);printf("\n 1.继续修改学号 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_1;if(judge1==2)goto Start;break;case 2: //按姓名修改姓名
Start3_2_2:change_name(2); printf("\n 1.继续修改姓名 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_2;if(judge1==2)goto Start;break;case 3: //按姓名修改年龄
Start3_2_3:change_age(2); printf("\n 1.继续修改年龄 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_3;if(judge1==2)goto Start;break;case 4: //按姓名修改成绩
Start3_2_4:change_score(2);printf("\n 1.继续修改成绩 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start3_2_4;if(judge1==2)goto Start;break;}break;}break;case 4: //查询信息printf("\n\n ***查询信息***\n\n\n");printf(" 1.学号查询 2.姓名查询\n\n\n");printf(" 3.输出全部信息 4.按总分从高到低排序\n\n\n");printf(" 5.保存文档\n\n\n 请输入您的选择:");printf(" 请输入您的选择:"); choice=Judge(1,4);switch(choice){case 1: //按学号查询
Start4_1:id_Find();printf("\n 1.继续查询 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start4_1;if(judge1==2)goto Start;break;case 2: //按姓名查询
Start4_2:name_Find();printf("\n 1.继续查询 2.返回主菜单\n\n 请选择:");judge1=Judge(1,2);if(judge1==1)goto Start4_2;if(judge1==2)goto Start;break;case 3: //输出全部信息output();printf("\n\n 1.返回主菜单\n\n 请选择:");judge1=Judge(1,1);if(judge1==1)goto Start;case 4: //按总成绩排名total_score();printf("\n\n 1.返回主菜单\n\n 请选择:");judge1=Judge(1,1);if(judge1==1)goto Start;case 5: //保存文件WriteFile();goto Start;}break;case 5: //保存文件并退出WriteFile();printf("\n 已退出并保存系统,感谢您的使用!");break;}}/*函数定义*/
void Menu() //主菜单
{printf("\n 主菜单\n\n\n");printf(" 1.增添信息 ");printf(" 2.删除信息\n\n");printf(" 3.修改信息 ");printf(" 4.查询信息\n\n");printf(" 5.保存并退出系统\n\n");
}void Addstudent() //增添信息
{long id; //学号char name[10]; //姓名int age; //年龄int i;float Chinese; //语文成绩float English; //英语成绩float Math; //数学成绩printf("\n 请依次输入学生的学号、姓名、年龄和各科成绩,并按下回车键\n\n");printf(" 请输入八位位学号:");scanf("%ld",&id);
again: while(id>99999999||id<9999999) //判断用户输入的学号是否为8位{printf("\n 输入错误,请输入正确的八位学号:");scanf("%ld",&id);}s[count].id=id;for(i=0;i<count;i++){if(s[i].id==s[count].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id); //重新为id赋值s[count].id=id;goto again;} elses[count].id=id;}printf(" 请输入姓名:"); scanf("%s",name);strcpy(s[count].name,name); printf(" 请输入年龄:");scanf("%d",&age);s[count].age = age; printf(" 请输入语文成绩:");scanf("%f",&Chinese);s[count].Chinese = Chinese;printf(" 请输入数学成绩:");scanf("%f",&Math);s[count].Math = Math;printf(" 请输入英语成绩:");scanf("%f",&English);s[count].English = English;s[count].sum=s[count].Chinese+s[count].Math+s[count].English; //计算出总分printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[count].id,s[count].name,s[count].age,s[count].Chinese,s[count].Math,s[count].English,s[count].sum);//该学生的全部信息printf("\n 录入成功!请继续操作。\n\n"); //提示录入成功count++; //已入库学生数+1output();
}int Judge(int a,int b) //int a,int b为阈值,判断用户是否输入正确,如果用户输入的数值不在阈值内,提醒用户重新输入
{int judge;scanf("%d",&judge); //函数自带输入功能,使用时变量=函数调用即可if(judge>b||judge<a)while(judge>b||judge<a) //在阈值之外时提醒用户重新输入{ printf("\n 输入错误,请重新输入:");scanf("%d",&judge);}elsereturn judge; //将用户输入的阈值内的正确值返回
}struct student id_Find() //按学号查询
{int i;long id;printf("\n 请输入学号:");
Again: scanf("%ld",&id);for(i=0;i<=count;i++) //用for循环对数组进行检索,将目标学号找到后,把整个数组中的信息输出出来if(s[i].id==id){printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return s[i]; //将找到的数组返回}if(s[i].id!=id) //用户输入不存在的学号时提醒用户重新输入{printf("\n 未找到该学号,请重新输入:");goto Again;}
}struct student name_Find() //按姓名查找
{char name[10];int i;printf("\n 请输入姓名:");
Again:scanf("%s",name);for(i=0;i<=count;i++) //用for循环对数组进行检索,将目标学号找到后,把整个数组中的信息输出出来{if(strcmp(s[i].name,name)==0) //用strcmp函数判断字符串相等{printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return s[i]; //将找到的数组返回 }}if(strcmp(s[i].name,name)!=0) //用户输入不存在的姓名时提醒用户重新输入{printf("\n 未找到该姓名,请重新输入:");goto Again;}
}void delete_student(int a) //删除学生信息的函数,a用来判断按学号/姓名删除
{int i,j;//中间变量int num;//中间变量for(i=0;i<=count;i++){s[i]=Find(a);printf("\n\n 1.确认删除 2.取消删除\n\n 请选择:");num=Judge(1,2);if (num==1)//确认删除{for (j=i;j<=count;j++)s[j]=s[j+1]; //将要删除的学生信息覆盖printf("\n 删除成功! \n");count--;//学生总数减一return;}else if(num==2)//取消删除{printf("\n 已取消删除! \n");return;}}
}void change_score(int a) //修改成绩的函数,a用来判断按学号/姓名修改
{int i,choice;for(i=0;i<=count;i++){s[i]=Find(a);printf("\n\n 1.语文 2.数学 3.英语\n");printf("\n 请输入您想修改的科目:");choice=Judge(1,3);printf("\n 请输入修改后的分数:");//根据用户的选择,将不同科目的分数重新赋值if(choice==1)scanf("%f",&s[i].Chinese);else if(choice==2)scanf("%f",&s[i].Math);else if(choice==3)scanf("%f",&s[i].English);s[i].sum =s[i].Chinese+s[i].Math+s[i].English; //重新计算学生的总成绩printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return; //结束函数}
}void change_name(int a) //修改姓名的函数,a用来判断按学号/姓名修改
{int i;char name[10];for(i=0;i<=count;i++){s[i]=Find(a);printf("\n 请输入修改后的姓名:");scanf("%s",name);strcpy(s[i].name,name); //将姓名重新赋值printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return; //结束函数}
}void change_id(int a) //修改学号的函数,a用来判断按学号/姓名修改
{int i;long id;int num;for(i=0;i<=count;i++){s[i]=Find(a);printf(" 请输入修改后的八位位学号:");scanf("%ld",&id);
again:while(id>99999999||id<9999999) //判断用户输入的学号是否为八位{printf("\n 输入错误,请输入正确的八位学号:");scanf("%ld",&id);}s[i].id=id; for(num=0;num<i;num++) //判断i之前是否有相同的学号{ if(s[i].id==s[num].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id);s[i].id=id; goto again; //保证用户重新输入的学号为八位,并重新判断是否已经存在} elses[i].id=id;}for(num=i+1;num<=count;num++) //判断i之后是否有相同的学号{ if(s[i].id==s[num].id) //当学号输入重复时,提醒用户重新输入{printf("\n 学号已存在,请重新输入:");scanf("%ld",&id);s[i].id=id; goto again; //保证用户重新输入的学号为八位,并重新判断是否已经存在} elses[i].id=id;}printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return;}
}void change_age(int a) //修改年龄的函数,a用来判断按学号/姓名删除
{int i;for(i=0;i<=count;i++){s[i]=Find(a); //把函数返回的值赋值给s[i]printf("\n 请输入修改后的年龄:");scanf("%d",s[i].age); //将年龄重新赋值printf("\n 修改成功!");printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n");//打印一遍该学生的所有信息printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);//该学生的全部信息return;}
}struct student Find(int a) //将按学号查找和按姓名查找两个功能整合到一起
{int i;for(i=0;i<=count;i++){if(a==1){s[i]=id_Find(); //如果a=1时,将调用按学号查找的函数return s[i]; //返回按学号查找到的数组}else if(a==2){s[i]=name_Find(); //如果a=2时,将调用按姓名查找的函数return s[i]; //返回按姓名查找的数组}}
}void output() //输出全部学生信息的函数
{int i;printf("\n\n \t学号\t姓名\t年龄\t语文\t数学\t英语\t总分\n"); //显示顶部文字信息for(i=0;i<count;i++) //通过for循环把数组中的每条信息输出在文字信息的下方printf(" %8ld\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\n",s[i].id,s[i].name,s[i].age,s[i].Chinese,s[i].Math,s[i].English,s[i].sum);return;
}void total_score() //按总分排名从高到底排序的函数
{int i,j; //外层循环的参数,内层循环的参数struct student m; //定义一个用来替换数组的中间变量for(i=0;i<=count;i++)for(j=i+1;j<=count+1;j++) //j=i+1获取s[i]后面的元素s[j]if(s[j].sum>s[i].sum) //通过总分的比较,用赋值的方法调换数组中信息的顺序{m=s[i];s[i]=s[j];s[j]=m;}output(); //最后将所有的信息输出return;
}void WriteFile() //写入文件
{FILE *fp;int i;if ((fp=fopen("Database.txt","wb"))==NULL) //以二进制写方式打开文件{printf("\n 不能打开文件!\n");return;}if (fwrite(&count,sizeof(int),1,fp)!=1){printf("\n 写入文件错误!\n");}for (i=0;i<count;i++){if (fwrite(&s[i],sizeof(struct student),1,fp)!=1){printf("\n 写入文件错误!\n");}}printf("\n 保存成功!\n");fclose(fp);output(); //将保存的信息全部输出,方便用户查看
}void ReadFile() //读取文件
{FILE *fp;int i;if ((fp=fopen("Database.txt","rb"))==NULL) //以以二进制读的方式打开文件{printf("\n 不能打开文件!\n");return;}if (fread(&count,sizeof(int),1,fp)!=1){count=-1;}else{for(i=0;i<count;i++){fread(&s[i],sizeof(struct student),1,fp);}printf("\n 读取成功\n\n");output(); //输出读取到的全部信息,方便用户查看}fclose(fp);
}
c语言课程设计 学生成绩管理系统相关推荐
- c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统
<c语言课程设计学生成绩管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计学生成绩管理系统(31页珍藏版)>请在人人文库网上搜索. 1.河南理工大学计算机科学与技术学院 ...
- C语言成绩统计源代码,C语言课程设计学生成绩管理系统+源码
<C语言课程设计学生成绩管理系统+源码>由会员分享,可在线阅读,更多相关<C语言课程设计学生成绩管理系统+源码(25页珍藏版)>请在人人文库网上搜索. 1.简易教学管理系统的设 ...
- C语言学生成绩管理设计总结,C语言课程设计学生成绩管理系统个人总结
C语言课程设计学生成绩管理系统个人总结 C语言课程设计--学生成绩管理系统 个人心得体会 (徐州工程学院 14计嵌1班 07组 张凯) 这一周以来的课程设计,不仅让我明白了C语言的确是一门很有用的,但 ...
- 学生成绩统计c语言课程设计,学生成绩管理系统-C语言课程设计
记一次课程设计作业 学生成绩管理系统#include #include #include #include /* 学生成绩管理系统介绍 2017C语言课程设计 202160936 1.支持将数据保存 ...
- c语言学生成绩管理系统课设作业,C语言课程设计——学生成绩管理系统
摘 要 学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段.但一直以来人们使用传统人工的方式 ...
- C语言课程设计——学生成绩管理系统(详细报告)
欢迎来到<IT_WEH_coder>的博客.我是小魏,一名普通的在校大学生.希望大家多多关照,我们一起成长一起进步,也希望大家多多支持我鸭,喜欢我就给我一个关注吧! 本课程设计的编程部分所 ...
- 按课程查询学生成绩C语言,C语言课程设计学生成绩管理系统
1. 设计目标 设计一个简单的学生成绩管理系统,系统要解决成绩录入.计算学分和平均分成绩排名和成绩查询等几个方面. 主要功能分为四部分: ① 提供成绩录入界面. ② 统计每个学生的总分和平均分. ③ ...
- c语言课程设计学生成绩簿,c语言课程设计—学生成绩管理系统
0; } else printf("没有该条件的选项!\n"); return 0; } void incharge(int a,int b) //交换函数. { struct s ...
- 课程设计——学生成绩管理系统 C语言
课程设计--学生成绩管理系统 基本要求: 1.程序功能 编程实现一个基础的成绩管理系统. 2.设计目的 通过本程序综合掌握结构体类型.指针.函数.文件等知识的综合使用. 3.功能要求(可扩充功能) ( ...
最新文章
- vbsedit无法创建空文档_vue文档里你没捡起来的宝藏
- ETSI GS MEC 012,RNIS API
- java类与对象 —(10)
- c语言三目运算符_C语言中的三目运算符是啥?有何用处?
- 如何构建React-Native图库教程
- 父窗口、子窗口和Silverlight之间的相互调用
- 十四、K8s calico网络的通信及网络策略
- 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
- linux下activityMQ安装
- python 高斯滤波
- java实现五子棋_Java的五子棋实现
- Informatic学习总结_day02
- icpc2019南京区域赛
- 微信跳转手机浏览器实现
- 这个好玩!用Python识别花卉种类,并自动整理分类!
- 要不要考公务员 | 进国企?
- Msc.Marc安装和使用过程中遇到证书错误——处理办法
- 你有多可爱,婚姻就有多可爱(转载记录)
- Unity URP shader 出现 SRP Batcher 为 not compatible时 渲染性能会下降 应该怎么处理 ?
- 十大编程语言之父你都知道有谁嘛?