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

时间:2019-06-06 15:07:52

标签: c++ arrays swap

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

旧的是这样的: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; 我应该能够实现切换最大和最小数字位置的目的,但是我也想打印出结果,使得中间的两个数字仅第一个和最后一个不变。

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

,并且新的版本应如下所示:6000,5678,62,5

3 个答案:

答案 0 :(得分:0)

您应该从编译器获得警告(如果没有,请启用警告标志,例如GCC中的-Wall),在其自己的代码块中关于此打印语句:

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

我认为您打算对数组进行循环并打印其内容,然后进行此操作。但是,当您尝试查找max时,您似乎忘记了遍历数组。


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

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

因为您超出范围,因为i的值在前一个for循环(查找min)之后,为4(数组大小)。因此,您正在索引数组的末尾,即m[4],它解释了输出的垃圾值。


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

  1. 找到数组的max元素,并记住该数组的索引 元素。
  2. 找到数组的min元素,并记住该数组的索引 元素。
  3. 交换数组的min和max元素。

注意:如果最大元素数不止一个,请考虑最后一个元素。最小元素也是如此。

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

#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

答案 1 :(得分:0)

尝试此代码

 # 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;
        }

答案 2 :(得分: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 ++程序。