鱼C论坛

 找回密码
 立即注册
查看: 2309|回复: 2

[已解决]单科成绩排序(结构体专题)

[复制链接]
发表于 2020-12-22 11:52:44 | 显示全部楼层 |阅读模式
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.}  

最佳答案
2020-12-22 11:52:45
本帖最后由 xieglt 于 2020-12-22 14:39 编辑
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  

  4. typedef struct tagstudent  
  5. {
  6.         //12位的学号已经超过int类型的最大值,因此用char 数组存储
  7.     char num[16];  
  8.         //姓名不超过20个字符,12个字符肯定不够
  9.     char name[24];  
  10.     int scores[3];  
  11. }STUDENT,*LPSTUDENT;  


  12. void swap(LPSTUDENT a,LPSTUDENT b)
  13. {
  14.         STUDENT _a;
  15.         memcpy(&_a,a,sizeof(STUDENT));
  16.         memcpy(a,b,sizeof(STUDENT));
  17.         memcpy(b,&_a,sizeof(STUDENT));
  18. }

  19. int cmp(char * a,char * b)
  20. {
  21.         return strcmp(a,b) >= 0 ? 1 : 0;
  22. }

  23. int main()  
  24. {  
  25.         int n,i,j;
  26.         unsigned int f;
  27.         LPSTUDENT student;
  28.         printf("Input number of students:\n");
  29.         scanf("%d",&n);
  30.         //我的编译器不支持动态数组,只能动态分配内存
  31.         //不要把结构体和变量同名 struct student student
  32.         student = (LPSTUDENT)malloc(n * sizeof(STUDENT));

  33.         printf("Please input number,name,scores of student:\n");

  34.         for(i=0;i<n;i++)  
  35.         {
  36.                 scanf("%s %s %d %d %d",
  37.                         student[i].num,
  38.                         student[i].name,
  39.                         &(student[i].scores[0]),
  40.                         &(student[i].scores[1]),
  41.                         &(student[i].scores[2]));  
  42.         }  

  43.         printf("Please input the sort index:\n");
  44.         scanf("%u",&f);
  45.         f = (f+2) % 3;
  46.        
  47.         //排序是按某科成绩给所有学生排序
  48.         for(i=0;i<n;i++)  
  49.         {
  50.                 for(j=i+1;j<n;j++)  
  51.                 {  
  52.                         //成绩按降序排列,大数放前面
  53.                         if(student[i].scores[f] < student[j].scores[f])
  54.                         {
  55.                                 swap(student+i,student+j);
  56.                         }
  57.                         //成绩相等的按学号升序来排
  58.                         else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
  59.                         {
  60.                                 swap(student+i,student+j);
  61.                         }
  62.                 }  
  63.         }  

  64.         for(j=0;j<n;j++)  
  65.         {  
  66.                 printf("%s %s ",student[j].num,student[j].name);  
  67.                 for(i=0;i<3;i++)  
  68.                 printf("%d ",student[j].scores[i]);  
  69.                 printf("\n");  
  70.         }  
  71.        
  72.         free(student);

  73.         return 0;
  74. }  
复制代码

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 11:52:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-12-22 14:39 编辑
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  

  4. typedef struct tagstudent  
  5. {
  6.         //12位的学号已经超过int类型的最大值,因此用char 数组存储
  7.     char num[16];  
  8.         //姓名不超过20个字符,12个字符肯定不够
  9.     char name[24];  
  10.     int scores[3];  
  11. }STUDENT,*LPSTUDENT;  


  12. void swap(LPSTUDENT a,LPSTUDENT b)
  13. {
  14.         STUDENT _a;
  15.         memcpy(&_a,a,sizeof(STUDENT));
  16.         memcpy(a,b,sizeof(STUDENT));
  17.         memcpy(b,&_a,sizeof(STUDENT));
  18. }

  19. int cmp(char * a,char * b)
  20. {
  21.         return strcmp(a,b) >= 0 ? 1 : 0;
  22. }

  23. int main()  
  24. {  
  25.         int n,i,j;
  26.         unsigned int f;
  27.         LPSTUDENT student;
  28.         printf("Input number of students:\n");
  29.         scanf("%d",&n);
  30.         //我的编译器不支持动态数组,只能动态分配内存
  31.         //不要把结构体和变量同名 struct student student
  32.         student = (LPSTUDENT)malloc(n * sizeof(STUDENT));

  33.         printf("Please input number,name,scores of student:\n");

  34.         for(i=0;i<n;i++)  
  35.         {
  36.                 scanf("%s %s %d %d %d",
  37.                         student[i].num,
  38.                         student[i].name,
  39.                         &(student[i].scores[0]),
  40.                         &(student[i].scores[1]),
  41.                         &(student[i].scores[2]));  
  42.         }  

  43.         printf("Please input the sort index:\n");
  44.         scanf("%u",&f);
  45.         f = (f+2) % 3;
  46.        
  47.         //排序是按某科成绩给所有学生排序
  48.         for(i=0;i<n;i++)  
  49.         {
  50.                 for(j=i+1;j<n;j++)  
  51.                 {  
  52.                         //成绩按降序排列,大数放前面
  53.                         if(student[i].scores[f] < student[j].scores[f])
  54.                         {
  55.                                 swap(student+i,student+j);
  56.                         }
  57.                         //成绩相等的按学号升序来排
  58.                         else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
  59.                         {
  60.                                 swap(student+i,student+j);
  61.                         }
  62.                 }  
  63.         }  

  64.         for(j=0;j<n;j++)  
  65.         {  
  66.                 printf("%s %s ",student[j].num,student[j].name);  
  67.                 for(i=0;i<3;i++)  
  68.                 printf("%d ",student[j].scores[i]);  
  69.                 printf("\n");  
  70.         }  
  71.        
  72.         free(student);

  73.         return 0;
  74. }  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-22 18:54:17 | 显示全部楼层
额,你没有竞争对手,应当第一....
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-7 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表