【问题标题】:Find the sum of an entire matrix using functions (C++)使用函数求整个矩阵的总和 (C++)
【发布时间】:2021-06-27 05:43:14
【问题描述】:

我正在编写一些代码来编写一个 10x10 大小的矩阵并使用函数打印它。我需要的是一个对整个矩阵数组求和的函数。我所做的是我试图分别总结每一行和每一列并将总数加在一起。我的问题是我相信它只打印出行或列的总和。

这是我的代码:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>

using namespace std;

const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;

void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
void sum(int matrix[][COLUMN_SIZE], int, int);

int main() {

    int matrix [ROW_SIZE][COLUMN_SIZE];

    initialize(matrix, ROW_SIZE, COLUMN_SIZE);

    display(matrix, ROW_SIZE,COLUMN_SIZE);

    sum(matrix, ROW_SIZE,COLUMN_SIZE);


    return 0;
}



void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for (int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            matrix[i][j] =  1 + rand() % 99;
        }
    }
}


void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for(int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            cout<< setw(4)<<matrix[i][j]<< " ";
        }
         cout<< endl;
    }
}


void sum(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    int sum_row;
    int sum_col;

    for(int i = 0; i < ROW_SIZE; i++){
        int sum_row = 0;
        for(int j = 0; j < COLUMN_SIZE; j++){
            sum_row = sum_row + matrix[i][j];
        }
    }

    for(int i = 0; i < ROW_SIZE; i++){
        int sum_col = 0;
        for(int j = 0; j < COLUMN_SIZE; j++){
            sum_col = sum_col + matrix[i][j];
        }
    }

    int sum = sum_row + sum_col;

    cout<<"The sum of the matrix is "<<sum<< endl;
}

【问题讨论】:

  • 你的 sum 函数应该有一个类似于 display 函数的 for 并且只是每个元素的总和。或者,您可以使用std::accumulate() 标准算法为您执行此操作。

标签: c++ arrays function loops matrix


【解决方案1】:

你所做的是最后一行+最后一列的总和。这应该足够了:

void sum(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    int sum = 0;

    for(int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            sum += matrix[i][j];
        }
    }
    
    cout<<"The sum of the matrix is "<<sum<< endl;
}

【讨论】:

    【解决方案2】:

    代码中的一些早期问题

    void sum(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
        int sum_row; // uninitialized make it equal to 0
        int sum_col; // uninitialized make it equal to 0
    
        for(int i = 0; i < ROW_SIZE; i++){
            int sum_row = 0; // This is local to block and masks the sum_row above
            for(int j = 0; j < COLUMN_SIZE; j++){
                sum_row = sum_row + matrix[i][j];
            }
        }
    
        for(int i = 0; i < ROW_SIZE; i++){
            int sum_col = 0;
            for(int j = 0; j < COLUMN_SIZE; j++){
                sum_col = sum_col + matrix[i][j]; //Iterating over rows again matrix[j][i] may be
            }
        }
    
        int sum = sum_row + sum_col;
    
        cout<<"The sum of the matrix is "<<sum<< endl;
    }
    

    void sum(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
        int sum_row = 0;
        int sum_col = 0;
    
        for(int i = 0; i < ROW_SIZE; i++)
            for(int j = 0; j < COLUMN_SIZE; j++)
                sum_row += matrix[i][j];
        
        
        for(int i = 0; i < ROW_SIZE; i++)
            for(int j = 0; j < COLUMN_SIZE; j++)
                sum_col += matrix[j][i];
        
        int sum = sum_row + sum_col;
        cout<<"The sum of the matrix is "<<sum<< endl;
    }
    

    当然,问题和逻辑似乎并没有共存,如果sum of entire matrix 表示所有元素的总和,这听起来就像这里的一个可以实现的那样

    void sum(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
        int sum = 0;
        for(int i = 0; i < ROW_SIZE; i++){
            for(int j = 0; j < COLUMN_SIZE; j++){
                sum += matrix[i][j];
            }
        }
        cout<<"The sum of the matrix is "<<sum<< endl;
    }
    

    【讨论】:

      【解决方案3】:

      你在命名方面做错了。您有称为ROW_SIZECOLUMN_SIZE 的常量,然后您有与sum() 等函数同名的参数。这对于阅读您的代码的东西来说是令人困惑的。将您的参数称为其他名称,例如 rowscolumns

      这里是使用std::accumulate() 的建议解决方案的替代方案。

      const int ROW_SIZE = 3;
      const int COLUMN_SIZE = 3;
      
      void sum(int matrix[][COLUMN_SIZE], int const rows, int const cols)
      {
          int sum = std::accumulate(&matrix[0][0], &matrix[rows-1][cols], 0);    
          std::cout<<"The sum of the matrix is "<<sum<< std::endl;
      }
      
      int main()
      {
        int m[ROW_SIZE][COLUMN_SIZE] {{1,2,3}, {4,5,6}, {7,8,9}};
        sum(m, ROW_SIZE, COLUMN_SIZE);
      }
      

      std::accumulate() 采用界定范围的迭代器。这些是第一个元素的迭代器和范围内最后一个元素的迭代器。在这种情况下,它们是&amp;matrix[0][0]&amp;matrix[row-1][col](因为&amp;matrix[row-1][col-1] 是矩阵的最后一个元素)。还有其他表达方式,例如:

      auto begin = std::begin(matrix[0]);
      int sum = std::accumulate(begin, begin + rows * cols, 0); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多