c语言课程设计 学生成绩管理系统

article/2025/10/27 9:23:23

学生成绩管理系统要求:

        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);
}


http://chatgpt.dhexx.cn/article/cCngGC0Y.shtml

相关文章

C语言学生成绩管理系统详解

文章目录 一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码 源代码请直接跳到最后 引言&#xff1a;最近写了C语言的大作业&#xff0c;感觉做得还行&#xff0c;记录一下&#xff0c;给后人一些参考&#xff0c;给自己留更深印象方便后续改进&#xff01; …

学生成绩管理系统 C语言

基础篇问题&#xff1a; 1.输出如下菜单&#xff1a; *********************学生成绩管理系统******************* * 1 成绩录入 2 成绩查询 3 计算平均分 * * 4 计算最高分 5 排名 6 退出 * ******************************…

C语言编程学生成绩管理系统

目录 一、介绍 二、功能 1.录入学生 2.删除学生信息 3.修改学生信息 4.查询学生信息 5.所有学生信息 6.成绩排序 7.退出程序 三、代码 1.主函数 2.头文件 3.函数封装库 一、介绍 利用C语言&#xff0c;运用链表、指针、封装函数等基本知识实现一个学生管理系统。通…

C语言学生成绩管理系统

制作学生成绩管理系统&#xff0c;可以实现以下功能&#xff1a; 每条记录包括&#xff1a;学号、姓名、专业和5门课程的成绩&#xff1b;能够实现添加、删除、修改功能&#xff1b;能够计算某学生的总分和平均分&#xff1b;能按照总分排序输出&#xff1b; 利用C语言的基本…

c语言成绩管理系统

关注微信公众号每日新觉&#xff0c;私聊作者获取提取密码点击下面链接&#xff0c;私聊作者获取提取密码。https://mp.weixin.qq.com/s/QgRQ3YB2JqCvNOGQHQ57rA 作者每日新觉&#xff0c;是一名热爱技术和编程的年轻程序员。他在计算机科学和软件工程领域有着广泛的研究和实践…

c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版

c语言成绩管理系统拥有和hello word一样的江湖地位&#xff0c;初学C语言的朋友基本都会从管理系统开始入手学习&#xff0c;对于很多大学生来说更是如此&#xff0c;今天为大家带来的这款系统以及源码希望能对大家学习学C语言有所帮助&#xff0c;欢迎下载使用。 C语言介绍 C语…

C语言学生成绩管理系统(综合项目)

1. 这个代码主要实现以下功能&#xff1a; 2. 用到的主要参数有&#xff1a; 1.整型变量int n;用于储存学生人数和之后的循环判断。 2.字符串char name[][];用于储存姓名。 3.浮点型变量float score[];用于储存成绩。 4.长整型变量long ID[Max];用于储存学号。 3.…

【高级语言程序设计】c语言-学生成绩管理系统

c语言期末作业 声明&#xff1a;未经允许&#xff0c;请勿转载 学生成绩管理系统 本系统能够对学生成绩管理功能&#xff0c;包括&#xff1a; 1.对多个学生成绩进行管理&#xff0c;至少10个学生。 2.每个学生至少3门课程。 3.对每个学生大学期间的成绩进行记录。 4.修改学生…

班级成绩管理系统(C语言)

文章目录 一、设计任务与目标二、实现功能三、程序源码四、效果展示 一、设计任务与目标 对一个有N个学生的班级&#xff0c;每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。 二、实现功能 &#xff08;1&#xff09;本系统采用一个结…

C语言:学生成绩管理系统

目录 一&#xff1a;功能概述&#xff1a; 二&#xff1a;实现&#xff1a; 1.主源文件 1.打印菜单&#xff01; 2.构建管理系统的框架&#xff1a; 二&#xff1a;辅源文件 1.使用结构体&#xff0c;方便后面的编写 2.输入学生信息 3.输出学生基本信息 3.按姓名查询 3.…

C语言课程设计|学生成绩管理系统(含完整代码)

目录 前言 简介 学生信息录入功能 学生单个信息查询 查询全部学生信息 修改学生信息 删除学生信息 退出 完整代码 前言 在临近期末之际&#xff0c;相信好多初学C语言的同学都开始为写C语言课程设计这件事开始焦虑了吧&#xff1f;或许会不知所措&#xff0c;或许会…

matlab importdata不能读取全部数据问题

最近使用importdata函数不能读取全部数据&#xff0c;数据集315行&#xff0c;但是读取了197行&#xff0c;那就是197-198之间有问题&#xff0c;百度之后有了思路。由于没有找到具体的证据&#xff0c;所以这里说一下解决思路。 import可以导入很多文件类型&#xff0c;.dat文…

ImportError: cannot import name 'datasets'

初次使用python scikit-learn库时出现找不到模块的问题 from sklearn import datasets ImportError: cannot import name datasets类似问题链接&#xff1a; https://stackoverflow.com/questions/39280466/cant-import-datasets-with-scikit-learn 参考答案&#xff1a; 原因…

MATLAB输入、导入方式(手动输入,TXT文件,Excel导入)

目录 手动输入 input函数 自动输入 TXT导入数组 dir函数 importdata函数 Excel导入数组 手动输入 input函数 请求用户输入 语法 x input(number) %数值型str input(charnumber,s) %字符型&#xff0c;s不能改变 数值型进行演示 Pzeros(5,1); %建立零51矩阵进行储存…

1.数据的导入与导出

数据的导入与导出 更多MATLAB数据分析视频请点击&#xff0c;或者在网易云课堂上搜索《MATLAB数据分析与统计》 http://study.163.com/course/courseMain.htm?courseId1003615016 在用MATLAB进行编程时&#xff0c;不可避免的要涉及到数据的导入与导出&#xff0c;如果数据…

matlab读取数据文件

data1.txt: 0 3886.162 2200.938 141.240 1 3721.139 2208.475 141.152 2 3866.200 2198.936 141.126 3 3678.048 2199.191 141.250 4 3685.453 2203.726 141.241 分别采用load、importdata、textread、fscanf、textscan和fread函数读取文本数据文件。 dat1load(data1.t…

Python中库导入from . import 和from .. import 的使用方法

Python中库导入from . import 和from .. import 的使用方法 程序目录结构如下 from . import XX 和 from .. import XX 只能使用在子包中&#xff0c;例如上面的例子中&#xff0c;程序最外层是主程序app.py,程序有一个子包pack1&#xff0c;pack1下有a.py 和b.py两个文件&…

matlab inport data 作图,MATLAB使用importdata读取字符数据文件并绘图 值得收藏

本文首先使用importdata( )读取(导入)含有字符和数据的文本格式数据文件&#xff0c;然后介绍通过“.”数据名的方式读取结构数组中的数据&#xff0c;最后使用plot( )绘制折线图。 工具/材料 MATLAB struct 操作方法 01 第一&#xff0c;首先准备数据&#xff0c;下图txt数据文…

【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据

配套实验数据包下载链接&#xff1a;订阅专栏后&#xff0c;从私信查收链接。 文章目录 1. 调用importdata函数读取文件中的数据2. 调用importdata函数读取文件数据&#xff0c;返回结构体变量x3. 调用importdata函数读取文件中的数据&#xff0c;用;作分隔符&#xff0c;返回字…