谁可以给我解释解释这个代码的意思吗?

#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;
}
}
}



望采纳!!