📄 040530513.cpp
字号:
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 + -