【问题标题】:Finding min and max elements of every column and row in a matrix C++查找矩阵 C++ 中每一列和每一行的最小和最大元素
【发布时间】:2020-02-16 20:06:02
【问题描述】:

我正在尝试执行以下操作: 有一个矩阵,将整个内容打印出来,在每行的末尾打印该行的最大元素,并在每列的底部打印该列的最小元素。 我几乎是 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

我真的不知道是什么原因造成的,因为没有错误消息,我真的很困惑。我也不知道如何制作最小列。任何帮助将不胜感激。

【问题讨论】:

  • 考虑添加一些标记程序关键部分的 cmets。一目了然,很难说出各种循环的目的,abc 是什么等等。
  • -858993460 是 0xCCCCCCCC,magic value 表示未初始化的堆栈内存,这意味着值 b[2] 从未初始化。你需要调试你的程序。

标签: c++ arrays for-loop max nested-loops


【解决方案1】:

这些循环的问题

    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 的值应该在外循环的每次迭代中初始化。否则第一行之后的所有行都处理前一行的最大值,一般情况下不能有大于 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2017-07-25
    • 2021-01-13
    • 2017-01-03
    • 2020-10-11
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多