鱼C论坛

 找回密码
 立即注册
查看: 1519|回复: 11

[已解决]有疑问 为什么我运行的时候 最小的数跟第一个数对换不了

[复制链接]
发表于 2020-12-20 18:08:10 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
最佳答案
2020-12-21 09:06:50
宇轩宇轩! 发表于 2020-12-20 20:40
j=0 是用来干嘛的哦 有点小疑问
没有用的,从指针那边改过来,没有删除干净。原来的本意是想记录最大最小值的位置,给它一个初始值


纠正上面的说法,j = 0,是记录最大最小值的位置没有错。但第25行的 j = 0 却不能删除!因为前面 j 的记录是最大值的位置,如果查找最小值时不让它回到初始位置,那么如果最小值原本就在a[0] 处,第28行到第31行就不会有任何动作,所查找的最小值的位置就会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-20 18:11:38 | 显示全部楼层
上代码?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-20 18:12:46 | 显示全部楼层
  1. #include<stdio.h>

  2. int main()

  3. {
  4.         void max(int *p, int n);
  5.         void min(int *p, int n);
  6.         int a[10];
  7.         int i, n = 10, *p;
  8.         p = a;
  9.         printf("输入10个整数:\n");
  10.         for (i = 0;i < 10;i++)
  11.         {
  12.                 scanf("%d", &a[i]);
  13.         }
  14.         max(a, n);
  15.         min(a, n);
  16.         for (i = 0;i < n;i++)
  17.         {
  18.                 printf("%d ", a[i]);
  19.         }
  20.         printf("\n");

  21. }

  22. void max(int *p, int n)
  23. {
  24.         int i, j, temp;
  25.         temp = *(p + 9);
  26.         for (i = 9;i >= 0;i--)
  27.         {
  28.                 if (temp < *(p + i))
  29.                 {
  30.                         temp = *(p + i);
  31.                         j = i;
  32.                 }
  33.         }
  34.         *(p + j) = *(p + 9);
  35.         *(p + 9) = temp;
  36. }

  37. void min(int *p, int n)
  38. {
  39.         int i, j, temp;
  40.         temp = *p;
  41.         j = 0;
  42.         for (i = 1;i < n;i++)
  43.         {
  44.                 if (temp > *(p + i))
  45.                 {
  46.                         temp = *(p + i);
  47.                         j = i;
  48.                 }
  49.         }
  50.         *(p + j) = *p;
  51.         *p = temp;
  52. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-20 18:30:11 From FishC Mobile | 显示全部楼层
有不带指针和函数做的代码吗?想看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-20 19:02:39 | 显示全部楼层
宇轩宇轩! 发表于 2020-12-20 18:30
有不带指针和函数做的代码吗?想看看

好,我给你改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-20 19:57:26 | 显示全部楼层
宇轩宇轩! 发表于 2020-12-20 18:30
有不带指针和函数做的代码吗?想看看
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i, j, temp, a[10];
  5.         printf("输入10个整数:\n");
  6.         for (i = 0;i < 10;i++)
  7.         {
  8.                 scanf("%d", &a[i]);
  9.         }

  10.         temp = a[9];              // 假设最大的数在最后一个单元
  11.         for (i = 9;i >= 0;i--)
  12.         {
  13.                 if (temp < a[i])     // 数组中每一个元素都与假设的最大数比较
  14.                 {
  15.                         temp = a[i];     // 找到大于假设的最大的数
  16.                         j = i;           // 记录该数的位置
  17.                 }
  18.         }
  19.         a[j] = a[9];             // 最大的数与最后一个单元交换
  20.         a[9] = temp;

  21.         temp = a[0];             // 假设最小的数在第一个单元
  22.         j = 0;
  23.         for (i = 1;i < 10;i++)
  24.         {
  25.                 if (temp > a[i])     // 数组中每一个元素都与假设的最小数比较
  26.                 {
  27.                         temp = a[i];     // 找到小于假设的最小的数
  28.                         j = i;           // 记录该数的位置
  29.                 }
  30.         }
  31.         a[j] = a[0];             // 最小的数与第一个单元交换
  32.         a[0] = temp;

  33.         for (i = 0;i < 10;i++)    // 输出交换后的数组
  34.         {
  35.                 printf("%d ", a[i]);
  36.         }
  37.         printf("\n");
  38. }
复制代码

指定位置交换.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-20 20:32:10 From FishC Mobile | 显示全部楼层
谢谢,非常感谢,困惑了一晚上了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-20 20:38:49 From FishC Mobile | 显示全部楼层
我想问下 代码中j的作用是啥哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-20 20:40:25 From FishC Mobile | 显示全部楼层
j=0 是用来干嘛的哦 有点小疑问
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-20 21:50:41 | 显示全部楼层
宇轩宇轩! 发表于 2020-12-20 20:40
j=0 是用来干嘛的哦 有点小疑问

没有用的,从指针那边改过来,没有删除干净。原来的本意是想记录最大最小值的位置,给它一个初始值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-20 21:53:07 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-12-20 21:58 编辑
宇轩宇轩! 发表于 2020-12-20 20:38
我想问下 代码中j的作用是啥哦


j 记录找到数的位置呀
                      j = i;           // 记录该数的位置
                }
        }
        a[j] = a[9];             // 最大的数与最后一个单元交换
        a[9] = temp;

                       j = i;           // 记录该数的位置
                }
        }
        a[j] = a[0];             // 最小的数与第一个单元交换
        a[0] = temp;

如果你直接用 i 那是不对的, 因为这个赋值是在遍历数组之后才能最终确定最大值,也只有这个时候才能赋到最后的单元 a[j] = a[9]; a[9] = temp;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 09:06:50 | 显示全部楼层    本楼为最佳答案   
宇轩宇轩! 发表于 2020-12-20 20:40
j=0 是用来干嘛的哦 有点小疑问
没有用的,从指针那边改过来,没有删除干净。原来的本意是想记录最大最小值的位置,给它一个初始值


纠正上面的说法,j = 0,是记录最大最小值的位置没有错。但第25行的 j = 0 却不能删除!因为前面 j 的记录是最大值的位置,如果查找最小值时不让它回到初始位置,那么如果最小值原本就在a[0] 处,第28行到第31行就不会有任何动作,所查找的最小值的位置就会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 21:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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