|
50鱼币
Description
有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。
Input
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
Output
输出按第i门课降序排序的结果,格式见样例。
Sample Input
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
1
Sample Output
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
我的代码在运行第一个学生信息后就闪退
代码如下
01.#1477
02.#include <stdio.h>
03.#include <stdlib.h>
04.#include <string.h>
05.
06.struct student
07.{
08. int num;
09. char name[12];
10. int scores[3];
11.};
12.int main()
13.{
14. int n,i,j,f,m;
15. scanf("%d",&n);
16. struct student student[n];
17. for(i=0;i<n;i++)
18. {scanf("%d %s ",&student[i].num,&student[i].name);
19. for(j=0;j<3;j++)
20. {
21. scanf("%d",student[i].scores[j]);
22. }
23. }
24. scanf("%d",&f);
25. for(i=1;i<3;i++)
26. {
27. for(j=0;j<3-i;j++)
28. {
29. if(student[j].scores[f]>student[j+1].scores[f])
30. {
31. m=student[j].scores[f];
32. student[j].scores[f]=student[j+1].scores[f];
33. student[j+1].scores[f]=m;
34. }
35. }
36. }
37. for(j=0;j<3;j++)
38. {
39. printf("%d %s ",student[j].num,student[j].name);
40. for(i=0;i<3;i++)
41. printf("%d ",student[j].scores[i]);
42. printf("\n");
43. }
44.
45.}
本帖最后由 xieglt 于 2020-12-22 14:39 编辑 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tagstudent
{
//12位的学号已经超过int类型的最大值,因此用char 数组存储
char num[16];
//姓名不超过20个字符,12个字符肯定不够
char name[24];
int scores[3];
}STUDENT,*LPSTUDENT;
void swap(LPSTUDENT a,LPSTUDENT b)
{
STUDENT _a;
memcpy(&_a,a,sizeof(STUDENT));
memcpy(a,b,sizeof(STUDENT));
memcpy(b,&_a,sizeof(STUDENT));
}
int cmp(char * a,char * b)
{
return strcmp(a,b) >= 0 ? 1 : 0;
}
int main()
{
int n,i,j;
unsigned int f;
LPSTUDENT student;
printf("Input number of students:\n");
scanf("%d",&n);
//我的编译器不支持动态数组,只能动态分配内存
//不要把结构体和变量同名 struct student student
student = (LPSTUDENT)malloc(n * sizeof(STUDENT));
printf("Please input number,name,scores of student:\n");
for(i=0;i<n;i++)
{
scanf("%s %s %d %d %d",
student[i].num,
student[i].name,
&(student[i].scores[0]),
&(student[i].scores[1]),
&(student[i].scores[2]));
}
printf("Please input the sort index:\n");
scanf("%u",&f);
f = (f+2) % 3;
//排序是按某科成绩给所有学生排序
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
//成绩按降序排列,大数放前面
if(student[i].scores[f] < student[j].scores[f])
{
swap(student+i,student+j);
}
//成绩相等的按学号升序来排
else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
{
swap(student+i,student+j);
}
}
}
for(j=0;j<n;j++)
{
printf("%s %s ",student[j].num,student[j].name);
for(i=0;i<3;i++)
printf("%d ",student[j].scores[i]);
printf("\n");
}
free(student);
return 0;
}
|
|