#include<stdio.h>
#define N 60
typedef struct stduent
{
char bjh[20]; //班级号
char xh[20]; //学号
char xm[20]; //姓名
char xb[20]; //性别
int nl;//年龄
float sg; //身高
char pd;
}ss;
void stuHight(ss *a,int n);
void stuAge(ss *a,int n);
int main(void)
{
ss xi[60];
int i,a,c;
char pd2;
up:
for(i=0;i<N;i++)
{
printf("请输入班级号:");
scanf(" %s",xi[i].bjh);
printf("请输学号:");
scanf(" %s",xi[i].xh);
printf("请输入姓名:");
scanf(" %s",xi[i].xm);
printf("请输入性别:");
scanf(" %s",xi[i].xb);
printf("请输入年龄:");
scanf(" %d",&xi[i].nl);
printf("请输入身高:");
scanf(" %f",&xi[i].sg);
printf("你是否继续输入:<y/n>");
scanf(" %c",&xi[i].pd);
if(xi[i].pd=='n') break;
printf("\n");
}
printf("请输入以下选择:\n");
printf(" 1:按年龄排;\n");
printf(" 2:按身高排;");
scanf("%d",&a);
if (a==1) stuAge(xi,N);
else if(a==2) stuHight(xi,N);
printf("是否继续:<y/n>");
scanf(" %c",&pd2);
if(pd2=='y') goto up;
return 0;
}
void stuAge(ss *a,int n)
{
int i,b,j,c,k;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++)
if(a[i].nl>a[j].nl) k=j;
if(a[k].nl!=a[i].nl)
{
c=a[i].nl;
a[i].nl=a[k].nl;
a[k].nl=c;
}
}
}
void stuHight(ss *a,int n)
{
int i,b,j,c,k;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++)
if(a[i].sg>a[j].sg) k=j;
if(a[k].sg!=a[i].sg)
{
c=a[i].sg;
a[i].sg=a[k].sg;
a[k].sg=c;
}
}
}
这个代码想要实现的功能是:
输入学生信息,按照年龄或者身高排序。
但是错误一大堆。
(1)main函数for循环中,i=0不能再for里面,需要放在外面,否则goto语句的时候会直接把上一次的数据覆盖
(2)排序中,只交换了年龄或者身高,其它信息没交换。
代码修改如下,修改的地方都已经标注:
#include<stdio.h>
#define N 60
typedef struct stduent
{
char bjh[20]; //班级号
char xh[20]; //学号
char xm[20]; //姓名
char xb[20]; //性别
int nl;//年龄
float sg; //身高
char pd;
}ss;
void stuHight(ss *a,int n);
void stuAge(ss *a,int n);
int main(void)
{
ss xi[60];
int i,a,c;
char pd2;
i=0; //i=0放在这里
up:
for(;i<N;) //i=0不要放在for循环中,否则goto语句的时候会出错
{
printf("请输入班级号:");
scanf(" %s",xi[i].bjh); getchar(); //接收回车
printf("请输学号:");
scanf(" %s",xi[i].xh); getchar(); //接收回车
printf("请输入姓名:");
scanf(" %s",xi[i].xm); getchar(); //接收回车
printf("请输入性别:");
scanf(" %s",xi[i].xb); getchar(); //接收回车
printf("请输入年龄:");
scanf(" %d",&xi[i].nl);
printf("请输入身高:");
scanf(" %f",&xi[i].sg);
printf("你是否继续输入:<y/n>");
scanf(" %c",&xi[i].pd);
i++; //i++放在这里
if(xi[i-1].pd=='n') break; //这里修改成i-1
printf("\n");
}
printf("请输入以下选择:\n");
printf(" 1:按年龄排;\n");
printf(" 2:按身高排;");
scanf("%d",&a);
if (a==1) stuAge(xi,i); //这里传入的是i,不是N
else if(a==2) stuHight(xi,i);//这里传入的是i,不是N
printf("是否继续:<y/n>");
scanf(" %c",&pd2);
if(pd2=='y') goto up;
return 0;
}
//按年龄排序
void stuAge(ss *a,int n)
{
int i,b,j,c,k;
ss t;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++)
if(a[i].nl>a[j].nl) k=j;
if(a[k].nl!=a[i].nl)
{
/*c=a[i].nl;
a[i].nl=a[k].nl;
a[k].nl=c;*/ //这么交换只交换了年龄,其它信息没交换
t = a[i];
a[i]=a[k];
a[k]= t;
}
}
}
//按身高排序
void stuHight(ss *a,int n)
{
int i,b,j,c,k;
ss t;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++)
if(a[i].sg>a[j].sg) k=j;
if(a[k].sg!=a[i].sg)
{
/*c=a[i].sg;
a[i].sg=a[k].sg;
a[k].sg=c;*/ //这么交换只交换了身高,其它信息没变
t = a[i];
a[i] = a[k];
a[k]=t;
}
}
}
就是输入学生信息,然后用选择排序法对年龄和身高进行排序啊
typedef struct stduent
这是一个结构体
void stuAge(ss *a,int n)按Age大小排序
void stuHight(ss *a,int n)按Hight大小排序
写了个注释版:
#include<stdio.h>
#define N 60 //将N定义为60 可类比将PI定义为3.1415926
typedef struct stduent //定义一个学生结构体,用来存学生多方面信息
{
char bjh[20]; //班级号
char xh[20]; //学号
char xm[20]; //姓名
char xb[20]; //性别
int nl;//年龄
float sg; //身高
char pd;
}ss; //结构体变量ss
void stuHight(ss *a,int n); //学生身高排序
void stuAge(ss *a,int n); //学生年龄排序
int main(void) //主函数
{
ss xi[60]; //定义结构体类型数组 大小为60 人数限定为60名
int i,a,c;
char pd2;
up:
for(i=0;i<N;i++) //循环输入范围N以内学生信息
{
printf("请输入班级号:");
scanf(" %s",xi[i].bjh);
printf("请输学号:");
scanf(" %s",xi[i].xh);
printf("请输入姓名:");
scanf(" %s",xi[i].xm);
printf("请输入性别:");
scanf(" %s",xi[i].xb);
printf("请输入年龄:");
scanf(" %d",&xi[i].nl);
printf("请输入身高:");
scanf(" %f",&xi[i].sg);
printf("你是否继续输入:<y/n>");
scanf(" %c",&xi[i].pd);
if(xi[i].pd=='n') break;
printf("\n");
}
printf("请输入以下选择:\n"); //输入选择 调用对应排序函数 进行排序
printf(" 1:按年龄排;\n");
printf(" 2:按身高排;");
scanf("%d",&a);
if (a==1) stuAge(xi,N);
else if(a==2) stuHight(xi,N);
printf("是否继续:<y/n>");
scanf(" %c",&pd2);
if(pd2=='y') goto up;
return 0;
}
//学生年龄函数 实现学生年龄的排序
void stuAge(ss *a,int n)
{
int i,b,j,c,k;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++) //选择排序实现年龄的排序
if(a[i].nl>a[j].nl) k=j;
if(a[k].nl!=a[i].nl)
{
c=a[i].nl;
a[i].nl=a[k].nl;
a[k].nl=c;
}
}
}
//学生身高函数 实现学生身高的排序
void stuHight(ss *a,int n)
{
int i,b,j,c,k;
for (i=0;i<N;i++)
{
b=i;
for(j=0;j<N;j++) //选择排序实现身高的排序
if(a[i].sg>a[j].sg) k=j;
if(a[k].sg!=a[i].sg)
{
c=a[i].sg;
a[i].sg=a[k].sg;
a[k].sg=c;
}
}
}
望采纳!!