作业--学生成绩管理系统

学生成绩管理系统V5.0

某班最多有30人(具体人数由键盘输入)参加期末考试,考试科目为数学(MT)、英语(EN)和物理(PH)。定义结构体类型,用结构体数组作函数参数,编程实现如下菜单驱动的学生成绩管理系统:

1.录入每个学生的学号、姓名和各科考试成绩;

2.计算每门课程的总分和平均分;

3.计算每个学生的总分和平均分;

4.按每个学生的总分由高到低排出名次表;

5.按每个学生的总分由低到高排出名次表;

6.按学号由小到大排出成绩表;

7.按姓名的字典顺序排出成绩表;

8.按学号查询学生排名及其考试成绩;

9.按姓名查询学生排名及其考试成绩;

10.按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数及所占的百分比;

11.输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分。

要求程序运行后先显示如下菜单,并提示用户输入选项,根据用户输入的选项执行相应的操作。

1.Append record

2.Caculate total and average score of every course

3.Caculate total and average score of every student

4.Sort in descending order by total score of every student

5.Sort in ascending order by total score of every student

6.Sort in ascending order by number

7.Sort in dictionary order by name

8.Search by number

9.Search by name

10.Statistic analysis for every course

11.List record

0.Exit

Please enter your choice:

实验目的:在掌握基本编程结构、函数的基础上,通过增加任务要求,熟悉结构体类型、结构体数组作函数参数、模块化程序设计方法,体会用结构体类型代替普通数组类型实现数据库管理的优越性。

思考:

1.参考教材上的例题,用动态单向链表代替结构体数组,编程实现;

2.在1的基础上,增加“删除记录”和“插入记录”的功能,体会动态链表与结构体数组的不同点和优缺点。

第一次体验到因代码而产生的成就感,也让我更加确信了当初报考计算机专业的决心,心情澎湃,通过这次作业也算是初步了解到了程序猿工作的一部分,期待我成为程序员的那一天。

 #include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int temp=0; //记录上一次结构体的位置 
typedef struct  //记录数据的结构体 
{
char a[30]; //学号
   char str[10];//姓名
   int MT;
   int  EN;
   int PH;
	
}STU;
STU stu[100]; 
void FirstPage(); //首页选项 
void Record();//记录成绩 
void ProAverage(); //每门课程的总分和平均分 
void StuAverage(); //计算每个学生的总分和平均分
void SortSumUp();//按每个学生的总分由高到低排出名次表
int cmpup(int a,int b); //自定义排序函数 由大到小 
void SortSumDown(); //按每个学生的总分由低到高排出名次表
void IdSortDown();//按学号由小到大排出成绩表
bool IdCmpDOWN(STU x,STU y); //自定义结构体排序学号从大到小 
void Dictionary();//字典序排序 
bool cmpdic(STU x,STU y);//字典序排序 
void CheckId();//按学号查询学生排名及其考试成绩
void CheckName(); //按姓名查询学生排名及其考试成绩
void Clear();//按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)
void Show();//输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
int main()
{
	int choice; //选项数字 
	

	while(1){
			
		FirstPage();
		cin>>choice;
			if(choice==1)
			Record();  
			if(choice==2)
			ProAverage();
			if(choice==3)
			 StuAverage();
			 if(choice==4)
			SortSumUp();
			 if(choice==5)
			 SortSumDown(); 
			 if(choice==6)
			 IdSortDown(); 
			 if(choice==7)
			 Dictionary();
			 if(choice==8)
			 CheckId();
			 if(choice==9)
			 CheckName();
			 if(choice==10)
			  Clear();
			  if(choice==11)
			  Show();
			  if(choice==0)
			  {
			  	return 0;
			  	system("pause");
			  }
			 
			 
			
	}

	
	return 0;
}

void FirstPage() //首页展示选项 
{
	
	printf("1.Append record\n");
		printf("2.Caculate total and average score of every course\n");
			printf("3.Caculate 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 total score of every student\n");
						printf("6.Sort in ascending order by number\n");
							printf("7.Sort in dictionary order by name\n");
								printf("8.Search by number\n");
									printf("9.Search by name\n");
										printf("10.Statistic analysis for every course\n");
											printf("11.List record\n");
												printf("0.Exit\n");
													printf("Please enter your choice:\n");
}
void Record() //记录数据 
{
	printf("请输入学生人数:");
	int n; 
	scanf("%d",&n);
	for(int i=temp;i<n+temp;i++){
		scanf("%s",stu[i].a );
		scanf("%s",stu[i].str );
		scanf("%d%d%d",&stu[i].MT,&stu[i].EN,&stu[i].PH );
		
	}
	temp+=n;
	
	
}
void ProAverage(){ //各科成绩总分平均分 
	int sumMT=0;
	double aveMT=0;
	int sumEN=0;
	double aveEN=0;
	int  sumPH=0;
	double	 avePH=0;
	for(int i=0;i<temp;i++){
		sumMT+=stu[i].MT;
			sumEN+=stu[i].EN;
				sumPH+=stu[i].PH;
		
	}
	for(int i=0;i<3;i++){
		aveMT=sumMT/3.0; 
			aveEN=sumEN/3.0; 
				avePH=sumPH/3.0; 
				
	}
	printf("数学总成绩:%d 英语总成绩:%d 物理总成绩:%d\n",sumMT,sumEN,sumPH);
	printf("数学平均分:%.2f 英语平均分:%.2f 物理平均分:%.2f\n",aveMT,aveEN,avePH);
}
void StuAverage(){ //计算每个学生的总分和平均分; 

	for(int i=0;i<temp;i++){
		int sum=0;
		double ave=0;
			sum+=stu[i].MT+stu[i].EN,stu[i].PH ;
      ave=sum/3.0;
      cout<<stu[i].a<<" "<<stu[i].str <<" "<<"Grade:"<<sum << ave<<endl;
	}
	
}
  int cmpup(int a,int b){ //自定义函数从大到小 
  	return a>b;
  } 
void SortSumUp(){
	int b[36];
	for(int i=0;i<temp;i++){
		b[i]=stu[i].MT+stu[i].PH+stu[i].EN;
		
	}
	sort(b,b+temp,cmpup);
	for(int j=0;j<temp;j++)    //这里有个瑕疵就是如果成绩一样那么会输出两次,但是由于一开始方法设置错了,便不在这里改正了 
	{
		for(int i=0;i<temp;i++){  
			if(b[j]==(stu[i].MT+stu[i].PH+stu[i].EN))
			cout<<stu[i].str<<endl;
		}
	}
	
}
void SortSumDown(){
	int b[35];
	for(int i=0;i<temp;i++){
		b[i]=stu[i].MT+stu[i].PH+stu[i].EN;
	} 
	sort(b,b+temp);
	for(int j=0;j<temp;j++)
	{
	for(int i=0;i<temp;i++){
		if(b[j]==(stu[i].MT+stu[i].PH+stu[i].EN))
		cout<<stu[i].str <<endl;
	} 
}
}
bool IdCmpDown(STU x,STU y){
	return strcmp(x.a,y.a );
	
}
void IdSortDown(){
	sort(stu,stu+temp,IdCmpDown);
	for(int i=0;i<temp;i++){
		cout<<stu[i].a<<endl;
	}
}
bool cmpdic(STU x,STU y){
	return strcmp(x.str,y.str )<0;
}
void Dictionary(){
	sort(stu,stu+temp,cmpdic);
	for(int i=0;i<temp;i++){
		cout<<stu[i].str <<endl;
		cout<<stu[i].MT<<" "<<stu[i].EN<<" "<<stu[i].PH<<endl; ;
	}
}
void CheckId(){
	char IdCard[100];
	cin>>IdCard;
	for(int i=0;i<temp;i++){
		if(strcmp(IdCard,stu[i].a)==0){
		
		cout<<stu[i].MT<<" "<<stu[i].EN<<" "<<stu[i].PH<<endl;
    break;
	} 
}
}
void CheckName(){
	char Name[100];
	cin>>Name;
	for(int i=0;i<temp;i++){
		if(strcmp(Name,stu[i].str )==0)
		{
			cout<<stu[i].MT<<" "<<stu[i].EN<<" "<<stu[i].PH<<endl;
			break;
		}
	}
}
void Clear(){
	
    double mt1=0,mt2=0,mt3=0,mt4=0,mt5=0;
    double en1=0,en2=0,en3=0,en4=0,en5=0;
    double ph1=0,ph2=0,ph3=0,ph4=0,ph5=0;
    for(int i=0;i<temp;i++)
    {
        int mt=stu[i].MT,en=stu[i].EN,ph=stu[i].PH;
        if(mt>=90&&mt<=100)mt1++;
        if(mt>=80&&mt<=89)mt2++;
        if(mt>=70&&mt<=79)mt3++;
        if(mt>=60&&mt<=69)mt4++;
        if(mt>=0&&mt<=59)mt5++;
        if(en>=90&&en<=100)en1++;
        if(en>=80&&en<=89)en2++;
        if(en>=70&&en<=79)en3++;
        if(en>=60&&en<=69)en4++;
        if(en>=0&&en<=59)en5++;
        if(ph>=90&&ph<=100)ph1++;
        if(ph>=80&&ph<=89)ph2++;
        if(ph>=70&&ph<=79)ph3++;
        if(ph>=60&&ph<=69)ph4++;
        if(ph>=0&&ph<=59)ph5++;
    }
    cout<<(mt1*100.0)/temp<<"%"<<" "<<(mt2*100.0)/temp<<"%"<<" "<<(mt3*100.0)/temp<<"%"<<" "<<(mt4*100.0)/temp<<"%"<<" "<<(mt5*100.0)/temp<<"%"<<endl;
    cout<<(en1*100.0)/temp<<"%"<<" "<<(en2*100.0)/temp<<"%"<<" "<<(en3*100.0)/temp<<"%"<<" "<<(en4*100.0)/temp<<"%"<<" "<<(en5*100.0)/temp<<"%"<<endl;
    cout<<(ph1*100.0)/temp<<"%"<<" "<<(ph2*100.0)/temp<<"%"<<" "<<(ph3*100.0)/temp<<"%"<<" "<<(ph4*100.0)/temp<<"%"<<" "<<(ph5*100.0)/temp<<"%"<<endl;

}
void Show(){
	double mtz=0,enz=0,phz=0;
    for(int i=0;i<temp;i++)
    {  
	int sum=stu[i].MT +stu[i].EN +stu[i].PH ;
        mtz+=stu[i].MT;
        enz+=stu[i].EN;
        phz+=stu[i].PH;
        cout<<stu[i].a<<" "<<stu[i].str<<" "<<stu[i].MT<<" "<<stu[i].EN<<" "<<stu[i].PH<<" "<<sum<<" "<<endl;
      
    }
    cout<<mtz<<" "<<mtz/temp<<endl;
    cout<<enz<<" "<<enz/temp<<endl;
    cout<<phz<<" "<<phz/temp<<endl;

}

你可能感兴趣的:(作业)