七彩云南 发表于 2023-7-14 22:41:41

帮忙看到题, 整数处理的, 总是通不过测试.

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

#include <stdio.h>

#define LEN 10


void GetNumber(int number[])
{
      for (int i = 0; i < LEN; i++)
      {
            scanf("%d", &number);
      }
}

void Swap(int number[])
{
      int max, min, temp;
      int n, i;

      max = min = number;
      for (i = 0; i < LEN; i++)
      {
            if (max < number)
            {
                  max = number;
                  n = i;
            }
      }
      temp = number;
      number = number;
      number = temp;


      n = 0;
      for (i = 0; i < LEN; i++)
      {
            if (min > number)
            {
                  min = number;
                  n = i;
            }
      }
      temp = number;
      number = number;
      number = temp;
}


void Show(int number[])
{
      for (int i = 0; i < LEN; i++)
      {
            printf("%d ", number);
      }
}


int main(void)
{
      int number;

      GetNumber(number);
      Swap(number);
      Show(number);


      return 0;
}


上面这段代码我运行了很多次, 包括能想到的特殊值, 结果我觉得都对, 但就是不能通过测试, 请帮我看看问题出在哪里?我就想知道有什么特殊值能得到错误的结果.

sfqxx 发表于 2023-7-14 22:47:00

你的代码中有一个问题:在 `Swap` 函数里,当找到最大值或最小值时,没有对变量 `n` 进行初始化,这样可能导致 `n` 的值是未定义的,从而交换出错。建议在函数开始时对 `n` 进行初始化,如 `int n = 0;`。这样就能保证在找到最大值或最小值之前,`n` 的值一定是合法的。
另外,你可以尝试输入一些边界值,比如全是正数、全是负数、正负数混合、有相同的数等等,以确保程序能够正确处理这些情况。
这是修改后的代码:
#include <stdio.h>
#define LEN 10
void GetNumber(int number[]) {
    for (int i = 0; i < LEN; i++) {
      scanf("%d", &number);
    }
}
void Swap(int number[]) {
    int max = number, min = number, max_index = 0, min_index = 0;
    for (int i = 1; i < LEN; i++) {
      if (number > max) {
            max = number;
            max_index = i;
      }
      if (number < min) {
            min = number;
            min_index = i;
      }
    }
    int temp = number;
    number = min;
    number = temp;
    temp = number;
    number = max;
    number = temp;
}
void Show(int number[]) {
    for (int i = 0; i < LEN; i++) {
      printf("%d ", number);
    }
}
int main(void) {
    int number;
    GetNumber(number);
    Swap(number);
    Show(number);
    return 0;
}
主要修改了 `Swap` 函数。在该函数中,我们使用了两个变量 `max` 和 `min` 分别表示数组中的最大值和最小值,并用 `max_index` 和 `min_index` 记录它们的下标。然后交换数组中的元素即可。
另外,我们在输入数据时没有进行错误处理,如果输入非法数据可能会导致程序出错。你可以加上输入数据的错误处理,确保输入的数据是合法的。

isdkz 发表于 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 ,这显然是错误的。

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

#include <stdio.h>

#define LEN 10

void GetNumber(int number[])
{
      for (int i = 0; i < LEN; i++)
      {
            scanf("%d", &number);
      }
}

void Swap(int number[])
{
      int max, min, temp;
      int nMax, nMin, i;

      max = min = number;
      nMax = nMin = 0;
      
      for (i = 0; i < LEN; i++)
      {
            if (max < number)
            {
                  max = number;
                  nMax = i;
            }

            if (min > number)
            {
                  min = number;
                  nMin = i;
            }
      }

      temp = number;
      number = number;
      number = temp;

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

void Show(int number[])
{
      for (int i = 0; i < LEN; i++)
      {
            printf("%d ", number);
      }
}

int main(void)
{
      int number;

      GetNumber(number);
      Swap(number);
      Show(number);

      return 0;
}


这段代码可以正确地找到并交换最大值和最小值。希望这能解决你的问题!

歌者文明清理员 发表于 2023-7-14 22:57:01

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

{:10_275:}反对陶远航从我做起

陶远航 发表于 2023-7-15 09:06:08

歌者文明清理员 发表于 2023-7-14 22:57
反对陶远航从我做起

啊对对对

七彩云南 发表于 2023-7-15 15:00:17

多谢sfqxx , 如你所说, 加了一句

n = 0;

果然过了测试.


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

sfqxx 发表于 2023-7-15 16:34:26

七彩云南 发表于 2023-7-15 15:00
多谢sfqxx , 如你所说, 加了一句

n = 0;


{:10_265:}
页: [1]
查看完整版本: 帮忙看到题, 整数处理的, 总是通不过测试.