正确的代码打印互换的最大值和最小值

Correct Code to Print the interchanged max and min values

我遇到了一个问题,要在给定的一组数字中交换最大数字和最小数字的位置,并打印出旧排列和新排列

老的是这样的:5,5678,62,6000

而新的预计是这样的:6000,5678,62,5

我已经尝试 运行 打印代码的不同变体来打印它,但都无济于事,因为我已经能够互换数字的最大和最小位置

int main () {
    int m [4] = {5,5678,62,6000};
    int i;
    int max=m[0];
    int min=m[0];
    int pMin = 0;
    int pMax = 0;
    int temp = 0;
    {
        printf( "%d\n", m[i]) ;
    }
for (i=0; i<4; i++){
    {
        printf( "%d\n", m[i]) ;
    }
    if ( m[i] > max )
    {
        max = m[i] ;
    }
}
for (i=0; i<4; ++i){
    if ( m[i] < min )
    {
        min = m[i] ;
    }
}
    temp = min;
    min = max;
    max = temp;

    printf ("min = %d\n", min);
    printf ("max = %d\n", max);
    printf( "%d\n", m[i]) ;
    getch();

}

如果我只输入这行代码就能正确完成 temp = min; min = max; max = temp; 我应该可以达到交换最大和最小数字位置的目的,但我也想打印出结果,使得中间的2个数字保持不变,只是第一个和最后一个。

老的是这样的:5,5678,62,6000

而新的预计是这样的:6000,5678,62,5

你应该从你的编译器那里得到一个警告(如果没有,启用警告标志,比如 GCC 中的 -Wall),关于这个打印语句,在它自己的块中:

{
    printf( "%d\n", m[i]) ;
}

我想你的意思是在数组上循环并打印它的内容,然后你再做。但是当你试图找到 max 时,你似乎忘记了遍历数组。


您的代码在此处调用 未定义行为 (UB):

printf("%d\n", m[i]) ;

因为你超出了范围,因为 i 在前一个 for 循环(找到 min)之后有最后一个值,它是 4(数组的大小)。所以你索引数组超出了它的末尾,即 m[4],这解释了输出的垃圾值。


这是您接近的计划,但让我们在这里列出它:

  1. 找到数组的最大元素,并记住它的索引 元素.
  2. 找到数组的最小元素,并记住它的索引 元素.
  3. 交换数组的最小和最大元素。

注意:如果有多个最大元素,请考虑最后看到的一个。对于最小元素也是如此。

将所有内容放在一起,您会得到:

#include <cstdio>

int main () {
    int m [4] = {5,5678,62,6000};
    int i;
    int max=m[0], max_idx;
    int min=m[0], min_idx;
    int temp = 0;
    for(int i = 0; i < 4; ++i)
    {
        printf( "%d\n", m[i]) ;
    }
    for (i=0; i<4; i++)
    {
        if ( m[i] > max )
        {
            max = m[i];
            max_idx = i;
        }
    }

    for (i=0; i<4; ++i)
    {
        if ( m[i] < min )
        {
            min = m[i];
            min_idx = i;
        }
    }
    temp = min;
    m[min_idx] = max;
    m[max_idx] = temp;

    printf ("min = %d\n", min);
    printf ("max = %d\n", max);
    printf("The new array is:\n");
    for(int i = 0; i < 4; i++)
      printf("%d\n", m[i]);

}

输出:

5
5678
62
6000
min = 5
max = 6000
The new array is:
6000
5678
62
5

试试这个代码

 # include<stdio.h>

    int main () {
        int m [4] = {5,5678,62,6000};
        int i;
        int max=m[0];
        int min=m[0];
        int pMin = 0;
        int pMax = 0;
        int temp = 0;
    // print before swap
    for (i=0; i<4; i++){
        {
            printf( "%d\n", m[i]) ;
        }

        if ( m[i] > max )
        {
            max = m[i] ;
            pMin = i;

        }
    }
    for (i=0; i<4; ++i){
        if ( m[i] < min )
        {
            min = m[i] ;
            pMax = i;
        }
    }

        m[pMax] = max;
        m[pMin] = min;
     // print after swap
        for (i=0; i<4; i++)
        {
            printf( "%d\n", m[i]) ;
        }

        return 0;
        }

如果确实是 C++ 程序,则使用 C++ 功能。

程序可以如下所示。

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    int m[] = { 5, 5678, 62, 6000 };

    for ( const auto &item : m ) std::cout << item << ' ';
    std::cout << '\n';

    auto minmax = std::minmax_element( std::begin( m ), std::end( m ) );

    if ( minmax.first != minmax.second ) std::iter_swap( minmax.first, minmax.second );

    for ( const auto &item : m ) std::cout << item << ' ';
    std::cout << '\n';
}

它的输出是

5 5678 62 6000 
6000 5678 62 5 

至于你的代码,那么它至少在这个代码片段中没有意义

int main () {
    int m [4] = {5,5678,62,6000};
    int i;
    // ...
    int temp = 0;
    {
        printf( "%d\n", m[i]) ;
    }
    // ...

不是说变量i没有初始化。

并且您的代码不会交换数组中的最大元素和最小元素。

如果是C程序那么可以这样看。

#include <stdio.h>

int main( void )
{
    int m[] = { 5, 5678, 62, 6000 };
    const size_t N = sizeof( m ) / sizeof( *m );

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
    putchar( '\n' );

    size_t min_i = 0;
    size_t max_i = 0;

    for ( size_t i = 1; i < N; i++ )
    {
        if ( m[i] < m[min_i] ) min_i = i;
        if ( m[max_i] < m[i] ) max_i = i;
    }

    if ( min_i != max_i ) 
    {
        int tmp  = m[min_i];
        m[min_i] = m[max_i];
        m[max_i] = tmp;
    }

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", m[i] );
    putchar( '\n' );
}

程序输出同上图

5 5678 62 6000 
6000 5678 62 5 

您可以使用程序中使用的循环将此 C 程序重写为 C++ 程序。