|
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;
- }
复制代码
|
|