学生成绩管理系统

学生成绩管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _STU
{
	int no;//学号
	char name[20];//姓名
	int score[6];//分数
	int num;//有多少门课
	int sum;//总分
}STU,*PSTU; 

void Print_Stu_Info(PSTU stu,int n)
{
	int i,j;
	float sum;
	system("cls");
	printf("%-10s%-10s%-24s%-5s%-5s\n","学号","姓名","成绩","总分","平均分");
	for(i=0;i<n;i++)
	{
		printf("%-10d%-10s",stu[i].no,stu[i].name);
		for(j=0,sum=0;j<stu[i].num;j++)
		{
			printf("%-4d",stu[i].score[j]);
		}
		while(j<6)
		{
			printf("%-4s","");
			j++;
		}
		printf("%-5d",stu[i].sum);
		printf("%-5.2f\n",stu[i].sum*1.0/stu[i].num);
	}
	system("pause");
}

void Sort_Sum_High_To_Low(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;
			}
		}
	}
	system("cls");
	printf("%-10s%-10s%-24s%-5s%-8s%-5s\n","学号","姓名","成绩","总分","平均分","名次");
	for(i=0;i<n;i++)
	{
		printf("%-10d%-10s",stu[i].no,stu[i].name);
		for(j=0;j<stu[i].num;j++)
		{
			printf("%-4d",stu[i].score[j]);
		}
		while(j<6)
		{
			printf("%-4s","");
			j++;
		}
		printf("%-5d",stu[i].sum);
		printf("%-8.2f",stu[i].sum*1.0/stu[i].num);
		printf("%-5d\n",i+1);
	}
	system("pause");
}

void Sort_No_Low_To_High(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].no>stu[j].no)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
		}
	}
	Print_Stu_Info(stu,n);
}

void Sort_Name_Low_To_High(PSTU 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;
			}
		}
	}
	Print_Stu_Info(stu,n);
}

int Add_New_Stu(PSTU stu,int n)
{
	int i;
	system("cls");
	printf("输入学号:");
	scanf("%d",&stu[n].no);
	printf("输入姓名:");
	scanf("%s",stu[n].name);
	printf("有多少门课:");
	scanf("%d",&stu[n].num);
	stu[n].sum=0;
	for(i=0;i<stu[n].num;i++)
	{
		printf("第%d门课成绩:",i+1);
		scanf("%d",&stu[n].score[i]);
		stu[n].sum += stu[n].score[i];
	}
	printf("录入成功!\n");
	system("pause");
	return n+1;
}

void Save_Info(PSTU stu,int n)
{
	int i;
	char path[100];
	FILE* pFile;
	system("cls");
	printf("请输入保存文件路径:");
	scanf("%s",path);
	pFile= fopen(path,"w+");
	if(pFile==NULL)
	{
		printf("文件保存失败!\n");
		system("pause");
		return;
	}
	for(i=0;i<n;i++)
	{
		fwrite(&stu[i],1,sizeof(STU),pFile);
	}
	fclose(pFile);
	printf("文件保存成功!\n");
	system("pause");
}

int Read_Info(PSTU stu)
{
	int i=0;
	char path[100];
	FILE* pFile;
	system("cls");
	printf("请输入读取文件路径:");
	scanf("%s",path);
	pFile= fopen(path,"r+");
	if(pFile==NULL)
	{
		printf("文件读取失败!\n");
		system("pause");
		return 0;
	}
	while(fread(&stu[i++],1,sizeof(STU),pFile));
	fclose(pFile);
	printf("文件读取成功!\n");
	system("pause");
	if(i>=1)
	{
		return i-1;
	}
	return 0;
}

int menu()
{
	int choice;
	system("cls");

	printf("1:Read from a file\n");
	printf("2:Calculate total and average score of every course\n");
	printf("3:Calculate total and average score of every student\n");
	printf("4:Sort in descending order by total score of every student\n");
	printf("5:Sort in ascending order by number\n");
	printf("6:Sort in dictionary order by name\n");
	printf("7:Search by number\n");
	printf("8:Search by name\n");
	printf("9:Statistic analysis for every course\n");
	printf("10:List record\n");
	printf("11:Write to file\n");
	printf("0:Exit\n");
	printf("12:测试输入\n");
	printf("Please choice:");
	scanf("%d",&choice);
	while(choice<0||choice>12)
	{
		printf("Please choice again:");
		scanf("%d",&choice);
	}

	return choice;
}

void Calc_Stu_Sum(PSTU stu,int n)
{
	int i;
	system("cls");
	printf("%-10s%-10s%-5s%-5s\n","学号","姓名","总分","平均分");
	for(i=0;i<n;i++)
	{
		printf("%-10d%-10s",stu[i].no,stu[i].name);
		printf("%-5d",stu[i].sum);
		printf("%-5.2f\n",1.0*stu[i].sum/stu[i].num);
	}
	system("pause");
}

void Calc_Course_Sum(PSTU stu,int n)
{
	int i,j;
	float sum[6]={0};
	system("cls");
	printf("%-10s%-10s%-5s%-5s\n","学号","姓名","总分","平均分");
	for(i=0;i<n;i++)
	{
		printf("%-10d%-10s",stu[i].no,stu[i].name);
		for(j=0;j<stu[i].num;j++)
		{
			sum[j]+=stu[i].score[j];
		}
	}
	for(i=0;i<stu[i].num;i++)
	{
		printf("科目%d  总分:%5.0f   平均分:%5.2f\n",i+1,sum[i],sum[i]/n);
	}
	system("pause");
}

void Search_By_No(PSTU stu,int n)
{
	int temp,i;
	system("cls");
	printf("请输入要查找的学号:");
	scanf("%d",&temp);
	for(i=0;i<n;i++)
	{
		if(temp==stu[i].no)
		{
			Print_Stu_Info(&stu[i],1);
			return ;
		}
	}
	printf("无该学号信息!\n");
	system("pause");
}

void Search_By_Name(PSTU stu,int n)
{
	int i;
	char temp[20];
	system("cls");
	printf("请输入要查找的名字:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,stu[i].name))
		{
			Print_Stu_Info(&stu[i],1);
			return ;
		}
	}
	printf("无该姓名信息!\n");
	system("pause");
}

void Total_All_info(PSTU stu,int n)
{
	int i,j,sum[6][5]={0};
	system("cls");
	for(i=0;i<n;i++)
	{
		for(j=0;j<stu[i].num;j++)
		{
			switch(stu[i].score[j]/10)
			{
			case 10:
			case 9:
				sum[j][0]++;
				break;
			case 8:
				sum[j][1]++;
				break;
			case 7:
				sum[j][2]++;
				break;
			case 6:
				sum[j][3]++;
				break;
			default:
				sum[j][4]++;
				break;
			}
		}
	}
	printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","","优秀","良好","中等","及格","不及格");
	for(i=0;i<stu[0].num;i++)
	{
		printf("科目%-5d",i+1);
		for(j=0;j<5;j++)
		{
			printf(" %-2d %-4.2f%% ",sum[i][j],sum[i][j]*1.0/n*100);
		}
		printf("\n");
	}
	system("pause");
}


int main()
{
	int choice;
	STU stu[30];
	int NUM=0;//记录人数
	do
	{
		choice=menu();
		switch(choice)
		{
		case 1:
			NUM=Read_Info(stu);
			break;
		case 2:
			Calc_Course_Sum(stu,NUM);
			break;
		case 3:
			Calc_Stu_Sum(stu,NUM);
			break;
		case 4:
			Sort_Sum_High_To_Low(stu,NUM);
			break;
		case 5:
			Sort_No_Low_To_High(stu,NUM);
			break;
		case 6:
			Sort_Name_Low_To_High(stu,NUM);
			break;
		case 7:
			Search_By_No(stu,NUM);
			break;
		case 8:
			Search_By_Name(stu,NUM);
			break;
		case 9:
			Total_All_info(stu,NUM);
			break;
		case 10:
			Print_Stu_Info(stu,NUM);
			break;
		case 11:
			Save_Info(stu,NUM);
			break;
		case 12:
			NUM=Add_New_Stu(stu,NUM);
			break;
		}
	}while(choice!=0);

	return 0;
}