Чтение 2D-массива из файла и передача его в другую функцию - PullRequest
1 голос
/ 02 июля 2019

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

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#define M 4
#define N 4

int main(){
    int i, j;
    float A[M][N];
    string line;
    ifstream matrix("matrix.txt");
    if (matrix.is_open())
    {
        do
        {
            for(i=0; i<M; i++) 
            {
                for(j=0; j<N; j++) 
                    matrix >> A[i][j];
            }
        }
        while (getline(matrix,line));
        matrix.close();
    }
    else cout << "Unable to open file";

    float sumline[M]={0};                       

    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
            sumline[i]+=A[i][j];            
    }

    float sumcolumn[N]={0};                     

    for(j=0;j<N;j++)
    {
        for(i=0;i<M;i++)
            sumcolumn[j]+=A[i][j];      
    }


    for (i=0; i<M; i++){                    
        for (j=0; j<N; j++){                
            if(sumline[i]<sumcolumn[j]){    
                cout << "Error, total sum of column "<<j<<" is greater than the sum of the line"<<i<<endl;
                return 0;                   
            }
        }
    }

    int mincol=sumcolumn[0];                

    for (i=0; i<N; i++){                    
        if(mincol>sumcolumn[i])
            mincol==sumcolumn[i];
    }
    float avgline = 0.0;
    for (i=0; i<M; i++){
        avgline=avgline+sumline[i];
    }
    avgline = avgline/M;

    if (avgline * 3 > mincol) {
        cout << "Conditions verified"<<endl;
        }
    else{
        cout << "Error, triple of the avg of line is less than the lowest sum of column"<<endl;
        return 0;       
        }

    return 0;
}

Код в основном выполняет математические операции с двумерным массивом. Я также хотел бы сохранить как можно более простую процедуру, так что даже если using namespace std; это не очень хорошая практика, или то, как я читаю массив из файла, действительно просто, мне нужно, чтобы он был таким. Большое спасибо.

1 Ответ

2 голосов
/ 02 июля 2019

Вместо использования c-array

float A[M][N];

Вместо этого вы можете использовать

using MyArrayType = std::array<std::array<float>, M>, N>;
MyArrayType A;

Теперь вы можете передать по ссылке (MyArrayType& или const MyArrayType&)

При этом: массив c может быть передан как с более сложным синтаксисом: (float (&a)[M][N]); - настоятельно рекомендуется использовать std::array вместо этого, где это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...