Результаты для суммы строк верны, но сумма для столбцов дает неправильные результаты для массива размером 3 x 4

#c

#c

Вопрос:

Я пытаюсь создать программу, в которой сумма строк и столбцов подсчитывается индивидуально, строки получаются хорошими, но столбцы дают странные результаты. Предполагается, что правильный результат будет выглядеть следующим образом (пример матрицы):

 9 1 2 4
2 2 8 0
3 3 3 3
Sum of row 0 is 16
Sum of row 1 is 12
Sum of row 2 is 12
Sum of column 0 is 14
Sum of column 1 is 6
Sum of column 2 is 13
Sum of column 3 is 7
 

Но у меня получается

 Sum of row 0 is 16
Sum of row 1 is 12
Sum of row 2 is 12
Sum of column 0 is 565359518
Sum of column 1 is 32772
Sum of column 2 is 13
Sum of column 3 is 7
 
 #include <iostream>

using namespace std;

int main()
{

    int value[3][4];
    int sum = 0;
    int row, col;
    int i, j;

    for (int i = 0; i < 3; i  ) {
        for (int j = 0; j < 4; j  ) {
            cout << "Enter a value : " << endl;
            cin >> value[i][j];
        }
    }
    cout << "Value of the array: " << endl;
    for (int i = 0; i < 3; i  ) {
        for (int j = 0; j < 4; j  ) {
            cout << value[i][j] << " ";
        }

        cout << endl;
    }

    void row_sum(int value[i][j]);
    {
        int i, j, sum = 0;

        for (i = 0; i < 3; i  ) {
            for (j = 0; j < 4; j  ) {

                sum = sum   value[i][j];
            }

            cout
                << "Sum of the row "
                << i << " is " << sum
                << endl;

            sum = 0;
        }
        void col_sum(int value[i][j]);
        {
            int i, j, sum = 0;

            for (i = 0; i < 4; i  ) {
                for (j = 0; j < 4; j  ) {

                    sum = sum   value[j][i];
                }

                cout
                    << "Sum of the column "
                    << i << " is " << sum
                    << endl;

                sum = 0;
            }
        }

        return 0;
    }
}
 

(Первоначально это было i = 3, но я изменил его на 4, потому что я думал, что это было неправильно с кодом, но столбец по-прежнему дает странные результаты.)

Комментарии:

1. col sum отсчитывается i (или j ) до 4. Это выходит за рамки дозволенного. Один из них должен быть равен 3 только в зависимости от порядка, который вы считываете из матрицы.

2. Кроме того, как написано, у вас есть встроенные функции в функциях? Это не ПАСКАЛЬ, где это законно. Параметр, который вы передаете в свои суммы для значения, должен быть объявлен с постоянными размерами для вашего массива 2 dim. Честно говоря, я не вижу компиляции приведенного выше кода.

3. о, точки с запятой в конце имен функций. Вау. Это будет компилироваться, но на самом деле не имеет функций. Вау, никогда раньше этого не видел. Я предполагаю, что тогда имена этих функций становятся прямыми объявлениями…

4. @MichaelDorgan Я использовал этот пример: geeksforgeeks.org /…

5. @Blazer234 Да, но то, что вы, похоже, упустили из этого примера, так это то, что эти функции определяются вне main , а затем вызываются (с аргументами) из него.

Ответ №1:

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

 #include <iostream>

using namespace std;

// Use Constants to declare the size of your array to make it easier to iterate in loops.
// Also allows the compiler to know at compile-time the array sizes of functions.
const int ColSize = 4;
const int RowSize = 3;


// Forward declare functions here so that main() knows what they are.
void col_sum(int value[RowSize][ColSize]);
void row_sum(int value[RowSize][ColSize]);

int main()
{
    // Replace those nasty magic number 3 and 4s here with constants
    int value[RowSize][ColSize];
    // Notice I have removed all the unused vars here (i,j,sum, etc.)

    // Replace magic numbers
    for (int i = 0; i < RowSize; i  ) {
        for (int j = 0; j < ColSize; j  ) {
            cout << "Enter a value : " << endl;
            cin >> value[i][j];
        }
    }

    cout << "Value of the array: " << endl;

    // Replace magic numbers
    for (int i = 0; i < RowSize; i  ) {
        for (int j = 0; j < ColSize; j  ) {
            cout << value[i][j] << " ";
        }

        cout << endl;
    }

    // Actually call the functions...
    row_sum(value);
    col_sum(value);

    return 0;
}

// Make actual functions to be called using our constants.
void row_sum(int value[RowSize][ColSize])
{
    // Notice I have removed all the repeated vars here (i,j,sum, etc.)
    // They are all declared within the for loops

    // Replace magic numbers
    for (int i = 0; i < RowSize; i  ) {

        int sum = 0;  // Moved the sum 0 here as we only need it once.
        for (int j = 0; j < ColSize; j  ) {
            sum  = value[i][j];
        }

        cout
            << "Sum of the row "
            << i << " is " << sum
            << endl;

    }
}

void col_sum(int value[RowSize][ColSize])
{
    // Notice I have removed all the repeated vars here (i,j,sum, etc.)
    // They are all declared within the for loops

    // Replace magic numbers
    for (int i = 0; i < ColSize; i  ) {
        int sum = 0;  // Moved the sum 0 here as we only need it once.
    
        for (int j = 0; j < RowSize; j  ) {
            sum = sum   value[j][i];
        }

        cout
            << "Sum of the column "
            << i << " is " << sum
            << endl;
    }
}
 

Обратите внимание, как константы значительно упрощают изменение размера циклов for, управление памятью и упрощают чтение кода. Также посмотрите, как объявляются и используются функции.