成绩管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STU_NUM 40	//信息最大存储数

int DAY[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
//记录平年闰年每个月的天数DAY[0]为平年 DAY[1]为闰年


typedef struct 
{
	char no[20];//学号
	char name[20];//姓名
	char sex[5];//性别
	int time[3];//出生日期
	int score[3];//分数
	float avg;//平均分
}STU;//结构体类型为STU  

void PRINT();
void Dis_Stu_Info(STU stu[],int n);
//两个函数的声明

//添加学生信息  直接加在数组尾部  尾部元素是stu[n]
int Add_Stu_Info(STU stu[],int n)
{
	int i,flag=0;
	char temp[20];
	system("cls");
	do
	{
		flag=0;//flag为0说明没有重复学号
		printf("请输入学生学号:");
		scanf("%s",temp);
		for(i=0;i<n;i++)
		{
			if(!strcmp(temp,stu[i].no))//遍历结构体数组  如果有相同学号
			{
				flag=1;//flag变成1
				break;//相同跳出循环
			}
		}
		if(flag)//如果是1 说明重复
		{
			printf("已存在该学号,请重新输入!\n");
		}
		else//如果没有重复  把学号添加到最后一个元素中
		{
			strcpy(stu[n].no,temp);
		}
	}while(flag);//如果重复就循环

	printf("请输入学生姓名:");
	scanf("%s",&stu[n].name);
	printf("请输入学生性别:");
	scanf("%s",&stu[n].sex);

	do
	{
		flag=0;
		printf("请输入学生生日(y-m-d):");
		scanf("%d-%d-%d",&stu[n].time[0],&stu[n].time[1],&stu[n].time[2]);
		if(stu[n].time[0]>=1980&&stu[n].time[0]<=2000)//年份是否满足1980-2000
		{
			if(stu[n].time[1]>=1&&stu[n].time[1]<=12)//日期是否满足1-12月
			{
				if((stu[n].time[0]/4==0 && stu[n].time[0]/100!=0) || (stu[n].time[0]/400==0))
				{
					flag=1;//判断闰年 如果flag是1 就是闰年  0就是平年
				}
				if(stu[n].time[2]<=DAY[flag][stu[n].time[1]-1]&&stu[n].time[2]>=1)   
				{//DAY[flag][stu[n].time[1]-1]   tu[n].time[1]-1  输入的1-12代表月份 在数组的0-11保存 所以对应-1
					break;//如果都满足  跳出循环
				}
			}
		}
		printf("日期不正确!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生程序设计分数:");
		scanf("%d",&stu[n].score[0]);
		if(stu[n].score[0]>=0&&stu[n].score[0]<=100)//分数要满足0-100才能跳出录入
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生高等数学分数:");
		scanf("%d",&stu[n].score[1]);
		if(stu[n].score[1]>=0&&stu[n].score[1]<=100)
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生大学英语分数:");
		scanf("%d",&stu[n].score[2]);
		if(stu[n].score[2]>=0&&stu[n].score[2]<=100)
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	stu[n].avg=(stu[n].score[0]+stu[n].score[1]+stu[n].score[2])/3.0;//平均分是三科之和除以3
	
	PRINT();//显示中文提示
	Dis_Stu_Info(&stu[n],1);//显示新录入的学生信息
	printf("录入成功!\n");
	n++;//结构体数组 元素增大一
	system("pause");
	return n;//返回新的数量给主函数
}

/*输入学生信息*/
int Input_Stu_Info(STU stu[],int n)
{
	char temp[20];
	do
	{
		n=Add_Stu_Info(stu,n);//调用输入函数
		printf("是否继续录入(Y/N)!\n");//询问是否继续输入
		scanf("%s",temp);
	}while(!strcmp(temp,"Y")||!strcmp(temp,"y"));//如果输入y  Y则继续输入
	return n;
}

void Modify_Stu_Info(STU stu[],int n)
{
	int i,flag=0;
	char temp[20];
	system("cls");

	flag=0;
	printf("请输入要修改的学生学号:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,stu[i].no))//遍历结构体数组  如果有相同的
		{
			flag=1;//说明找到这个学号
			break;
		}
	}
	if(!flag)//如果flag是0
	{
		printf("无该学号!\n");
		system("pause");
		return ;//函数结束
	}

	//否则输入新的信息
	printf("请输入学生姓名:");
	scanf("%s",&stu[i].name);
	printf("请输入学生性别:");
	scanf("%s",&stu[i].sex);

	do
	{
		flag=0;
		printf("请输入学生生日(y-m-d):");
		scanf("%d-%d-%d",&stu[i].time[0],&stu[i].time[1],&stu[i].time[2]);
		if(stu[i].time[0]>=1980&&stu[i].time[0]<=2000)
		{
			if(stu[i].time[1]>=1&&stu[i].time[1]<=12)
			{
				if((stu[i].time[0]/4==0 && stu[i].time[0]/100!=0) || (stu[i].time[0]/400==0))
				{
					flag=1;
				}
				if(stu[i].time[2]<=DAY[flag][stu[i].time[1]-1]&&stu[i].time[2]>=1)   //判断闰年
				{
					break;
				}
			}
		}
		printf("日期不正确!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生程序设计分数:");
		scanf("%d",&stu[i].score[0]);
		if(stu[i].score[0]>=0&&stu[i].score[0]<=100)
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生高等数学分数:");
		scanf("%d",&stu[i].score[1]);
		if(stu[i].score[1]>=0&&stu[i].score[1]<=100)
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	do
	{
		printf("请输入学生大学英语分数:");
		scanf("%d",&stu[i].score[2]);
		if(stu[i].score[2]>=0&&stu[i].score[2]<=100)
		{
			break;
		}
		printf("成绩范围错误!重新输入!\n");
	}while(1);

	stu[i].avg=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
	
	printf("修改成功!\n");
	system("pause");
}

//删除学生信息
int Del_Stu_Info(STU stu[],int n)
{
	int i,flag=0,j;
	char temp[20];
	system("cls");

	flag=0;
	printf("请输入要删除的学生学号:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,stu[i].no))
		{
			flag=1;//同样 找到则跳出
			break;
		}
	}
	if(!flag)
	{
		printf("无该学号!\n");
		system("pause");
		return n;
	}
	
	PRINT();//找到后输出这个学生的信息
	Dis_Stu_Info(&stu[i],1);

	printf("确认删除(Y/N)?");//询问是否删除
	scanf("%s",temp);
	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))
	{
		for(j=i;j<n;j++)//每一个数组元素都前移  达到删除效果   1 2 3  删除2 变成 1 3 3但是计数器变2 只显示1  3
		{
			stu[j]=stu[j+1];
		}
		n--;//计数器减一
		printf("删除成功!\n");
	}
	else
	{
		printf("取消删除成功!\n");
	}
	system("pause");
	return n;
}

int menu(STU stu[],int n)
{
	int chioce;
	system("cls");
	if(n!=0)
	{
		PRINT();//显示中文提示
		Dis_Stu_Info(stu,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("10:统计各科成绩\n");
	printf("11:一门课程不合格\n");
	printf("0: 退出\n");
	printf("请输入选择:");
	scanf("%d",&chioce);
	while(chioce<0||chioce>11)//判断选择是否正确
	{
		printf("请重新输入:");
		scanf("%d",&chioce);
	}
	return chioce;//返回给主函数
}

void PRINT()
{
	printf("%-20s","学号");
	printf("%-20s","姓名");
	printf("%-10s","性别");
	printf("%-20s","出生日期");
	printf("%-20s","程序设计");
	printf("%-20s","高等数学");
	printf("%-20s","大学英语");
	printf("%-20s","平均成绩");
	printf("\n");
}

//显示信息  stu是要显示的首地址  n是要显示的个数
void Dis_Stu_Info(STU stu[],int n)
{
	int i;
	if(n==0)
	{
		printf("无学生信息!\n");
		system("pause");
		return ;
	}
	for(i=0;i<n;i++)
	{
		printf("%-20s",stu[i].no);
		printf("%-20s",stu[i].name);
		printf("%-10s",stu[i].sex);
		printf("%4d-%-2d-%-12d",stu[i].time[0],stu[i].time[1],stu[i].time[2]);
		printf("%-20d",stu[i].score[0]);
		printf("%-20d",stu[i].score[1]);
		printf("%-20d",stu[i].score[2]);
		printf("%-20g",stu[i].avg);
		printf("\n");
	}
}


/*对分数进行排序  */
void Sort_Score(STU stu[],int n,int m)//m代表第几科
{
	int i,j;
	STU temp;
	if(m==3)//如果m是3  则对平均分排序
	{
		for(i=0;i<n;i++)
		{
			for(j=i+1;j<n;j++)
			{
				if(stu[i].avg<stu[j].avg)
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
			}
		}
	}
	else
	{
		for(i=0;i<n;i++)
		{
			for(j=i+1;j<n;j++)
			{
				if(stu[i].score[m]<stu[j].score[m])//否则对第m门课排序
				{
					temp=stu[i];
					stu[i]=stu[j];
					stu[j]=temp;
				}
			}
		}
	}
}

/*分数排序菜单*/
void Sort_Score_Menu(STU stu[],int n)
{
	int chioce;
	do
	{
		system("cls");
		printf("1:按程序设计\n");
		printf("2:按高等数学\n");
		printf("3:按大学英语\n");
		printf("4:按平均成绩\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>4)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 0:
			return;
			break;
		case 1:
		case 2:
		case 3:
		case 4:
			Sort_Score(stu,n,chioce-1);
			break;
		}
		system("cls");
		PRINT();
		Dis_Stu_Info(stu,n);//对排序后的数据显示
		system("pause");
	}while(1);
}

/*对学号进行排序*/
void Sort_No(STU stu[],int n)
{
	int i,j;
	STU temp;

	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(stu[i].no,stu[j].no)>0)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
		}
	}
}

/*对名字进行排序*/
void Sort_Name(STU stu[],int n)
{
	int i,j;
	STU temp;

	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(stu[i].name,stu[j].name)>0)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
		}
	}
}

/*学生排序信息菜单*/
void Sort_Stu_Info_Menu(STU stu[],int n)
{
	int chioce;
	do
	{
		system("cls");
		printf("1:按学号排序\n");
		printf("2:按姓名排序\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>2)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 0:
			return ;
			break;
		case 1:
			Sort_No(stu,n);
			break;
		case 2:
			Sort_Name(stu,n);
			break;
		}
		system("cls");
		PRINT();
		Dis_Stu_Info(stu,n);
		system("pause");//打印排序后的信息

	}while(1);
}

/*保存文件信息*/
void Save_Stu_Info(STU stu[],int n)
{
	int i;
	FILE* fp;//文件指针
	fp=fopen("Stu_Info.dat","w");//打开文件
	for(i=0;i<n;i++)
	{
		fwrite(&stu[i],1,sizeof(STU),fp);//向文件写入
	}
	fclose(fp);//关闭文件
}

void Load_Stu_Info(STU stu[],int* n)//加载文件
{
	FILE* fp;
	fp=fopen("Stu_Info.dat","r");
	if(fp==NULL)
	{
		return ;
	}
	while(fread(&stu[*n],1,sizeof(STU),fp))
	{
		(*n)++;
	}
	fclose(fp);
}
/*按名字查找*/
void Serach_Name(STU stu[],int n)
{
	int i,flag;
	char temp[20];
	system("cls");
	printf("请输入要查找的姓名:");
	scanf("%s",temp);
	flag=1;
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,stu[i].name))
		{
			if(flag)//flag可以确保只输出一次 PRINT
			{
				PRINT();
			}
			Dis_Stu_Info(&stu[i],1);
			flag=0;
		}
	}
	if(flag)
	{
		printf("无该姓名信息!\n");
	}
	system("pause");
}


/*按年龄查找*/
void Serach_Age(STU stu[],int n)
{
	int i,flag;
	int temp;
	system("cls");
	printf("请输入要查找的年份:");
	scanf("%d",&temp);
	flag=1;
	for(i=0;i<n;i++)
	{
		if(temp==stu[i].time[0])
		{
			if(flag)
			{
				PRINT();
			}
			Dis_Stu_Info(&stu[i],1);
			flag=0;
		}
	}
	if(flag)
	{
		printf("无该姓名信息!\n");
	}
	system("pause");
}
/*按性别查找*/
void Serach_Sex(STU stu[],int n)
{
	int i,flag;
	char temp[20];
	system("cls");
	printf("请输入要查找的性别:");
	scanf("%s",temp);
	flag=1;
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,stu[i].sex))
		{
			if(flag)
			{
				PRINT();
			}
			Dis_Stu_Info(&stu[i],1);
			flag=0;
		}
	}
	if(flag)
	{
		printf("无该姓名信息!\n");
	}
	system("pause");
}
/*查找菜单*/
void Serach_Stu_Info_Menu(STU stu[],int n)
{
	int chioce;
	do
	{
		system("cls");
		printf("1:按姓名查找\n");
		printf("2:按年龄查找\n");
		printf("3:按性别查找\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>3)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 1:
			Serach_Name(stu,n);
			break;
		case 2:
			Serach_Age(stu,n);
			break;
		case 3:
			Serach_Sex(stu,n);
			break;
		}
	}while(chioce!=0);	
}

/*对某个区间内的分数进行查找   m代表第几门课  min-max代表区间*/
void Serach_Score(STU stu[],int n,int m,int min,int max)
{
	int i,flag;
	system("cls");
	flag=0;
	for(i=0;i<n;i++)
	{
		if(stu[i].score[m]>min&&stu[i].score[m]<max)
		{
			if(flag==0)
			{
				PRINT();
			}
			Dis_Stu_Info(&stu[i],1);
			flag++;//flag记录人数
		}
	}
	if(flag==0)
	{
		printf("无符合信息学生!\n");
	}
	else
	{
		printf("符合信息人数共有:%d人!\n",flag);
	}
	system("pause");
}

/*查找学生分数菜单*/
void Serach_Stu_Score_Menu(STU stu[],int n)
{
	int chioce;
	int min,max;
	do
	{
		system("cls");
		printf("1:程序设计\n");
		printf("2:高等数学\n");
		printf("3:大学英语\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>3)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		if(chioce!=0)
		{
			printf("请输入要查询的下界:");
			scanf("%d",&min);
			printf("请输入要查询的上界:");
			scanf("%d",&max);
		}
		switch(chioce)
		{
		case 1:
		case 2:
		case 3:
			Serach_Score(stu,n,chioce-1,min,max);
			break;
		}
	}while(chioce!=0);	
}

/*查找最高分*/
void Serach_Max_Score(STU stu[],int n,int m)
{
	int i;
	int max=stu[0].score[m];
	for(i=1;i<n;i++)
	{
		if(max<stu[i].score[m])
		{
			max=stu[i].score[m];
		}
	}
	printf("该科最高分为:%d\n",max);
	system("pause");
}

void Serach_Max_Score_Menu(STU stu[],int n)
{
	int chioce;
	do
	{
		system("cls");
		printf("1:程序设计\n");
		printf("2:高等数学\n");
		printf("3:大学英语\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>3)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 1:
		case 2:
		case 3:
			Serach_Max_Score(stu,n,chioce-1);
			break;
		}
	}while(chioce!=0);	
}

//统计分数段
void Total_Score(STU stu[],int n,int m)
{
	int i;
	int sum[5]={0};
	system("cls");
	for(i=0;i<n;i++)
	{
		switch(stu[i].score[m]/10)//分数除以10
		{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			sum[4]++;
			break;
		case 6:
			sum[3]++;
			break;
		case 7:
			sum[2]++;
			break;
		case 8:
			sum[1]++;
			break;
		case 9:
		case 10:
			sum[0]++;
			break;
		}
	}
	printf("%-15s%-10s%10s\n","成绩段","人数","百分比");
	printf("%-15s%-10d%10g%%\n","90 - 100",sum[0],sum[0]*100.0/n);
	printf("%-15s%-10d%10g%%\n","80 - 89",sum[1],sum[1]*100.0/n);
	printf("%-15s%-10d%10g%%\n","70 - 79",sum[2],sum[2]*100.0/n);
	printf("%-15s%-10d%10g%%\n","60 - 69",sum[3],sum[3]*100.0/n);
	printf("%-15s%-10d%10g%%\n"," 0 - 59",sum[4],sum[4]*100.0/n);
	system("pause");
}

//查找只有一科不合格的人
void Sreach_Pass_Info(STU stu[],int n)
{
	int i,j,sum;
	system("cls");
	PRINT();
	for(i=0;i<n;i++)
	{
		sum=0;
		for(j=0;j<3;j++)
		{
			if(stu[i].score[j]<60)
			{
				sum++;
			}
		}
		if(sum==1)
		{
			Dis_Stu_Info(&stu[i],1);
		}
	}
	system("pause");
}

void Total_Score_Menu(STU stu[],int n)
{
	int chioce;
	do
	{
		system("cls");
		printf("1:程序设计\n");
		printf("2:高等数学\n");
		printf("3:大学英语\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>3)
		{
			printf("重新输入:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 1:
		case 2:
		case 3:
			Total_Score(stu,n,chioce-1);
			break;
		}
	}while(chioce!=0);	
}

int main()
{
	int chioce;
	STU stu[MAX_STU_NUM];
	int NUM=0;//记录学生人数
	Load_Stu_Info(stu,&NUM);
	system("mode con: cols=140 lines=40");//设置控制台大小
	do
	{
		chioce=menu(stu,NUM);
		switch(chioce)
		{
		case 1:
			NUM = Input_Stu_Info(stu,NUM);
			Save_Stu_Info(stu,NUM);
			break;
		case 2:
			NUM = Add_Stu_Info(stu,NUM);
			Save_Stu_Info(stu,NUM);
			break;
		case 3:
			Modify_Stu_Info(stu,NUM);
			Save_Stu_Info(stu,NUM);
			break;
		case 4:
			NUM=Del_Stu_Info(stu,NUM);
			Save_Stu_Info(stu,NUM);
			break;
		case 5:
			Sort_Score_Menu(stu,NUM);
			break;
		case 6:
			Sort_Stu_Info_Menu(stu,NUM);
			break;
		case 7:
			Serach_Stu_Info_Menu(stu,NUM);
			break;
		case 8:
			Serach_Stu_Score_Menu(stu,NUM);
			break;
		case 9:
			Serach_Max_Score_Menu(stu,NUM);
			break;
		case 10:
			Total_Score_Menu(stu,NUM);
			break;
		case 11:
			Sreach_Pass_Info(stu,NUM);
			break;
		}
	}while(chioce!=0);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值