簡體   English   中英

正確的代碼以打印互換的最大值和最小值

[英]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; 我應該能夠達到切換最大和最小位數的目的,但是我也想打印出結果,使得中間的兩個數字僅第一個和最后一個不變。

舊的是這樣的: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. 找到數組的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

試試這個代碼

 # 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 ++程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM