鱼C论坛

 找回密码
 立即注册
查看: 581|回复: 6

[已解决]帮忙看到题, 整数处理的, 总是通不过测试.

[复制链接]
发表于 2023-7-14 22:41:41 | 显示全部楼层 |阅读模式

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

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

x
  1. /*
  2. *  输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
  3. *  写三个函数; ①输入10个数;②进行处理;③输出10个数。
  4. *
  5. */

  6. #include <stdio.h>

  7. #define LEN 10


  8. void GetNumber(int number[])
  9. {
  10.       for (int i = 0; i < LEN; i++)
  11.       {
  12.             scanf("%d", &number[i]);
  13.       }
  14. }

  15. void Swap(int number[])
  16. {
  17.       int max, min, temp;
  18.       int n, i;

  19.       max = min = number[0];
  20.       for (i = 0; i < LEN; i++)
  21.       {
  22.             if (max < number[i])
  23.             {
  24.                   max = number[i];
  25.                   n = i;
  26.             }
  27.       }
  28.       temp = number[n];
  29.       number[n] = number[LEN-1];
  30.       number[LEN-1] = temp;


  31.       n = 0;
  32.       for (i = 0; i < LEN; i++)
  33.       {
  34.             if (min > number[i])
  35.             {
  36.                   min = number[i];
  37.                   n = i;
  38.             }
  39.       }
  40.       temp = number[n];
  41.       number[n] = number[0];
  42.       number[0] = temp;
  43. }


  44. void Show(int number[])
  45. {
  46.       for (int i = 0; i < LEN; i++)
  47.       {
  48.             printf("%d ", number[i]);
  49.       }
  50. }


  51. int main(void)
  52. {
  53.       int number[LEN];

  54.       GetNumber(number);
  55.       Swap(number);
  56.       Show(number);


  57.       return 0;
  58. }
复制代码


上面这段代码我运行了很多次, 包括能想到的特殊值, 结果我觉得都对, 但就是不能通过测试, 请帮我看看问题出在哪里?  我就想知道有什么特殊值能得到错误的结果.
最佳答案
2023-7-14 22:47:00
你的代码中有一个问题:在 `Swap` 函数里,当找到最大值或最小值时,没有对变量 `n` 进行初始化,这样可能导致 `n` 的值是未定义的,从而交换出错。建议在函数开始时对 `n` 进行初始化,如 `int n = 0;`。这样就能保证在找到最大值或最小值之前,`n` 的值一定是合法的。
另外,你可以尝试输入一些边界值,比如全是正数、全是负数、正负数混合、有相同的数等等,以确保程序能够正确处理这些情况。
这是修改后的代码:
  1. #include <stdio.h>
  2. #define LEN 10
  3. void GetNumber(int number[]) {
  4.     for (int i = 0; i < LEN; i++) {
  5.         scanf("%d", &number[i]);
  6.     }
  7. }
  8. void Swap(int number[]) {
  9.     int max = number[0], min = number[0], max_index = 0, min_index = 0;
  10.     for (int i = 1; i < LEN; i++) {
  11.         if (number[i] > max) {
  12.             max = number[i];
  13.             max_index = i;
  14.         }
  15.         if (number[i] < min) {
  16.             min = number[i];
  17.             min_index = i;
  18.         }
  19.     }
  20.     int temp = number[0];
  21.     number[0] = min;
  22.     number[min_index] = temp;
  23.     temp = number[LEN - 1];
  24.     number[LEN - 1] = max;
  25.     number[max_index] = temp;
  26. }
  27. void Show(int number[]) {
  28.     for (int i = 0; i < LEN; i++) {
  29.         printf("%d ", number[i]);
  30.     }
  31. }
  32. int main(void) {
  33.     int number[LEN];
  34.     GetNumber(number);
  35.     Swap(number);
  36.     Show(number);
  37.     return 0;
  38. }
复制代码

主要修改了 `Swap` 函数。在该函数中,我们使用了两个变量 `max` 和 `min` 分别表示数组中的最大值和最小值,并用 `max_index` 和 `min_index` 记录它们的下标。然后交换数组中的元素即可。
另外,我们在输入数据时没有进行错误处理,如果输入非法数据可能会导致程序出错。你可以加上输入数据的错误处理,确保输入的数据是合法的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-14 22:47:00 | 显示全部楼层    本楼为最佳答案   
你的代码中有一个问题:在 `Swap` 函数里,当找到最大值或最小值时,没有对变量 `n` 进行初始化,这样可能导致 `n` 的值是未定义的,从而交换出错。建议在函数开始时对 `n` 进行初始化,如 `int n = 0;`。这样就能保证在找到最大值或最小值之前,`n` 的值一定是合法的。
另外,你可以尝试输入一些边界值,比如全是正数、全是负数、正负数混合、有相同的数等等,以确保程序能够正确处理这些情况。
这是修改后的代码:
  1. #include <stdio.h>
  2. #define LEN 10
  3. void GetNumber(int number[]) {
  4.     for (int i = 0; i < LEN; i++) {
  5.         scanf("%d", &number[i]);
  6.     }
  7. }
  8. void Swap(int number[]) {
  9.     int max = number[0], min = number[0], max_index = 0, min_index = 0;
  10.     for (int i = 1; i < LEN; i++) {
  11.         if (number[i] > max) {
  12.             max = number[i];
  13.             max_index = i;
  14.         }
  15.         if (number[i] < min) {
  16.             min = number[i];
  17.             min_index = i;
  18.         }
  19.     }
  20.     int temp = number[0];
  21.     number[0] = min;
  22.     number[min_index] = temp;
  23.     temp = number[LEN - 1];
  24.     number[LEN - 1] = max;
  25.     number[max_index] = temp;
  26. }
  27. void Show(int number[]) {
  28.     for (int i = 0; i < LEN; i++) {
  29.         printf("%d ", number[i]);
  30.     }
  31. }
  32. int main(void) {
  33.     int number[LEN];
  34.     GetNumber(number);
  35.     Swap(number);
  36.     Show(number);
  37.     return 0;
  38. }
复制代码

主要修改了 `Swap` 函数。在该函数中,我们使用了两个变量 `max` 和 `min` 分别表示数组中的最大值和最小值,并用 `max_index` 和 `min_index` 记录它们的下标。然后交换数组中的元素即可。
另外,我们在输入数据时没有进行错误处理,如果输入非法数据可能会导致程序出错。你可以加上输入数据的错误处理,确保输入的数据是合法的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-14 22:56:06 | 显示全部楼层
你的代码逻辑有些许问题。在你的  Swap()  函数中,你先找到最大值并与数组最后一个元素交换,然后再找到最小值并与数组第一个元素交换。但是,这里存在一个问题,如果你的数组中第一个数是最大的,那么在第二次查找最小值的时候,你会错误地把这个最大值当作最小值。

例如,对于这样的输入: 10 2 3 4 5 6 7 8 9 1 ,你的程序会输出: 10 2 3 4 5 6 7 8 9 1 ,这显然是错误的。

你需要把查找最小值和最大值的步骤分开来,分别在两个循环中完成,这样就不会有上述问题了。下面是修改后的代码:

  1. #include <stdio.h>

  2. #define LEN 10

  3. void GetNumber(int number[])
  4. {
  5.       for (int i = 0; i < LEN; i++)
  6.       {
  7.             scanf("%d", &number[i]);
  8.       }
  9. }

  10. void Swap(int number[])
  11. {
  12.       int max, min, temp;
  13.       int nMax, nMin, i;

  14.       max = min = number[0];
  15.       nMax = nMin = 0;
  16.       
  17.       for (i = 0; i < LEN; i++)
  18.       {
  19.             if (max < number[i])
  20.             {
  21.                   max = number[i];
  22.                   nMax = i;
  23.             }

  24.             if (min > number[i])
  25.             {
  26.                   min = number[i];
  27.                   nMin = i;
  28.             }
  29.       }

  30.       temp = number[nMax];
  31.       number[nMax] = number[LEN-1];
  32.       number[LEN-1] = temp;

  33.       if(nMin == LEN-1) nMin = nMax; // 如果最小值原来是最后一个数,则现在应该是刚刚交换过的位置,即最大值原来的位置。
  34.       temp = number[nMin];
  35.       number[nMin] = number[0];
  36.       number[0] = temp;
  37. }

  38. void Show(int number[])
  39. {
  40.       for (int i = 0; i < LEN; i++)
  41.       {
  42.             printf("%d ", number[i]);
  43.       }
  44. }

  45. int main(void)
  46. {
  47.       int number[LEN];

  48.       GetNumber(number);
  49.       Swap(number);
  50.       Show(number);

  51.       return 0;
  52. }
复制代码


这段代码可以正确地找到并交换最大值和最小值。希望这能解决你的问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-14 22:57:01 | 显示全部楼层
sfqxx 发表于 2023-7-14 22:47
你的代码中有一个问题:在 `Swap` 函数里,当找到最大值或最小值时,没有对变量 `n` 进行初始化,这样可能 ...

反对陶远航从我做起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-15 09:06:08 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2023-7-15 15:00:17 | 显示全部楼层
多谢  sfqxx , 如你所说, 加了一句

n = 0;

果然过了测试.


isdkz, 你的代码比我写的精巧, 获益良多.

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

使用道具 举报

发表于 2023-7-15 16:34:26 | 显示全部楼层
七彩云南 发表于 2023-7-15 15:00
多谢  sfqxx , 如你所说, 加了一句

n = 0;

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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