当前位置: 代码迷 >> C语言 >> 请教结构排序问题.真的被搞晕了.哥哥姐姐,救我啊!!!!
  详细解决方案

请教结构排序问题.真的被搞晕了.哥哥姐姐,救我啊!!!!

热度:193   发布时间:2007-03-17 19:56:56.0

我不会写成void sort(int*)这种,但是写了这个能满足要求,你看看能不能当参考
#include<stdio.h>
int num[20];
struct student
{
char name[20];
int number;
int a;
int b;
int c;
}stu[3];
void sort(int n);
void main()
{
int j=0,k=0;
char i;
do
{
printf("请输入名字:\n");
scanf("%s",&stu[j].name);
printf("请输入序号:\n");
scanf("%d",&stu[j].number);
printf("请输入成绩:\n");
scanf("%d",&stu[j].a);
printf("请输入成绩:\n");
scanf("%d",&stu[j].b);
printf("请输入成绩:\n");
scanf("%d",&stu[j].c);
j++;
printf("请选择是否继续:Y/N");
fflush(stdin);
scanf("%c",&i);

}while(i=='Y'||i=='y');
printf("排序前的详细内容为:\n");

printf("学号 姓名 平均成绩\n");


for(k=0;k<j;k++)
{
printf("\n%d\t%s\t%d\t",stu[k].number,stu[k].name,(stu[k].a+stu[k].b+stu[k].c)/3);
num[k]=(stu[k].a+stu[k].b+stu[k].c)/3;
printf("%d",num[k]);
}
printf("\n");
sort(j);

}

void sort(int n)
{
int aver[20],aver_num,last_max;
int i,j,k;
printf("排序后的详细内容为:\n");
printf("学号 姓名 平均成绩\n");
last_max=100;
for(i=0;i<n;i++)
{
aver_num=0;
k=0;
for(j=0;j<n;j++)
{
if(num[j]<last_max)
{
if(aver_num<num[j])
{
aver_num=num[j];
k=j;
}
}
}
last_max=aver_num;
aver[i]=k;
}
for(k=0;k<n;k++)
{
num[k]=(stu[k].a+stu[k].b+stu[k].c)/3;
printf("\n%d\t%s\t%d\t",stu[aver[k]].number,stu[aver[k]].name,num[aver[k]]);
}
}


----------------解决方案--------------------------------------------------------
表示最大的整数的那个宏是什么了?我忘记了!好像有MAX什么的?
----------------解决方案--------------------------------------------------------

本程序可以增加,删减其中N为能容纳的学生人数的最大值,scoreN是学科的门数,若要改变只要改变define中的数字就可以了
另外如果想采用积分制,只需再定义一个函数用来算积分就可以了(这个地方就不说了)



#include<stdio.h>
#define N 10
#define scoreN 4
struct student
{
char name[20];
long number;
int score[scoreN];
}stu[N];
int J=0;

void sort(int *num)
{
int i,j,k;
int t=0;
struct student change;
for(i=0;i<J-1;i++)
{
for(j=0;j<J-1-i;j++)
{
if(num[j]>num[j+1])
{
t=num[j+1];
num[j+1]=num[j];
num[j]=t;
change.number=stu[j+1].number ;
stu[j+1].number=stu[j].number ;
stu[j].number=change.number ;
for(k=0;k<scoreN;k++)
{
change.score[k]=stu[j+1].score[k];
stu[j+1].score[k]=stu[j].score[k];
stu[j].score[k]=change.score[k];
}
for(k=0;k<20;k++)
{
change.name[k]=stu[j+1].name[k];
stu[j+1].name[k]=stu[j].name[k];
stu[j].name[k]=change.name[k] ;
}
}


}

}

}


void input()
{
char c;
int i;
do
{
printf("第%d个学生的信息:\n",J+1);
printf("请输入名字:\n");
fflush(stdin);
scanf("%s",&stu[J].name);

printf("请输入序号:\n");
fflush(stdin);
scanf("%ld",&stu[J].number);

for(i=0;i<scoreN;i++)
{ printf("请输入第%d科的成绩:\n",i+1);
fflush(stdin);
scanf("%d",&stu[J].score[i]);
}
J++;
printf("请选择是否继续:Y/N");
fflush(stdin);
scanf(" %c",&c);
fflush(stdin);
}while(c=='Y'||c=='y');

}

void print()
{
int i,k,score;
printf("学号\t\t姓名\t");
for(i=0;i<scoreN;i++)
printf("第%d科\t",i+1);
printf("平均成绩\n");
for(k=0;k<J;k++)
{
score=0;
printf("\n%-16ld%s\t",stu[k].number,stu[k].name);
for(i=0;i<scoreN;i++)
{ printf("%d\t",stu[k].score[i]);
score+=stu[k].score[i];
}
printf("%d\n",score/scoreN);
}
}

void dlt(int num)
{
int i,j,k;
for(i=0;i<J;i++)
if(stu[i].number==num)
{ for(j=i;j<J;j++)
{
stu[j].number=stu[j+1].number;
for(k=0;k<scoreN;k++)
stu[j].score[k]=stu[j+1].score[k];
for(k=0;k<20;k++)
stu[j].name[k]=stu[j+1].name[k];
}
J--;
break;
}
}
void main()
{
int i,k,num[N],No,score;
char c;
input();
printf("排序前的详细内容为:\n");
print();
for(k=0;k<J;k++)
{
score=0;
for(i=0;i<scoreN;i++)
score+=stu[k].score[i];
num[k]=score/scoreN;
}
k=J;
sort(num);
printf("\n排序后为\n");
print();
printf("\n您是否需要添加学生信息?Y/N");
fflush(stdin);
scanf(" %c",&c);
if(c=='Y'||c=='y')
{
input();
for(;k<J;k++)
{
score=0;
for(i=0;i<scoreN;i++)
score+=stu[k].score[i];
num[k]=score/scoreN;
}
sort(num);
printf("\n添加后为\n");
print();
}
printf("\n您是否需要删除学生信息?Y/N");
fflush(stdin);
scanf(" %c",&c);
if(c=='Y'||c=='y')
{
do
{
printf("请输入要删除的学生学号:");
fflush(stdin);
scanf("%d",&No);
dlt(No);
printf("\n删除后为:\n");
print();
printf("\n您是否要继续删除:");
fflush(stdin);
scanf(" %c",&c);
}while(c=='Y'||c=='y');

}
}


----------------解决方案--------------------------------------------------------
  相关解决方案