⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 040530513.cpp

📁 学生成绩管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			teacher(stu);
		    break;
		case 6:
			system("cls"); 
			kecheng(stu);
		    break;
		case 7: 
			system("cls");
			return 0;
			break;
		case 8: exit(1);	  	
		default:
		printf("输入错误,请重新输入!\n");
     	break;
		}
    
 
	}
}
void renshu(hash*stu)
{
	int i,j=0,k=0;     //标记哈稀表中的空的个数
	printf("男生人数为:");
    for(i=0;i<stu->length;i++)
		if(stu->elem[i].age!=-1)
		{
			if(stu->elem[i].sex=='m')
				j++;
		}
		else
			k++;	    
	printf("%d\n",j);
	printf("女生人数为:%d\n",11-j-k);
}

//每个人的平均成绩
void geren(hash*stu) 
{ 
	int i,c,j; 
	lesson1 *s;
	printf("每个学生的平均成绩依次为:\n\n");
	for(i=0;i<stu->length;i++)
	if(stu->elem[i].age!=-1)
	{	 
		 s=stu->elem[i].next;
         while(s)
		 {
             c=0;
			 j=0;
			 c+=s->score;			     
		     s=s->next;
			 j++;    //j记录门数
		 }		
		 c=c/j;		 
		 printf("%d ",c); 	
	}
	printf("\n\n");
}
 
void nianling(hash*stu)   //各年级的平均年龄
{
    int i, k[3]={0},j=0;
	int m[3]={0};    //记录年龄
	for(i=0;i<4;i++)
		m[i]=0;
	for(i=0;i<stu->length;i++)
	if(stu->elem[i].age!=-1)
	{	 
		if(stu->elem[i].ID[3]=='3')
		{
			m[0]+=stu->elem[i].age;
			k[0]++;
		}
		else 
			if(stu->elem[i].ID[3]=='4')
			{
				m[1]+=stu->elem[i].age;	
				k[1]++;
			}
		else 
			if(stu->elem[i].ID[3]=='5')
			{
				m[2]+=stu->elem[i].age;
				k[2]++;
			}
		else 
			if(stu->elem[i].ID[3]=='6')
			{
				m[0]+=stu->elem[i].age;
				k[3]++;
			}
		else
			j=1;
	}
	if(j==0)
	{
	printf("大学一年级学生的平均年龄为:%d\n\n",m[0]/k[0]);	
	printf("大学二年级学生的平均年龄为:%d\n\n",m[1]/k[1]);	
	printf("大学三年级学生的平均年龄为:%d\n\n",m[2]/k[2]);
	printf("大学四年级学生的平均年龄为:%d\n\n",m[3]/k[3]);
	}
}

  typedef struct{
	 char course[20];//课程名称
	 int stunum;//学生数
	 float allgrate;//该门课的总成绩
 }Cour;

 void chengji(hash*stu){//各门课的平均成绩
	int i,j,k=0;
	Cour CC[20];//存储课程信息,最大支持20门课
	lesson1 *p;
	char str1[20];//临时存储课程名称
	for(i=0;i<stu->length;i++){//初始化
		strcpy(CC[i].course,"");
		CC[i].stunum=0;
		CC[i].allgrate=0;
	}
	for(i=0;i<stu->length;i++){//同一个学生的课程1和课程2不一样
		if(stu->elem[i].age==-1)	continue;//将没有信息的过滤
		p=stu->elem[i].next;
		while(p){
			strcpy(str1,p->cause);
		for(j=0;j<=k;j++) 
			if(strcmp(str1,CC[j].course)==0){//将学生成绩加入该门课总分中
				CC[j].stunum++;
				CC[j].allgrate=CC[j].allgrate+p->score;
				break;
			}
			if(j==k+1){//出现新课程
				strcpy(CC[k].course,str1);
				CC[k].stunum++;
				CC[k].allgrate=CC[k].allgrate+p->score;
				k++;
			}	
			p=p->next;
		}
	}
	for(i=0;i<k;i++)
		printf("%s的平均成绩是%3.1f\n",CC[i].course,CC[i].allgrate/CC[i].stunum);
 }

int  tongji(hash*stu)
{
   int i;
   while(1)
   {
   printf("1:统计男女生人数\n\n2:每个人的平均成绩\n\n3:各年级的平均年龄\n\n4:各门课的平均成绩\n\n5:退出系统\n6:返回\n");
   printf("请选择操作: ");
	 scanf("%d",&i);
		printf("\n");
   switch(i)
	{
	case 1: 
		system("cls");
		renshu(stu);
		break; 
	case 2: 
		system("cls");
		geren(stu);    //每个人的平均成绩。
		break; 
	case 3:
		system("cls");
		nianling(stu);  //各年级的平均年龄
		break;
	case 4:
		system("cls"); 
		chengji(stu);  	 //各门课的平均成绩
		break;
	case 5: exit(1);  
	case 6:
		system("cls");
		return 0;
	default:
		printf("输入错误,请重新输入!\n\n");
	}
   }
}
//成绩归并
void MarkMerge(hashtable *list,int *temp1,int *temp2,int s,int m,int t)
{
  int i,j,k=s;
  for(i=s,j=m+1;s<=m&&j<=t;i++)
  {
   if((list->elem[temp1[s]].firstsub->mark+list->elem[temp1[s]].firstsub->next->mark)>(list->elem[temp1[j]].firstsub->mark+list->elem[temp1[j]].firstsub->next->mark)) 
	   temp2[i]=temp1[j++];
   else 
	   temp2[i]=temp1[s++];
  }
  if(s<=m)
  {
	  for(;s<=m;s++,i++)
	  {
		  temp2[i]=temp1[s];
	  }
  }
  if(j<=t)
  {
	  for(;j<=t;j++,i++)
	  {
		  temp2[i]=temp1[j];
	  }
  }
  for(i=k;i<=t;i++)
	  temp1[i]=temp2[i];
}
void MarkMsort(hashtable *list,int *temp1,int *temp2,int s,int t)
{
  int m;
  if(s==t)
	  temp2[s]=temp1[s];
  else
  {
   m=(s+t)/2;
   MarkMsort(list,temp1,temp2,s,m);
   MarkMsort(list,temp1,temp2,m+1,t);
   MarkMerge(list,temp1,temp2,s,m,t);
  }
}
void geren1(hashtable *list)//=========================================总成绩排序
{
	int i,j,temp1[LEN],temp2[LEN];
	for(i=1,j=1;i<LEN;i++)
	{
		temp1[j++]=i;
		temp2[i]=0;
	}
	temp1[0]=0;
	temp2[0]=0;
	MarkMsort(list,temp1,temp2,1,LEN-1);
	for(j=1;j<LEN;j++)
		printf("%9s%10s%4c%4d%4d\n",list->elem[temp2[j]].stunum,list->elem[temp2[j]].name,list->elem[temp2[j]].sex,list->elem[temp2[j]].age,list->elem[temp2[j]].firstsub->mark+list->elem[temp2[j]].firstsub->next->mark);
}
//年龄归并排序
void Merge(hash *stu,int *temp1,int *temp2,int s,int m,int t)
{
  int i,j,k=s;
  for(i=s,j=m+1;s<=m&&j<=t;i++)
  {
   if(stu->elem[temp1[s]].age<stu->elem[temp1[j]].age) 
	   temp2[i]=temp1[j++];
   else 
	   temp2[i]=temp1[s++];
  }
  if(s<=m)
  {
	  for(;s<=m;s++,i++)
	  {
		  temp2[i]=temp1[s];
	  }
  }
  if(j<=t)
  {
	  for(;j<=t;j++,i++)
	  {
		  temp2[i]=temp1[j];
	  }
  }
  for(i=k;i<=t;i++)
	  temp1[i]=temp2[i];
}
void Msort(hash *stu,int *temp1,int *temp2,int s,int t)
{
  int m;
  if(s==t)
	  temp2[s]=temp1[s];
  else
  {
   m=(s+t)/2;
   Msort(stu,temp1,temp2,s,m);
   Msort(stu,temp1,temp2,m+1,t);
   Merge(stu,temp1,temp2,s,m,t);
  }
}
void nianling1(hash *stu)    //对年龄进行归并排序
{
	int i,j,temp1[11],temp2[11];
	for(i=1,j=1;i<11;i++)
	{
		temp1[j++]=i;
		temp2[i]=0;
	}
	temp1[0]=0;
	temp2[0]=0;
	Msort(stu,temp1,temp2,1,11-1);
	for(j=0;j<11;j++)
	if(stu->elem[j].age!=-1)
		printf("%9s%10s%4c%4d\n",stu->elem[temp2[j]].ID,stu->elem[temp2[j]].name,stu->elem[temp2[j]].sex,stu->elem[temp2[j]].age);
}

//堆排序xuehao从大到小

void Heapadjust(st *l,int s,int m)
{
	int j;
    info rc;
	rc=l->r[s];
	for(j=2*s;j<=m;j*=2)
	{	
	if(j<m&&(strcmp(l->r[j].key,l->r[j+1].key)<0))
			j++;
	if(strcmp(rc.key,l->r[j].key)>=0)
			break;
		l->r[s]=l->r[j];
		s=j;
	}
	l->r[s]=rc;
}
void heapsort(hash *stu)
{
	 st l;
	 lesson1*s;
	 int i,j=0,k;
	 info rc;
	 l.length=stu->length;
	 for(i=0;i<stu->length;i++)	   
	 if(stu->elem[i].age==-1)
	 {
		 l.length=stu->length-1;//此时q[0].length记录长度	 
		 l.r[j].age=-1;
	 }
	 else
	 {
		 strcpy(l.r[j].key,stu->elem[i].ID);
		 l.r[j].age=i;	
		 j++;
		 	 
	 }
	for(i=l.length/2;i>0;--i)    //此时l[0].length记录长度
		Heapadjust(&l,i,l.length);	
	for(i=l.length;i>0;--i)
	{
		rc=l.r[1];
        l.r[1]=l.r[i];
		l.r[i]=rc;
		Heapadjust(&l,1,i-1);
    }
	 printf("学号\t姓名\t年龄\t性别\t");
	 printf("课程\t分数\t教师\n");
	 for(i=0,k=0;i<stu->length;i++)
	 if(stu->elem[i].age!=-1)
	 {
		 j=l.r[k].age;	 
		 printf("%s\t",stu->elem[j].ID);		
		 printf("%s\t",stu->elem[j].name);		
		 printf("%d\t",stu->elem[j].age);	   
		 printf("%c\t",stu->elem[j].sex);  
		 s=stu->elem[j].next;
         while(s)
		 {
			 printf("%s\t",s->cause);		
		     printf("%d\t",s->score);		
		     printf("%s\n",s->teacher);	 
		     s=s->next;
		 }
		 printf("\n");
		 k++;
	 }
}




int  paixu(hash*stu)
{
   int i;
   while(1){
   printf("1:按学号从小到大排序\n\n2:按年龄从大到小排序\n\n3:按个人总成绩从大到小排序\n\n4:退出系统\n\n5:返回\n");
   printf("请选择操作: ");
      scanf("%d",&i);
		printf("\n");
   switch(i)
	{
	case 1: 
		system("cls");
		heapsort(stu);
		break;
	case 2: 
		system("cls");
		nianling1(stu);
		break; 
	case 3: 
		system("cls");
		geren1(stu); //个人总成绩
		break;
	case 4: exit(1); 
		break;
	case 5:
		system("cls");
		return 0;
	default :  
		printf("输入错误,请重新输入!\n\n");          
	}
   }

}



void main()
{	
	int i;
	hash *stu;
	stu=(hash *)malloc(sizeof(hash));
    inithash(stu);
	printf("\n");
	system("cls");
	while(1)
	{ 
	printf("*************************欢迎进入南航学生成绩管理系统**************************\n\n");
	printf("操作菜单栏:\n\n");
	printf(	"1:显示全部信息\n\n2:查询\n\n3:统计\n\n4:排序\n\n5:退出系统\n\n");
	printf("请选择操作: ");
    scanf("%d",&i);
		 printf("\n");
    switch(i)
	{
	    case 1: 	
			system("cls");
			print(stu);
			break;
	    case 2: 
			system("cls");
			chaxun(stu);
			break;
	    case 3: 
			system("cls");
			tongji(stu);
			break;
	    case 4: 
			system("cls");
			paixu(stu);
			break;		
	   case 5:  exit(1);   
		default:
		    printf("输入错误,请重新输入!\n");	
		    break;
	}
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -