鱼C论坛

 找回密码
 立即注册
查看: 1565|回复: 2

[已解决]求助一下

[复制链接]
发表于 2023-11-2 22:38:01 | 显示全部楼层 |阅读模式

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

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

x
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8

这个题怎么做

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int arr[n];int i;int max;
    int min;int temp;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    for(int i=0;i<n;i++)
    {
    max=arr[i]>=arr[i+1]?i:i+1;
        min=arr[i]<=arr[i+1]?i:i+1;
        temp=arr[max];
        arr[max]=arr[min];
        arr[min]=temp;
        cout<<arr[i]<<" ";
    }
   
}

我的代码哪里错了,要怎么改
最佳答案
2023-11-2 22:38:17
你的代码有几个问题。首先,你在循环中使用了两个相邻元素进行比较,但是在最后一次循环时, arr[i+1] 是越界的,会导致程序崩溃。其次,你没有正确交换最小值和第一个数,以及最大值和最后一个数。最后,你应该在循环结束后输出整个交换后的序列,而不是在每次循环中输出一个元素。

下面是修改后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n;
  6.     cin>>n;
  7.     int arr[n];
  8.     int maxIndex = 0;
  9.     int minIndex = 0;
  10.     for(int i=0;i<n;i++)
  11.     {
  12.         cin>>arr[ i];
  13.         if(arr[ i] > arr[maxIndex])
  14.         {
  15.             maxIndex = i;
  16.         }
  17.         if(arr[ i] < arr[minIndex])
  18.         {
  19.             minIndex = i;
  20.         }
  21.     }
  22.     int temp = arr[minIndex];
  23.     arr[minIndex] = arr[0];
  24.     arr[0] = temp;
  25.    
  26.     temp = arr[maxIndex];
  27.     arr[maxIndex] = arr[n-1];
  28.     arr[n-1] = temp;
  29.    
  30.     for(int i=0;i<n;i++)
  31.     {
  32.         cout<<arr[ i]<<" ";
  33.     }
  34.     return 0;
  35. }
复制代码


这样修改后的代码会正确地交换最小值和第一个数,以及最大值和最后一个数,并且输出交换后的整个序列。

希望对你有所帮助!如果你还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-2 22:38:17 | 显示全部楼层    本楼为最佳答案   
你的代码有几个问题。首先,你在循环中使用了两个相邻元素进行比较,但是在最后一次循环时, arr[i+1] 是越界的,会导致程序崩溃。其次,你没有正确交换最小值和第一个数,以及最大值和最后一个数。最后,你应该在循环结束后输出整个交换后的序列,而不是在每次循环中输出一个元素。

下面是修改后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n;
  6.     cin>>n;
  7.     int arr[n];
  8.     int maxIndex = 0;
  9.     int minIndex = 0;
  10.     for(int i=0;i<n;i++)
  11.     {
  12.         cin>>arr[ i];
  13.         if(arr[ i] > arr[maxIndex])
  14.         {
  15.             maxIndex = i;
  16.         }
  17.         if(arr[ i] < arr[minIndex])
  18.         {
  19.             minIndex = i;
  20.         }
  21.     }
  22.     int temp = arr[minIndex];
  23.     arr[minIndex] = arr[0];
  24.     arr[0] = temp;
  25.    
  26.     temp = arr[maxIndex];
  27.     arr[maxIndex] = arr[n-1];
  28.     arr[n-1] = temp;
  29.    
  30.     for(int i=0;i<n;i++)
  31.     {
  32.         cout<<arr[ i]<<" ";
  33.     }
  34.     return 0;
  35. }
复制代码


这样修改后的代码会正确地交换最小值和第一个数,以及最大值和最后一个数,并且输出交换后的整个序列。

希望对你有所帮助!如果你还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-2 22:39:22 | 显示全部楼层
问题分析:

这个题目需要对输入的整数序列进行处理,获取最大值和最小值,然后将它们与序列的第一个数和最后一个数交换位置,最终输出交换后的序列。

在你的代码中,有一些问题需要解决:

1. max=arr[i]>=arr[i+1]?i:i+1; 这行代码会导致数组越界,当 i=n-1 时,arr[i+1] 就越界了。所以需要在循环中让 i<n-1

2. min=arr[i]<=arr[i+1]?i:i+1; 同样也会导致数组越界,同样需要在循环中让 i<n-1

3. cout<<arr[i]<<" "; 必须要等到全部交换完成后再输出序列,否则会输出不正确的序列。

4. 没有交换第一个数和最小值。需要在第一次循环结束后再进行交换。

5. 没有交换最后一个数和最大值。需要在第二次循环结束后再进行交换。

6. 需要在循环结束后输出交换后的序列。

解决方案:

下面是修改后的代码,已经添加了注释说明修改的地方。
  1. ++
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6.     int n;
  7.     cin >> n;
  8.     int arr[n], max, min, temp;
  9.     for (int i = 0; i < n; i++)
  10.     {
  11.         cin >> arr[i];
  12.     }
  13.     // 循环中让i<n-1,防止数组越界
  14.     for (int i = 0; i < n - 1; i++)
  15.     {
  16.         max = arr[i] >= arr[i + 1] ? i : i + 1;
  17.         min = arr[i] <= arr[i + 1] ? i : i + 1;
  18.         temp = arr[max];
  19.         arr[max] = arr[min];
  20.         arr[min] = temp;
  21.         // 每次交换不要输出序列
  22.     }
  23.     // 交换第一个数和最小值
  24.     temp = arr[0];
  25.     arr[0] = arr[min];
  26.     arr[min] = temp;
  27.     // 循环中让i<n-1,防止数组越界
  28.     for (int i = 0; i < n - 1; i++)
  29.     {
  30.         max = arr[i] >= arr[i + 1] ? i : i + 1;
  31.         min = arr[i] <= arr[i + 1] ? i : i + 1;
  32.         temp = arr[max];
  33.         arr[max] = arr[min];
  34.         arr[min] = temp;
  35.         // 每次交换不要输出序列
  36.     }
  37.     // 交换最后一个数和最大值
  38.     temp = arr[n - 1];
  39.     arr[n - 1] = arr[max];
  40.     arr[max] = temp;
  41.     // 输出交换后的序列
  42.     for (int i = 0; i < n; i++)
  43.     {
  44.         cout << arr[i] << " ";
  45.     }
  46.     return 0;
  47. }
复制代码

希望这个解释对你有所帮助!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 03:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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