学生成绩管理系统(V2.0)‖菜单和返回功能

这是本人第一次在CSDN上写博客 如果写的不好的话或有写错的地方的话多多见谅,本人仅仅作为一名才学C语言两个多月的大一新生写下这篇博客。

【实验内容】
1. 学生成绩管理系统
某班有最多不超过 30 人 参加4门课程的期末考试。 编写一个菜单驱动的学生成绩管理系统。实现如下管理功能:
1)录入每位学生的学号、 姓名、性别和4门课的考试成绩;(用结构体存储)
2) 计算每位学生的4门课程的总分;
3) 按照学生的总成绩降序排序;
4) 按照学号升序排序;
5)按照姓名的字典顺序排序;
6) 按照学号查询某学生信息;
7)按照姓名查询某学生信息; 
8) 按优秀( 90~100)、良好( 80~89)、中等( 70~79)、及格( 60~69)、不及格( 0~59) 5
个类别,分别统计每个类别的人数及所占的百分比;
9) 输出每位学生的学号、姓名、性别、4门考试成绩以及平均分。
【具体要求】:
– 程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如
类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
– 输出菜单形式如下:
Management for Students' scores
1. Input record
2. Caculate total score of a student
3. Sort in descending order by total score
4. Sort in ascending order by number
5. Sort in dictionary order by name
6. Search by number
7. Search by name
8. Statistic analysis
9. List record
0. Exit
Please Input your choice:
根据用户的输入选择执行相应的成绩管理操作。

对实验做出分析后,该学生成绩管理系统应该有如下几个模块:

982e84dbae3446588567b94e5a638934.jpg

 源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>

//函数自定义声明 
void Menu();//菜单 
void Error();//错误数据处理 
void Right();//用户下一步做什么 
void Record_socre();//录入学生成绩 
void Sum_socre();//显示总分 
void Sort_sum();//按总分排序 
void Sort_ID();//按学号排序
void Sort_name();//按姓名升序排序 
void Seek_ID();//按照学号查找 
void Seek_name();//按照姓名查找
void Average_graph();//显示平均分
void Percent_graph();//各学科成绩情况显示

//全局变量定义 
typedef struct//结构体储存数据 
{
	long long ID;
	char Name[30];
	char Sex;
	double Chinese;
	double Math;
	double English;
	double Science; 
}student;
student stu[50];//结构体数组stu
int Judge = 0;//判断是否已录入成绩 
int number,choice,sign[50];//学生人数 ,输入的选项 ,下标数组 
double sum[50];//总分 
char x;//吸收空格和回车用 
jmp_buf envbuf;//保存 

//主函数 
int main()
{
	int keep;//系统进度标记 
	char choice;
	keep = setjmp(envbuf);//保存系统进度 
	Menu();//菜单显示 
	while(choice!='0')
	{
		choice = getchar();
		x = getchar();
		if(choice>='0'&&choice<='9')
		{
			if(choice=='0')
			{
				printf("******* 您已退出程序 *******\n");
				exit(0); 
			}
			if(choice=='1') Record_socre();
			if(choice=='2') Sum_socre();
			if(choice=='3') Sort_sum();
			if(choice=='4') Sort_ID();
			if(choice=='5') Sort_name();
			if(choice=='6') Seek_ID();
			if(choice=='7') Seek_name();
			if(choice=='8') Percent_graph();
			if(choice=='9') Average_graph();
			Right();
		}
		else Error();//报错 
	}
	return 0;
}

void Menu()//菜单 
{
	printf("                                          ****************************\n");
	printf("                                          ***** 学生管理系统菜单 *****\n");
	printf("                                          **** 1.录入各个学生信息 ****\n");
	printf("                                          **** 2.显示各个学生总分 ****\n");
	printf("                                          **** 3.按照成绩降序显示 ****\n");
	printf("                                          **** 4.按照学号升序显示 ****\n");
	printf("                                          **** 5.按照姓名顺序显示 ****\n");
	printf("                                          **** 6.按照学号查询信息 ****\n");
	printf("                                          **** 7.按照姓名查询信息 ****\n");
	printf("                                          **** 8.显示学生成绩情况 ****\n");
	printf("                                          **** 9.显示学生成绩均分 ****\n");
	printf("                                          **** 0.退出学生成绩系统 ****\n");
	printf("                                          ****************************\n");
}

void Error()//错误数据处理 
{
	char choice;
	printf("                                          请输入正确的数据!\n");
	printf("                                          *请选择您接下来要进行的操作*\n");
	printf("                                          ***** 0.退出程序        ****\n");
	printf("                                          ***** 1.返回菜单        ****\n");
	choice = getchar();
	x = getchar(); 
	if(choice=='0')
	{
		printf("                                          ******* 您已退出程序 *******\n");
		exit(0); 
	}
	if(choice=='1') longjmp(envbuf,0);
	if(choice!='0'&&choice!='1') Error();
}

void Right()//用户下一步做什么 
{
	char choice;
	printf("                                          *请选择您接下来要进行的操作*\n");
	printf("                                          ***** 0.退出程序        ****\n");
	printf("                                          ***** 1.返回菜单        ****\n");
	choice = getchar();
	x = getchar(); 
	if(choice=='0')
	{
		printf("                                          ******* 您已退出程序 *******\n");
		exit(0); 
	}
	if(choice=='1') longjmp(envbuf,0);
	if(choice!='0'&&choice!='1') Error();
}

void Record_socre()//录入学生成绩 
{
	int i = 0;
	printf("                                          请输入学生人数:\n");
	scanf("%d",&number);
	x = getchar();
	printf("                                          请依次输入学生学号、姓名、性别(F为女性,M为男性)、语数外理综的考试成绩:\n");
	while(i<number)
	{
		scanf("%lld",&stu[i].ID);
		x = getchar();
		scanf("%s",stu[i].Name);
		x = getchar();
		scanf("%c",&stu[i].Sex);
		x = getchar();
		scanf("%lf %lf %lf %lf",&stu[i].Chinese,&stu[i].Math,&stu[i].English,&stu[i].Science);
		x = getchar();
		if((stu[i].Sex!='F'&&stu[i].Sex!='M')||stu[i].Chinese>100||stu[i].Chinese<0||stu[i].Math>100\
		||stu[i].Math<0||stu[i].English>100||stu[i].English<0||stu[i].Science>100||stu[i].Science<0||stu[i].ID<0)
		{
			printf("                                          请输入正确的数据!\n");
			continue;
		}
		sum[i] = stu[i].Chinese+stu[i].Math+stu[i].English+stu[i].Science;
		i++;
	}
	Judge = 1;
}

void Sum_socre()//显示总分 
{
	int i = 0;
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
		while(i<number)
		{
			printf("|%-12lld|%-12s|%-8c",stu[i].ID,stu[i].Name,stu[i].Sex);
			printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].Science,sum[i]);
			printf("\n");
			i++; 
		}
	}
}

void Sort_sum()//按总分降序排序 
{
	int i = 0,j,k,o = 0;
	double ope[50]={0}; 
	double temp,max,min;
	for(i=0;i<number;i++) ope[i] = sum[i];//赋值操作数组 
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		min = sum[0];
		for(i=0;i<number;i++)//找到最小的数 
		if(sum[i]<min)
		{
			min = sum[i];
			o = i;
		} 
		for(i=0;i<number;i++)
		{
			max = ope[o];
			k = o;
			for(j=0;j<number;j++)//找到每组中最大的数 
			{
				if(max<ope[j])
				{
					max = ope[j];
					k = j;
				}
			}
			for(j=0;j<number;j++)//清除每次最大元素 
			if(max==ope[j])
			{
				ope[j] = 0;
				break;
			}
			sign[i] = k;//对下标数组进行排序 
		}
		printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
		for(i=0;i<number;i++)
		{
			k = sign[i];
			printf("|%-12lld|%-12s|%-8c",stu[k].ID,stu[k].Name,stu[k].Sex);
			printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[k].Chinese,stu[k].Math,stu[k].English,stu[k].Science,sum[k]);
			printf("\n");
		}
	} 
}

void Sort_ID()//按学号升序排序 
{
	int i = 0,j,k,o = 0;
	long long ope[50]={0}; 
	long long temp,max,min;
	for(i=0;i<number;i++) ope[i] = stu[i].ID;//赋值操作数组 
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		max = stu[0].ID;
		for(i=0;i<number;i++)//找到最大的数 
		if(stu[i].ID>max)
		{
			max = stu[i].ID;
			o = i;
		} 
		for(i=0;i<number;i++)
		{
			min = ope[o];
			k = o;
			for(j=0;j<number;j++)//找到每组中最小的数 
			{
				if(min>ope[j])
				{
					min = ope[j];
					k = j;
				}
			}
			for(j=0;j<number;j++)//清除每次最大元素 
			if(min==ope[j])
			{
				ope[j] = 9999999999;
				break;
			}
			sign[i] = k;//对下标数组进行排序 
		}
		printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
		for(i=0;i<number;i++)
		{
			k = sign[i];
			printf("|%-12lld|%-12s|%-8c",stu[k].ID,stu[k].Name,stu[k].Sex);
			printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[k].Chinese,stu[k].Math,stu[k].English,stu[k].Science,sum[k]);
			printf("\n");
		}
	} 
}

void Sort_name()//按姓名升序排序 
{
	int i = 0,j,k,o = 0;
	char ope[50][50]; 
	char temp[50],max[50],min[50],ch[50] = {'z','z','z','z','z','z','z','z','z','z','z','z','z','z','z','z','z',};
	for(i=0;i<number;i++) strcpy(ope[i],stu[i].Name);//赋值操作数组 
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		i = 0;
		strcpy(max,stu[i].Name);
		for(i=0;i<number;i++)//找到最大的数 
		if(strcmp(stu[i].Name,max)==1)
		{
			strcpy(max,stu[i].Name);
			o = i;
		} 
		for(i=0;i<number;i++)
		{
			strcpy(min,ope[o]);
			k = o;
			for(j=0;j<number;j++)//找到每组中最小的数 
			{
				if(strcmp(min,ope[j])==1)
				{
					strcpy(min,ope[j]);
					k = j;
				}
			}
			for(j=0;j<number;j++)//清除每次最大元素 
			if(strcmp(min,ope[j])==0)
			{
				strcpy(ope[j],ch);
				break;
			}
			sign[i] = k;//对下标数组进行排序 
		}
		printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
		for(i=0;i<number;i++)
		{
			k = sign[i];
			printf("|%-12lld|%-12s|%-8c",stu[k].ID,stu[k].Name,stu[k].Sex);
			printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[k].Chinese,stu[k].Math,stu[k].English,stu[k].Science,sum[k]);
			printf("\n");
		}
	} 
}
  
void Seek_ID()//按照学号查找 
{
	int i,j = 0;
	char choice;
	long long enter;
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		again:
		printf("                                          请输入您想要查询的学号:\n");
		scanf("%lld",&enter);
		x = getchar();
		for(i=0;i<number;i++)
		{
			if(enter==stu[i].ID)
			{
				j = 1;
				printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
				printf("|%-12lld|%-12s|%-8c",stu[i].ID,stu[i].Name,stu[i].Sex);
				printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].Science,sum[i]);
				printf("\n");
				break;
			}
		}
		if(j==0) printf("                                          ****  查无此人! ****\n");
		printf("                                          您想要继续查询吗?\n");
		printf("                                          ***** 0.不再查询       *****\n");
		printf("                                          ***** 1.继续查询       *****\n");
		choice = getchar();
		x = getchar();
		if(choice=='1') goto again;
		if(choice!='0'&&choice!='1') Error();
	}
}
  
void Seek_name()//按照姓名查找
{
	int i,j = 0;
	char choice;
	char enter[30];
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		again:
		printf("                                          请输入您想要查询的姓名:\n");
		scanf("%[^\n]",enter);
		x = getchar();
		for(i=0;i<number;i++)
		{
			if(strcmp(enter,stu[i].Name)==0)
			{
				j = 1;
				printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |\n");
				printf("|%-12lld|%-12s|%-8c",stu[i].ID,stu[i].Name,stu[i].Sex);
				printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].Science,sum[i]);
				printf("\n");
				break;
			}
		}
		if(j==0) printf("                                          ****  查无此人! ****\n");
		printf("                                          您想要继续查询吗?\n");
		printf("                                          ***** 0.不再查询       *****\n");
		printf("                                          ***** 1.继续查询       *****\n");
		choice = getchar();
		x = getchar();
		if(choice=='1') goto again;
		if(choice!='0'&&choice!='1') Error();

	}
} 

void Average_graph()//显示平均分
{
	double average[50]={0};
	int i;
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		for(i=0;i<number;i++)
		{
			average[i] = sum[i]/4;
		}
		i = 0;
		printf("|学号        |姓名        |性别    |语文    |数学    |英语    |理综    |总分    |平均分  |\n");
		while(i<number)
		{
			printf("|%-12lld|%-12s|%-8c",stu[i].ID,stu[i].Name,stu[i].Sex);
			printf("|%-8.1f|%-8.1f|%-8.1f|%-8.1f|%-8.1f|",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].Science,sum[i]);
			printf("%-8.1f|\n",average[i]);
			i++; 
		}
	}
} 

void Percent_graph()//各学科成绩情况显示
{
	int a[4]={0},b[4]={0},c[4]={0},d[4]={0},e[4]={0},i;
	if(Judge==0) printf("                                          您尚未录入学生成绩!\n");
	else
	{
		for(i=0;i<number;i++)//语文 
		{
			if(stu[i].Chinese>=90) a[0]++;
			else if(stu[i].Chinese>=80&&stu[i].Chinese<=89) b[0]++;
			else if(stu[i].Chinese>=70&&stu[i].Chinese<=79) c[0]++;
			else if(stu[i].Chinese>=60&&stu[i].Chinese<=69) d[0]++;
			else e[0]++;
		}
		for(i=0;i<number;i++)//数学 
		{
			if(stu[i].Math>=90) a[1]++;
			else if(stu[i].Math>=80&&stu[i].Math<=89) b[1]++;
			else if(stu[i].Math>=70&&stu[i].Math<=79) c[1]++;
			else if(stu[i].Math>=60&&stu[i].Math<=69) d[1]++;
			else e[1]++;
		}
		for(i=0;i<number;i++)//英语 
		{
			if(stu[i].English>=90) a[2]++;
			else if(stu[i].English>=80&&stu[i].English<=89) b[2]++;
			else if(stu[i].English>=70&&stu[i].English<=79) c[2]++;
			else if(stu[i].English>=60&&stu[i].English<=69) d[2]++;
			else e[2]++;
		}
		for(i=0;i<number;i++)//理综
		{
			if(stu[i].Science>=90) a[3]++;
			else if(stu[i].Science>=80&&stu[i].Science<=89) b[3]++;
			else if(stu[i].Science>=70&&stu[i].Science<=79) c[3]++;
			else if(stu[i].Science>=60&&stu[i].Science<=69) d[3]++;
			else e[3]++;
		}
		printf("|学科  |优秀人数 |优秀占比 |良好人数 |良好占比 |中等人数 |中等占比 |及格人数  \
	|及格占比 |不及格人数|不及格占比|\n");
		printf("|语文  |%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-10d|%-9.2f%%|\n",a[0],100*(double)a[0]/number,b[0]\
		,100*(double)b[0]/number,c[0],100*(double)c[0]/number,d[0],100*(double)d[0]/number,e[0],100*(double)e[0]/number);
		printf("|数学  |%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-10d|%-9.2f%%|\n",a[1],100*(double)a[1]/number,b[1]\
		,100*(double)b[1]/number,c[1],100*(double)c[1]/number,d[1],100*(double)d[1]/number,e[2],100*(double)e[1]/number);
		printf("|英语  |%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-10d|%-9.2f%%|\n",a[2],100*(double)a[2]/number,b[2]\
		,100*(double)b[2]/number,c[2],100*(double)c[2]/number,d[2],100*(double)d[2]/number,e[2],100*(double)e[2]/number);
		printf("|理综  |%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-9d|%-8.2f%%|%-10d|%-9.2f%%|\n",a[3],100*(double)a[3]/number,b[3]\
		,100*(double)b[3]/number,c[3],100*(double)c[3]/number,d[3],100*(double)d[3]/number,e[3],100*(double)e[3]/number);
	}
}

关于头文件#include <setjmp.h>的用法可以参考其他博主,这一点理解有点复杂但是应用起来是不难的,以上便是全部代码,感谢阅览一名初学者所写的第一篇博客吧!

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值