哪里出问题了?
.通过完成函数完成以下程序代码,输入n,再输入n个学生信息,对学生根据分数从高到低排序(若分数相同则按学号升序排序),依次输出所有学生(分数保留小数点后2位),输入输出示意如下:
4
2107403005 郑洋 男 90
2107403003 杭丹丹 女 88
2107403002 陈可可 女 95
2107403001 赵文清 男 90
2107403002,陈可可,女,95.00
2107403001,赵文清,男,90.00
2107403005,郑洋,男,90.00
2107403003,杭丹丹,女,88.00
#include <stdio.h>
#include <string.h>
#include <malloc.h>
enum SEX {
GIRL, BOY
};
struct SStudent {
int num; //学号
char name[20]; //姓名
SEX sex; //性别
float score; //成绩
};
int Read(SStudent *stu[])
{
char t[20];
int n,i;
scanf("%d",&n);
*stu=(struct SStudent*)malloc(sizeof(struct SStudent)*n);
for(i=0;i<n;i++)
{
scanf("%d%s%s%f",&(*stu)[i].num,(*stu)[i].name,t,&(*stu)[i].score);
(*stu)[i].sex=strcmp(t,"男")?GIRL : BOY;
}
return n;
}
int Write(SStudent stu[], int n)
{
int i;
for(i=0;i<n;i++)
{printf("%d,%s,%s,%.2lf",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
printf("\n");
}
return n;
}
void Sort(SStudent stu[], int n)
{
struct SStudent t;
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(stu[j].score<stu[j+1].score)
{t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
}
}
for(i=0;i<n-1;i++)
{
if(stu[i].score==stu[i+1].score)
{ if(stu[i].num<stu[i+1].num)
{t=stu[i];
stu[i]=stu[i+1];
stu[i+1]=t;
}
}
}
}
int main()
{
SStudent *a = NULL;
int n = Read(&a);
Sort(a, n);
Write(a, n);
free(a);
return 1;
}
sex 你定义的是整形呀,输出 %s 肯定不对, 还不如直接定义 字符数组呢
怎么处理性别
修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
enum SEX {
GIRL, BOY
};
struct SStudent {
int num; //学号
char name[20]; //姓名
SEX sex; //性别
float score; //成绩
};
int Read(SStudent* stu[])
{
char t[20];
int n, i;
scanf("%d", &n);
*stu = (struct SStudent*)malloc(sizeof(struct SStudent) * n);
for (i = 0; i < n; i++)
{
scanf("%d%s%s%f", &(*stu)[i].num, (*stu)[i].name, t, &(*stu)[i].score);
(*stu)[i].sex = strcmp(t, "男") ? GIRL : BOY;
}
return n;
}
int Write(SStudent stu[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d,%s,%s,%.2lf", stu[i].num, stu[i].name, stu[i].sex == GIRL ? "女" : "男", stu[i].score); //修改
//printf("%d,%s,%s,%.2lf",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
printf("\n");
}
return n;
}
void Sort(SStudent stu[], int n)
{
struct SStudent t;
int i, j;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - i - 1; j++)
{
if (stu[j].score < stu[j + 1].score || // 修改
stu[j].score == stu[j + 1].score && stu[j].num > stu[j + 1].num) // 修改
{
t = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = t;
}
}
//for (i = 0; i < n - 1; i++) //修改 以下代码删除
//{
// if (stu[i].score == stu[i + 1].score)
// {
// if (stu[i].num < stu[i + 1].num)
// {
// t = stu[i];
// stu[i] = stu[i + 1];
// stu[i + 1] = t;
// }
// }
//}
}
int main()
{
SStudent* a = NULL;
int n = Read(&a);
Sort(a, n);
Write(a, n);
free(a);
return 1;
}