鱼C论坛

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

[已解决]结构体按学生成绩大小输出。我这个哪里写错了

[复制链接]
发表于 2020-10-28 11:19:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 15533617457 于 2020-10-28 11:25 编辑

题目:
用一维数组存储学号和成绩,然后,按成绩排序输出。

输入格式

输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

输出

按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct
  4. {
  5.   int id;
  6.   double score;
  7. }student;
  8. int main(void)
  9. {
  10.   //输入数据
  11.   int n=0;
  12.   printf("输入学生的人数");
  13.   scanf("%d",&n);
  14.   student *stu=NULL;
  15.   stu=(student*)malloc(n*sizeof(student));
  16.   for(int i=0;i<n;i++)
  17.   {
  18.     printf("输入学生的学号");
  19.     scanf("%d",&(stu+i)->id);
  20.     printf("输入学生的成绩");
  21.     scanf("%d",&(stu+i)->score);
  22.   }
  23.   //交换
  24.   int tempsc; //交换成绩的变量
  25.   int tempid; //交换id的变量
  26.   //交换循环
  27.   for(int i=0;i<n;i++)
  28.   {
  29.     for(int j=i+1;j<n;j++)
  30.     {
  31.       if((stu+j)->score<(stu+i)->score)
  32.       {
  33.         tempsc=(stu+i)->score;
  34.         (stu+i)->score=(stu+j)->score;
  35.         (stu+j)->score=tempsc;
  36.         tempid=(stu+i)->id;
  37.         (stu+i)->id=(stu+j)->id;
  38.         (stu+j)->id=tempid;
  39.       }
  40.       //当成绩相等的时候比较id大小
  41.       else if((stu+j)->score==(stu+i)->score)
  42.       {
  43.         //交换id
  44.         if((stu+j)->id<(stu+i)->id)
  45.         {
  46.         tempsc=(stu+i)->score;
  47.         (stu+i)->score=(stu+j)->score;
  48.         (stu+j)->score=tempsc;
  49.         tempid=(stu+i)->id;
  50.         (stu+i)->id=(stu+j)->id;
  51.         (stu+j)->id=tempid;
  52.         }
  53.       }
  54.     }
  55.   }
  56.   //输出数据
  57.   for(int i=0;i<n;i++)
  58.   {
  59.     printf("%d:%d\n",(stu+i)->id,(stu+i)->score);
  60.   }
  61.   free(stu);
  62.   return 0;
  63. }
复制代码
最佳答案
2020-10-28 11:39:18

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct
  4. {
  5.         int id;
  6.         //你的代码里用的int ,这里把 double 改成  int
  7.         int score;
  8. }student;

  9. int main(void)
  10. {
  11.         //输入数据
  12.         int n=0;
  13.         printf("输入学生的人数");
  14.         scanf("%d",&n);
  15.         student *stu=NULL;
  16.         stu=(student*)malloc(n*sizeof(student));
  17.         for(int i=0;i<n;i++)
  18.         {
  19.                 printf("输入学生的学号");
  20.                 scanf("%d",&(stu+i)->id);
  21.                 printf("输入学生的成绩");
  22.                 scanf("%d",&(stu+i)->score);
  23.         }
  24.         //交换
  25.         int tempsc; //交换成绩的变量
  26.         int tempid; //交换id的变量
  27.         //交换循环
  28.        //前面的for循环里已经定义 i 了,这里不需要再定义了,把 int 去掉就可以了
  29.         for(i=0;i<n;i++)
  30.         {
  31.                 for(int j=i+1;j<n;j++)
  32.                 {
  33.                         if((stu+j)->score<(stu+i)->score)
  34.                         {
  35.                                 tempsc=(stu+i)->score;
  36.                                 (stu+i)->score=(stu+j)->score;
  37.                                 (stu+j)->score=tempsc;
  38.                                 tempid=(stu+i)->id;
  39.                                 (stu+i)->id=(stu+j)->id;
  40.                                 (stu+j)->id=tempid;
  41.                         }
  42.                         //当成绩相等的时候比较id大小
  43.                         else if((stu+j)->score==(stu+i)->score)
  44.                         {
  45.                                 //交换id
  46.                                 if((stu+j)->id<(stu+i)->id)
  47.                                 {
  48.                                         tempsc=(stu+i)->score;
  49.                                         (stu+i)->score=(stu+j)->score;
  50.                                         (stu+j)->score=tempsc;
  51.                                         tempid=(stu+i)->id;
  52.                                         (stu+i)->id=(stu+j)->id;
  53.                                         (stu+j)->id=tempid;
  54.                                 }
  55.                         }
  56.                 }
  57.         }
  58.         //输出数据
  59.         //前面的for循环里已经定义 i 了,这里不需要再定义了,把 int 去掉就可以了
  60.         for(i=0;i<n;i++)
  61.         {
  62.                 printf("%d:%d\n",(stu+i)->id,(stu+i)->score);
  63.         }
  64.         free(stu);
  65.         return 0;
  66. }

复制代码

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

使用道具 举报

发表于 2020-10-28 11:39:18 | 显示全部楼层    本楼为最佳答案   

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct
  4. {
  5.         int id;
  6.         //你的代码里用的int ,这里把 double 改成  int
  7.         int score;
  8. }student;

  9. int main(void)
  10. {
  11.         //输入数据
  12.         int n=0;
  13.         printf("输入学生的人数");
  14.         scanf("%d",&n);
  15.         student *stu=NULL;
  16.         stu=(student*)malloc(n*sizeof(student));
  17.         for(int i=0;i<n;i++)
  18.         {
  19.                 printf("输入学生的学号");
  20.                 scanf("%d",&(stu+i)->id);
  21.                 printf("输入学生的成绩");
  22.                 scanf("%d",&(stu+i)->score);
  23.         }
  24.         //交换
  25.         int tempsc; //交换成绩的变量
  26.         int tempid; //交换id的变量
  27.         //交换循环
  28.        //前面的for循环里已经定义 i 了,这里不需要再定义了,把 int 去掉就可以了
  29.         for(i=0;i<n;i++)
  30.         {
  31.                 for(int j=i+1;j<n;j++)
  32.                 {
  33.                         if((stu+j)->score<(stu+i)->score)
  34.                         {
  35.                                 tempsc=(stu+i)->score;
  36.                                 (stu+i)->score=(stu+j)->score;
  37.                                 (stu+j)->score=tempsc;
  38.                                 tempid=(stu+i)->id;
  39.                                 (stu+i)->id=(stu+j)->id;
  40.                                 (stu+j)->id=tempid;
  41.                         }
  42.                         //当成绩相等的时候比较id大小
  43.                         else if((stu+j)->score==(stu+i)->score)
  44.                         {
  45.                                 //交换id
  46.                                 if((stu+j)->id<(stu+i)->id)
  47.                                 {
  48.                                         tempsc=(stu+i)->score;
  49.                                         (stu+i)->score=(stu+j)->score;
  50.                                         (stu+j)->score=tempsc;
  51.                                         tempid=(stu+i)->id;
  52.                                         (stu+i)->id=(stu+j)->id;
  53.                                         (stu+j)->id=tempid;
  54.                                 }
  55.                         }
  56.                 }
  57.         }
  58.         //输出数据
  59.         //前面的for循环里已经定义 i 了,这里不需要再定义了,把 int 去掉就可以了
  60.         for(i=0;i<n;i++)
  61.         {
  62.                 printf("%d:%d\n",(stu+i)->id,(stu+i)->score);
  63.         }
  64.         free(stu);
  65.         return 0;
  66. }

复制代码

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

使用道具 举报

 楼主| 发表于 2020-10-28 11:56:46 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 21:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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