学生成绩管理

学生成绩管理

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

char obj[][20]={"语文","英语","数学"};

typedef struct _Stu
{
	int term;//学期
	char class_num[10];//班级
	char num[20];//学号
	int score[3];//成绩
	char name[20];//姓名
	int sum;//总分
}STU,*PSTU;

//显示学生信息
void Display(PSTU stu,int n)
{
	int i,j;
	printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","班级","学号","姓名",obj[0],obj[1],obj[2],"总分","平均分");
	for(i=0;i<n;i++)
	{
		printf("%-10s",stu[i].class_num);
		printf("%-10s",stu[i].num);
		printf("%-10s",stu[i].name);
		for(j=0;j<3;j++)//依次输出语数英成绩
		{
			printf("%-10d",stu[i].score[j]);
		}
		printf("%-10d",stu[i].sum);
		printf("%-10.2f\n",stu[i].sum/3.0);
	}
}

void Total_Obj(PSTU stu,int n)//统计不及格科目
{
	int choice,i;
	system("cls");
	printf("请选择要统计的科目:\n");
	printf("1:语文   2:数学   3:英语\n");
	scanf("%d",&choice);
	if(choice<=3&&choice>=1)
	{
		choice--;//把选择变成对应下标
	}
	else
	{
		printf("选择错误!\n");
		system("pause");
		return ;
	}
	printf("%-10s%-10s%-10s%-10s\n","班级","学号","姓名",obj[choice]);
	for(i=0;i<n;i++)
	{
		if(stu[i].score[choice]<60)//如果分数低于60分 不及格
		{
			printf("%-10d",stu[i].class_num);
			printf("%-10d",stu[i].num);
			printf("%-10s",stu[i].name);
			printf("%-10d\n",stu[i].score[choice]);
		}
	}
	system("pause");
}

void Modify_Info(PSTU stu,int n)//修改成绩信息
{
	int i,j;
	char no[20];
	system("cls");
	printf("请输入要修改的学生学号:");
	scanf("%s",no);
	for(i=0;i<n;i++)
	{
		if(!strcmp(no,stu[i].num))
		{
			break;
		}
	}
	if(i==n)//遍历数组没找到
	{
		printf("无该学生信息!\n");
		system("pause");
		return ;
	}

	Display(&stu[i],1);//找到后显示

	stu[i].sum=0;
	for(j=0;j<3;j++)
	{
		printf("请输入%s成绩:",obj[j]);
		scanf("%d",&stu[i].score[j]);
		stu[i].sum+=stu[i].score[j];
	}

	printf("修改成功!\n");
	system("pause");
}

//添加新的信息
int Add_New_Info(PSTU stu,int n)
{
	int i;
	system("cls");
	printf("请输入当前学期:");
	scanf("%d",&stu[n].term);
	printf("请输入班级:");
	scanf("%s",&stu[n].class_num);
	printf("请输入学号:");
	scanf("%s",&stu[n].num);
	printf("请输入姓名:");
	scanf("%s",&stu[n].name);
	stu[n].sum=0;//记录总分
	for(i=0;i<3;i++)
	{
		printf("请输入%s成绩:",obj[i]);
		scanf("%d",&stu[n].score[i]);
		stu[n].sum+=stu[n].score[i];
	}

	printf("\n录入成功!\n");
	system("pause");
	return n+1;
}

//保存信息
void Save_Info(PSTU stu,int n)
{
	int i;
	FILE* pFile;
	pFile= fopen("stu.dat","w+");
	if(pFile==NULL)
	{
		return;
	}
	for(i=0;i<n;i++)
	{
		fwrite(&stu[i],1,sizeof(STU),pFile);
	}
	fclose(pFile);
}
//读取信息
int Read_Info(PSTU stu)
{
	int i=0;
	FILE* pFile;
	pFile= fopen("stu.dat","r+");
	if(pFile==NULL)
	{
		return 0;
	}
	while(fread(&stu[i++],1,sizeof(STU),pFile));
	fclose(pFile);
	if(i>=1)
	{
		return i-1;
	}
	return 0;
}

int menu()
{
	int choice;
	system("cls");
	printf("1:录入学生信息\n");
	printf("2:修改学生信息\n");
	printf("3:统计学生成绩\n");
	printf("4:根据学号查询\n");
	printf("5:根据科目统计\n");
	printf("6:根据班级显示\n");
	printf("0:退出\n");
	printf("请输入选择:");
	scanf("%d",&choice);
	while(choice<0||choice>6)//确保没有超出范围
	{
		printf("请重新输入选择:");
		scanf("%d",&choice);
	}
	return choice;
}

void Search_Class(PSTU stu,int n)
{
	int i;
	char no[20];
	system("cls");
	printf("请输入要查找的班级:");
	scanf("%s",no);
	for(i=0;i<n;i++)//根据班级号查找
	{
		if(!strcmp(no,stu[i].class_num))
		{
			Display(&stu[i],1);
		}
	}
	system("pause");
}

void Search_Info(PSTU stu,int n)
{
	int i;
	char no[20];
	system("cls");
	printf("请输入要查找的学号:");
	scanf("%d",no);
	for(i=0;i<n;i++)//根据学号查找
	{
		if(!strcmp(no,stu[i].num))
		{
			Display(&stu[i],1);
		}
	}
	system("pause");
}

void Sort(PSTU stu,int n)//对总分进行排序  总分高平均分就高
{
	int i,j;
	STU temp;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(stu[i].sum<stu[j].sum)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
		}
	}
}

int main()
{
	STU stu[100];
	int NUM=0;
	int choice;
	NUM=Read_Info(stu);//加载文件
	do
	{
		choice=menu();
		switch(choice)
		{
		case 1:
			NUM=Add_New_Info(stu,NUM);
			break;
		case 2:
			Modify_Info(stu,NUM);
			break;
		case 3:
			system("cls");
			Sort(stu,NUM);
			Display(stu,NUM);
			system("pause");
			break;
		case 4:
			Search_Info(stu,NUM);
			break;
		case 5:
			Total_Obj(stu,NUM);
			break;
		case 6:
			Search_Class(stu,NUM);
			break;
		}
	}while(choice!=0);
	Save_Info(stu,NUM);//保存文件
	return 0;
}