鱼C论坛

 找回密码
 立即注册
查看: 452|回复: 10

[已解决]冒泡排序的几个疑问

[复制链接]
发表于 2023-7-5 18:13:30 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 houqing1999 于 2023-7-5 19:50 编辑

//这个冒泡排序在Visual Studio环境下运行出现一些警告,请问这些警告通俗的讲是什么意思,以及怎么修改程序来消除这些警告,如图: 微信图片_20230705180946.png

  1. #define _CRT_SECURE_NO_WARNINGS 1

  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. typedef int ElemType;

  5. void bubble_sort(ElemType array[], int length);
  6. void swap(int* a, int* b);

  7. void swap(int* a, int* b)
  8. {
  9.     int temp = a;
  10.     a = b;
  11.     b = temp;
  12. }
  13. void bubble_sort(ElemType array[], int length)
  14. {
  15.     int i, j;

  16.     for (i = 0; i < length - 1; i++)
  17.     {
  18.         bool flag = false;
  19.         for (j = length-1; j > i; j--)
  20.         {
  21.             if (array[j-1] > array[j])
  22.             {
  23.                 swap(array[j - 1], array[j]);
  24.                 flag = true;
  25.             }
  26.             if (flag == false)
  27.             {
  28.                 return;
  29.             }
  30.         }
  31.     }
  32. }

  33. int main(void)
  34. {
  35.     int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
  36.     int i, length;

  37.     length = sizeof(array) / sizeof(array[0]);
  38.     bubble_sort(array, length);

  39.     printf("排序后的结果是:");
  40.     for (i = 0; i < length; i++)
  41.     {
  42.         printf("%d ", array[i]);
  43.     }
  44.     putchar('\n');

  45.     return 0;
  46. }
复制代码


还想问一下30行为什么不用rerurn 0;
  1. if (flag == false)
  2.             {
  3.                 return;
  4.             }
复制代码



家人们修改后的代码没有警告了但我不知道为什么把swap函数里的解引用*去掉后就没事了,仅此问题解决我设置为最佳答案,谢谢。
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. typedef int ElemType;

  4. void bubble_sort(ElemType array[], int length);
  5. void swap(int a, int b);

  6. void swap(int a, int b)
  7. {
  8.     int temp = a;
  9.     a = b;
  10.     b = temp;
  11. }
  12. void bubble_sort(ElemType array[], int length)
  13. {
  14.     int i, j;

  15.     for (i = 0; i < length - 1; i++)
  16.     {
  17.         bool flag = false;
  18.         for (j = length-1; j > i; j--)
  19.         {
  20.             if (array[j-1] > array[j])
  21.             {
  22.                 swap(array[j - 1], array[j]);
  23.                 flag = true;
  24.             }
  25.             if (!flag)
  26.             {
  27.                 return;
  28.             }
  29.         }
  30.     }
  31. }

  32. int main(void)
  33. {
  34.     int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
  35.     int i, length;

  36.     length = sizeof(array) / sizeof(array[0]);
  37.     bubble_sort(array, length);

  38.     printf("排序后的结果是:");
  39.     for (i = 0; i < length; i++)
  40.     {
  41.         printf("%d ", array[i]);
  42.     }
  43.     putchar('\n');

  44.     return 0;
  45. }
复制代码
最佳答案
2023-7-6 08:14:20
这些警告通常指示代码中存在一些潜在的问题或不安全的行为。对于这个冒泡排序程序,以下是关于警告的解释和修改方法:

1. "将 int* 类型转换为 int":
   这个警告出现在 `swap` 函数中,因为你错误地将 `int` 类型的指针 `a` 和 `b` 分别赋值给了 `temp`。正确的做法是将 `*a` 和 `*b` 的值赋给 `temp`,即使用解引用操作符 `*`:`int temp = *a;` 和 `*a = *b;` 和 `*b = temp;`。

修改后的 `swap` 函数如下:
  1. void swap(int* a, int* b)
  2. {
  3.     int temp = *a;
  4.     *a = *b;
  5.     *b = temp;
  6. }
复制代码


2. "if 语句永远是 true":
   这个警告出现在 `bubble_sort` 函数中的条件判断 `if (flag == false)` 外面。由于该条件判断位于内层循环中,当 `flag` 第一次变为 `false` 时,程序会立即执行 `return`,导致提前退出循环,无法对整个数组进行完整的排序。因此,应将该条件判断移至外层循环之后。

修改后的 `bubble_sort` 函数如下:
  1. void bubble_sort(ElemType array[], int length)
  2. {
  3.     int i, j;

  4.     for (i = 0; i < length - 1; i++)
  5.     {
  6.         bool flag = false;
  7.         for (j = length-1; j > i; j--)
  8.         {
  9.             if (array[j-1] > array[j])
  10.             {
  11.                 swap(&array[j - 1], &array[j]);
  12.                 flag = true;
  13.             }
  14.         }
  15.         if (flag == false)
  16.         {
  17.             return;
  18.         }
  19.     }
  20. }
复制代码

至于为什么你移除了 `swap` 函数中的解引用操作符 `*` 后不再出现警告,这是因为修改后的 `swap` 函数参数类型由指针变为了整型 `int`。解引用操作符在这种情况下不再需要。

希望以上解释和修改能够帮助你理解并消除代码中的警告。如果有任何疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 18:13:51 | 显示全部楼层

回帖奖励 +10 鱼币

在您提供的冒泡排序代码中,有一些警告出现在Visual Studio环境下。通常,这些警告是由编译器检测到的代码潜在问题或不规范的写法导致的。以下是对您所提到的几个警告的解释以及如何修改程序来消除这些警告:

1. 警告:warning C4047: “==”: 不建议“bool”和“int”之间的比较
   这个警告是因为在 if (flag == false) 中,使用了 bool 类型变量 flagfalse(0)进行比较。C语言中,不推荐直接将 bool 类型与整数类型进行比较。为了消除这个警告,可以将 if 语句改为 if (!flag)

2. 警告:warning C4133: “=”:指针与指向相同类型不兼容的整数
   这个警告是因为在 swap 函数中,交换指针时使用了错误的操作。应该使用临时指针变量来交换指针指向的值。修改 swap 函数为:
  
  1. c
  2.    void swap(int[i] a, int[/i] b) {
  3.        int temp = *a;
  4.        [i]a = [/i]b;
  5.        *b = temp;
  6.    }
  7.    
复制代码

3. 警告:warning C4700: “flag”: 未初始化的局部变量
   这个警告是因为在 for 循环中,flag 变量在某些情况下可能没有被初始化。为了消除这个警告,可以在 bubble_sort 函数开始时将 flag 初始化为 false。修改 bubble_sort 函数为:
  
  1. c
  2.    void bubble_sort(ElemType array[], int length) {
  3.        int i, j;
  4.        for (i = 0; i < length - 1; i++) {
  5.            bool flag = false;
  6.            for (j = length - 1; j > i; j--) {
  7.                if (array[j-1] > array[j]){
  8.                    swap(&array[j - 1], &array[j]);
  9.                    flag = true;
  10.                }
  11.            }
  12.            if (flag == false) {
  13.                return;
  14.            }
  15.        }
  16.    }
  17.    
复制代码

至于您关于第30行为什么不用 return 0; 的疑问,这是因为在 main 函数中,当程序正常执行完毕并成功退出时,C语言约定返回 0 来表示程序运行成功。而在您的代码中,可以直接在 return 0; 后面的大括号外面省略这一行,因为这是默认的行为。

希望这些解释和修改能够帮助您消除警告并使代码正常运行。如有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 18:24:30 | 显示全部楼层

回帖奖励 +10 鱼币

占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 18:56:38 | 显示全部楼层
能别用Visualstudio了吗,太笨重了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:11:03 | 显示全部楼层
歌者文明清理员 发表于 2023-7-5 18:56
能别用Visualstudio了吗,太笨重了

家人,我考研学校用的这个,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:19:16 | 显示全部楼层
houqing1999 发表于 2023-7-5 19:11
家人,我考研学校用的这个,

……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:35:22 | 显示全部楼层
陶远航 发表于 2023-7-5 18:13
在您提供的冒泡排序代码中,有一些警告出现在Visual Studio环境下。通常,这些警告是由编译器检测到的代码 ...

根据你提供的代码,甚至报错,原因在于警告二中使用临时变量指针
void swap(int a, int b)
{   
   int temp = *a;   
    a = b;   //这句代码是个什么东西,是C语言里的吗,我不认识,编译器也不认识
    *b = temp;
  }   

还有警告三你只修改了swap函数swap(&array[j - 1], &array[j]);里,这个修改后确实警告变少了,可是为什么两个数组要用取地址符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:37:23 | 显示全部楼层
houqing1999 发表于 2023-7-5 19:35
根据你提供的代码,甚至报错,原因在于警告二中使用临时变量指针
void swap(int a, int b)
{   

ChatGPT是个好东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:41:05 | 显示全部楼层
陶远航 发表于 2023-7-5 19:37
ChatGPT是个好东西

推荐一个fq的软件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 23:21:17 | 显示全部楼层
houqing1999 发表于 2023-7-5 19:41
推荐一个fq的软件?

又不用fq,国内镜像:c.binjie.fun
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-6 08:14:20 | 显示全部楼层    本楼为最佳答案   
这些警告通常指示代码中存在一些潜在的问题或不安全的行为。对于这个冒泡排序程序,以下是关于警告的解释和修改方法:

1. "将 int* 类型转换为 int":
   这个警告出现在 `swap` 函数中,因为你错误地将 `int` 类型的指针 `a` 和 `b` 分别赋值给了 `temp`。正确的做法是将 `*a` 和 `*b` 的值赋给 `temp`,即使用解引用操作符 `*`:`int temp = *a;` 和 `*a = *b;` 和 `*b = temp;`。

修改后的 `swap` 函数如下:
  1. void swap(int* a, int* b)
  2. {
  3.     int temp = *a;
  4.     *a = *b;
  5.     *b = temp;
  6. }
复制代码


2. "if 语句永远是 true":
   这个警告出现在 `bubble_sort` 函数中的条件判断 `if (flag == false)` 外面。由于该条件判断位于内层循环中,当 `flag` 第一次变为 `false` 时,程序会立即执行 `return`,导致提前退出循环,无法对整个数组进行完整的排序。因此,应将该条件判断移至外层循环之后。

修改后的 `bubble_sort` 函数如下:
  1. void bubble_sort(ElemType array[], int length)
  2. {
  3.     int i, j;

  4.     for (i = 0; i < length - 1; i++)
  5.     {
  6.         bool flag = false;
  7.         for (j = length-1; j > i; j--)
  8.         {
  9.             if (array[j-1] > array[j])
  10.             {
  11.                 swap(&array[j - 1], &array[j]);
  12.                 flag = true;
  13.             }
  14.         }
  15.         if (flag == false)
  16.         {
  17.             return;
  18.         }
  19.     }
  20. }
复制代码

至于为什么你移除了 `swap` 函数中的解引用操作符 `*` 后不再出现警告,这是因为修改后的 `swap` 函数参数类型由指针变为了整型 `int`。解引用操作符在这种情况下不再需要。

希望以上解释和修改能够帮助你理解并消除代码中的警告。如果有任何疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 15:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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