Правильный код для печати макс. И мин. Значений - PullRequest
1 голос
/ 06 июня 2019

Мне была дана задача поменять местами максимальные и минимальные числа в данном наборе чисел и распечатать старое и новое расположение

Старое выглядит так: 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 567 8 6 000 6 000

и новый, как ожидается, будет таким: 6000,5678,62,5

Ответы [ 3 ]

0 голосов
/ 06 июня 2019

попробуйте этот код

 # 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;
        }
0 голосов
/ 06 июня 2019

Если это действительно программа на 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 ++, используя циклы, используемые в программе.

0 голосов
/ 06 июня 2019

Вы должны получить предупреждение от вашего компилятора (если нет, включите флаги предупреждения, такие как -Wall в GCC), об этом операторе печати внутри его собственного блока:

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

Я думаю, что вы хотели зациклить над массивом и распечатать его содержимое, что вы и сделаете потом. Но когда вы пытаетесь найти max, вы, кажется, забыли перебрать массив.


Ваш код вызывает Неопределенное поведение (UB) здесь:

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

, поскольку вы выходите за пределы диапазона, потому что i имеет последнее значение после предыдущего цикла for (чтобы найти min), которое было 4 (размер массива). Таким образом, вы индексируете массив за его концом, а именно m[4], который объясняет значение мусора для вывода.


Вот план, к которому вы приближались, но давайте перечислим его здесь:

  1. Найдите элемент max массива и запомните индекс этого элемент.
  2. Найдите элемент min массива и запомните индекс этого элемент.
  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
...