鱼C论坛

 找回密码
 立即注册
查看: 2027|回复: 1

[已解决]冒泡排序不起作用

[复制链接]
发表于 2022-10-7 20:43:00 | 显示全部楼层 |阅读模式

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

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

x
大佬们,可以帮我看看我这个代码中冒泡排序为啥没有生效吗,我感觉是作用域的问题,可是我不知道怎么处理

3,5
5.6 7.8 9.4 5.8 8.8
7.8 6.7 8.3 6.9 5.5
6.7 9.2 8.8 8.3 9.0

这个是样例输入

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

  3. int main(void)
  4. {
  5.         int n, m;
  6.         float sum = 0;
  7.         float average;
  8.         float grade_list[45];  //成绩暂存
  9.         int list[45]; // 成员名单
  10.         float final_grade[60];
  11.         memset(grade_list,0,sizeof(grade_list));

  12.         scanf("%d,%d", &n, &m);

  13.         //初始化成员名单下标
  14.         for (int a = 0; a < 45;a++)
  15.         {
  16.                 list[a] = a;
  17.         }       

  18.         //循环输入
  19.         for (int i = 0; i < n; i++)  // 循环选手
  20.         {
  21.                 for (int j = 0; j < m; j++)  // 循环评委
  22.                 {
  23.                         scanf("%f", &grade_list[j]);
  24.                 }
  25.                 //去除极值
  26.                 for (int i = 0; i < n - 1; i++)
  27.                 {
  28.                         for (int j = 0; j < n - 1 - i; j++)
  29.                         {
  30.                                 if (grade_list[j] > grade_list[j + 1])
  31.                                 {
  32.                                         float g = grade_list[j];
  33.                                         grade_list[j] = grade_list[j + 1];
  34.                                         grade_list[j + 1] = g;
  35.                                 }
  36.                         }
  37.                 }
  38.                 for (int i = 1; i < m; i++)
  39.                 {
  40.                         //printf("%.2f\n", sum);
  41.                         sum += grade_list[i];
  42.                 }
  43.                 final_grade[i] = sum / (m-2);
  44.         }

  45.         // 冒泡排序
  46.         for (int i = 0; i < n - 1; i++)
  47.         {
  48.                 for (int j = 0; j < n - 1 - i; j++)
  49.                 {
  50.                         if (final_grade[j] > final_grade[j + 1])
  51.                         {
  52.                                 float t = final_grade[j] , k = list[j];
  53.                                 final_grade[j] = final_grade[j + 1];
  54.                                 list[j] = list[j + 1];
  55.                                 final_grade[j + 1] = t;
  56.                                 list[j + 1] = k;
  57.                         }
  58.                 }
  59.         }


  60.         //输出结果
  61.         for (int i = 0; i < n; i++)
  62.         {
  63.                 if (i != n - 1)
  64.                 {
  65.                         printf("第%d名:%d号选手,得分%.2f\n", i + 1, list[i]+1, final_grade[i]);
  66.                 }
  67.                 else
  68.                 {
  69.                         printf("第%d名:%d号选手,得分%.2f", i + 1, list[i]+1, final_grade[i]);
  70.                 }
  71.         }

  72.         return 0;
  73. }
复制代码
最佳答案
2022-10-7 21:17:05
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>          // 添加此文件,否则,memset() 会用不了

  4. int main(void)
  5. {
  6.         int i , j , n , m    ;
  7.         float min , max, sum ;
  8.         float average        ;
  9.         float grade_list[45];  //成绩暂存
  10.         int list[45]; // 成员名单
  11.         float final_grade[60];
  12.         memset(grade_list,0,sizeof(grade_list));

  13.         scanf("%d,%d", &n, &m);

  14.         //初始化成员名单下标
  15.         for (int a = 0 ; a < 45 ; a ++)
  16.         {
  17.                 list[a] = a;
  18.         }        

  19.         //循环输入
  20.         for (i = 0; i < n; i ++)  // 循环选手
  21.         {
  22.                 for (j = 0; j < m; j++)  // 循环评委
  23.                 {
  24.                         scanf("%f", &grade_list[j]);
  25.                 }
  26.                 //【修改】:去除极值的代码完全重写
  27.                 for(sum = 0 , min = max = grade_list[0] , j = 0 ; j < m ; j ++) {
  28.                         sum += grade_list[j]                        ;
  29.                         if(grade_list[j] < min) min = grade_list[j] ;
  30.                         if(grade_list[j] > max) max = grade_list[j] ;
  31.                 }
  32.                 final_grade[i] = (sum - max - min) / (m - 2)        ;
  33.         }

  34.         // 冒泡排序
  35.         for (i = 0; i < n - 1; i++)
  36.         {
  37.                 for (j = 0; j < n - 1 - i; j++)
  38.                 {
  39.                         if (final_grade[j] < final_grade[j + 1])           // 【修改】:排序结果是反序的,把 > 改为 < 即可
  40.                         {
  41.                                 float t = final_grade[j] , k = list[j];
  42.                                 final_grade[j] = final_grade[j + 1];
  43.                                 list[j] = list[j + 1];
  44.                                 final_grade[j + 1] = t;
  45.                                 list[j + 1] = k;
  46.                         }
  47.                 }
  48.         }


  49.         //输出结果
  50.         for (int i = 0; i < n; i++)
  51.         {
  52.                 if (i != n - 1)
  53.                 {
  54.                         printf("第%d名:%d号选手,得分%.2f\n", i + 1, list[i]+1, final_grade[i]);
  55.                 }
  56.                 else
  57.                 {
  58.                         printf("第%d名:%d号选手,得分%.2f", i + 1, list[i]+1, final_grade[i]);
  59.                 }
  60.         }

  61.         return 0;
  62. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o t t.c

  2. D:\[00.Exerciese.2022]\C>t
  3. 3,5
  4. 5.6 7.8 9.4 5.8 8.8
  5. 7.8 6.7 8.3 6.9 5.5
  6. 6.7 9.2 8.8 8.3 9.0
  7. 第1名:3号选手,得分8.70
  8. 第2名:1号选手,得分7.47
  9. 第3名:2号选手,得分7.13
  10. D:\[00.Exerciese.2022]\C>g++ -o t t.c

  11. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 21:17:05 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>          // 添加此文件,否则,memset() 会用不了

  4. int main(void)
  5. {
  6.         int i , j , n , m    ;
  7.         float min , max, sum ;
  8.         float average        ;
  9.         float grade_list[45];  //成绩暂存
  10.         int list[45]; // 成员名单
  11.         float final_grade[60];
  12.         memset(grade_list,0,sizeof(grade_list));

  13.         scanf("%d,%d", &n, &m);

  14.         //初始化成员名单下标
  15.         for (int a = 0 ; a < 45 ; a ++)
  16.         {
  17.                 list[a] = a;
  18.         }        

  19.         //循环输入
  20.         for (i = 0; i < n; i ++)  // 循环选手
  21.         {
  22.                 for (j = 0; j < m; j++)  // 循环评委
  23.                 {
  24.                         scanf("%f", &grade_list[j]);
  25.                 }
  26.                 //【修改】:去除极值的代码完全重写
  27.                 for(sum = 0 , min = max = grade_list[0] , j = 0 ; j < m ; j ++) {
  28.                         sum += grade_list[j]                        ;
  29.                         if(grade_list[j] < min) min = grade_list[j] ;
  30.                         if(grade_list[j] > max) max = grade_list[j] ;
  31.                 }
  32.                 final_grade[i] = (sum - max - min) / (m - 2)        ;
  33.         }

  34.         // 冒泡排序
  35.         for (i = 0; i < n - 1; i++)
  36.         {
  37.                 for (j = 0; j < n - 1 - i; j++)
  38.                 {
  39.                         if (final_grade[j] < final_grade[j + 1])           // 【修改】:排序结果是反序的,把 > 改为 < 即可
  40.                         {
  41.                                 float t = final_grade[j] , k = list[j];
  42.                                 final_grade[j] = final_grade[j + 1];
  43.                                 list[j] = list[j + 1];
  44.                                 final_grade[j + 1] = t;
  45.                                 list[j + 1] = k;
  46.                         }
  47.                 }
  48.         }


  49.         //输出结果
  50.         for (int i = 0; i < n; i++)
  51.         {
  52.                 if (i != n - 1)
  53.                 {
  54.                         printf("第%d名:%d号选手,得分%.2f\n", i + 1, list[i]+1, final_grade[i]);
  55.                 }
  56.                 else
  57.                 {
  58.                         printf("第%d名:%d号选手,得分%.2f", i + 1, list[i]+1, final_grade[i]);
  59.                 }
  60.         }

  61.         return 0;
  62. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o t t.c

  2. D:\[00.Exerciese.2022]\C>t
  3. 3,5
  4. 5.6 7.8 9.4 5.8 8.8
  5. 7.8 6.7 8.3 6.9 5.5
  6. 6.7 9.2 8.8 8.3 9.0
  7. 第1名:3号选手,得分8.70
  8. 第2名:1号选手,得分7.47
  9. 第3名:2号选手,得分7.13
  10. D:\[00.Exerciese.2022]\C>g++ -o t t.c

  11. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 14:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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