Поиск минимальных и максимальных элементов каждого столбца и строки в матрице C ++ - PullRequest
0 голосов
/ 16 февраля 2020

Я пытался сделать следующее: иметь матрицу, распечатать всю вещь, напечатать в конце каждой строки самый большой элемент указанной строки и напечатать в нижней части каждого столбца наименьший элемент указанного столбца. Я в значительной степени новичок в C ++.

Итак, вот что я сделал до сих пор:

 #include <iostream>
    #include <iomanip>
    #define M 50
    #define N 50
    using namespace std;
    int main()
    {
        int m,n;        
        int a[M][N];
        int b[M],c[N];

        do {        
        cout<<"m=";
        cin>>m;
        cout<<endl<<"n=";
        cin>>n;
        cout<<endl;
        }
        while(m!=n);

        for(int i=0;i<m; i++) {
            for(int j=0; j<n; j++){
            cout<<"a["<<i<<"]["<<j<<"]=";
            cin>>a[i][j];
            }
        }
        int max_row;
        max_row=0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (a[i][j] > max_row) {
                    max_row = a[i][j];
                    b[i] = max_row;
                }
            }
        }

        for (int i=0; i<m; i++)
        { for(int j=0; j<n; j++){
            cout<<setw(3)<<a[i][j]<<"\t";
        }
        cout<<"|"<<b[i];
        cout<<endl;
        }
        for(int i=0; i<m; i++){
        cout<<setw(3)<<"-";}

        cout<<endl;

        for(int j=0; j<n; j++)
        {cout<<c[j]<<"\t";
        }

        system("pause");
    }

В большинстве случаев max_row являются правильными, такими как этот случай:

  3       2       1     |3
  4       6       5     |6
  7       8       9     |9

В других случаях они портятся, и это выглядит так:

  1       2       3     |3
  4      33       6     |33
  7       8       9     |-858993460

Я действительно понятия не имею, что вызывает это, и так как нет сообщений об ошибках, я действительно запутался. Также я не знаю, как сделать минимальные столбцы. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 февраля 2020

Проблема с этими циклами

    max_row=0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] > max_row) {
                max_row = a[i][j];
                b[i] = max_row;
            }
        }
    }

заключается в том, что значение max_row следует инициализировать при каждой итерации внешнего l oop. В противном случае все строки после первой строки имеют дело с максимальным значением предыдущей строки и, как правило, не могут иметь элемент en, который больше текущего значения max_row. Поэтому соответствующий элемент массива b не будет инициализирован.

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

Найти Максимальное количество элементов в строках и минимальное количество элементов в столбцах достаточно, чтобы иметь одну пару вложенных циклов /

Вот демонстрационная программа /

#include <iostream>
#include <iomanip>

int main() 
{
    const size_t N = 3;
    int a[N][N] =
    {
        { 1,  2, 3 },
        { 4, 33, 6 },
        { 7,  8, 9 }
    };

    int b[N], c[N];

    for ( size_t i = 0; i < N; i++ )
    {
        b[i] = a[i][0];
        c[i] = a[0][i];     
        for ( size_t j = 1; j < N; j++ )
        {
            if ( b[i] < a[i][j] ) b[i] = a[i][j];
            if ( a[j][i] < c[i] ) c[i] = a[j][i];
        }
    }

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            std::cout << std::setw( 3 ) << a[i][j] << '\t';
        }
        std::cout << '|' << b[i] << '\n';
    }

    for ( size_t i = 0; i < N; i++ )
    {
        std::cout << std::setw( 3 ) << '-' << '\t';
    }
    std::cout << '\n';

    for ( size_t i = 0; i < N; i++ )
    {
        std::cout << std::setw( 3 ) << c[i] << '\t';
    }
    std::cout << '\n';

    return 0;
}

Ее вывод

  1   2   3 |3
  4  33   6 |33
  7   8   9 |9
  -   -   - 
  1   2   3 
...