Матрица как функция ввода - PullRequest
0 голосов
/ 21 апреля 2020

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

#include <stdio.h>
#include <stdlib.h>

int sum_rows[1000], sum_columns[1000], mean_row[1000], mean_column[1000], N, A[100][100], i, j;

void values(int A[N][N]) {
    for (i=0; i<N; ++i) {
        for (j=0; j<N; ++j) {
            A[i][j] = (rand()%61+20);
        }
    }
}

void mean_r (int A[N][N]) {
    for (i=0; i<N; ++i) {
        sum_row[i] = 0;
        for (j=0; j<N; ++j) {
            sum_row[i] += A[i][j];
        }
        mean_row[i] = sum_row[i]/N;
    }
}

void mean_c (int A[N][N]) {
    for (j=0; j<N; ++j) {
        sum_column[j] = 0;
        for (i=0; i<N; ++i) {
            sum_column[j] += A[i][j];
        }
        mean_column[j] = sum_column[j]/N;
    }
}

int main()
{
    int N;

    printf("Enter size of matrix: ");
    scanf("%d", &N);

    int A[N][N];

    values(A[N][N]);
    mean_r(A[N][N]);
    mean_c(A[N][N]);

    for (i=0; i<N; ++i) {
        for (j=0; j<N; ++j) {
            printf("A[%d][%d] = %d\n", i, j, A[i][j]);
        }
    }

    for (i=0; i<N; ++i) {
        printf("Mean row #%d = %.2f\n", i, mean_row[i]);
    }

    for (j=0; j<N; ++j) {
        printf("Promedio Columna #%d = %.2f\n", j, mean_column[j]);
    }

    return 0;
}

Можете ли вы объяснить мне, как передать матрицу в функцию? Я должен выполнить эти операции с заранее определенной функцией и просто вызвать ее внутри основной функции.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Кажется, что ваша матрица является динамической c (количество строк и столбцов не фиксировано). На языке C вы не можете объявлять массив массива с динамическими c строками и столбцами, потому что компилятор не знает, как выделить для вас объем памяти. Вы должны будете выделить память во время выполнения. В моем примере матрица хранится в памяти как первая строка, вторая строка и так далее. В математике доступ к элементу матрицы осуществляется по индексу строки и индексу столбца. «Индекс строки и индекс столбца» переводится в адрес памяти элемента с использованием начального адреса выделенной памяти + номер строки * номер столбца + индекс столбца на основе того, как матрица хранится в моем примере. Примечание: номер строки и номер столбца начинаются с нуля. Первый элемент обозначен p, где p + 0 * columncount + 0) равно p. Следующий элемент обозначается как p + 0 * columncount + 1. После этого элемент второй строки и второго столбца (2,2) обозначается как p + 1 * количество столбцов + 1. В следующем примере используется один указатель для представления матрицы Dynami c (Другой метод существует, например, массив указателей)

В моем примере создается матрица 3 (три строки) на 4 (четыре столбца) и инициализирован. Функция ProcessMatrix отображает сумму каждой строки.

Если возможно, я рекомендую вам использовать C ++, который позволяет выделять память с размером, заданным значением одного целого числа, что упрощает работу. Если у вас есть доступ к другим математическим библиотекам (многие доступны), вы должны использовать их, а не пытаться изобретать колесо.

// c_matrix.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <stdio.h>


int GetElementValue(int* m, int rowIndex, int colIndex, int columnCount)
{
    return *(m + (rowIndex * columnCount + colIndex));
}

void ProcessMatric(int* myMatrix, int rowcount, int colcount)
{
    // calculate the sum of each row
    int sum = 0;
    for (int i = 0; i < rowcount; i++)
    {
        sum = 0;
        for (int j = 0; j < colcount; j++)
        {

            sum = sum + GetElementValue(myMatrix, i, j, colcount);
        }

        printf("Sum of row %d=%d\r\n", i+1, sum);
    }

}

int main()
{

    int row = 3;
    int col = 4;
    int* matrix;


    //create the memory for the matrix 3 by 4.
    matrix = malloc(sizeof(int) * row * col);

    // in momery the matrix is stored as (row1,col1), (row1, col2), (row1,col3)...(row4,col1),(row4,col2),(row4, col3)
    // initialize the matrix as 0,1,2,3...11
    for (int i = 0; i < row * col; ++i)
    {
        *(matrix + i) = i;
    }


    ProcessMatric(matrix, row, col);


    free(matrix);

    return 0;
}
0 голосов
/ 21 апреля 2020

В вашей основной функции вы объявляете матрицу NxN A

 int A[N][N];

Как указал Ян, вы не можете объявить массив таким способом, потому что компилятор не знает значение N. Значение N не будет определено до тех пор, пока программа не будет скомпилирована и выполняется (т.е. во время выполнения). Кроме того, кажется, что вы хотите передать массив 2d. То, что вам нужно передать, это A само по себе (например, values(A);, однако вы передаете

values(A[N][N]);
mean_r(A[N][N]);
mean_c(A[N][N]);

. То, что вы сделали, это проиндексировали оба измерения, поэтому, как правило, происходит то, что вы просто передаете int (независимо от того, что находится в N-й строке и N-м столбце). Однако индексы находятся в диапазоне [0, N-1], поэтому A [N] выходит за пределы допустимого диапазона. Их ключевая концепция заключается в том, что массивы (и другие данные структуры) передаются по ссылке. Когда вы объявляете A, непрерывное пространство будет выделено для хранения N * N * sizeof(int), а виртуальный адрес для начального расположения этого пространства сохраняется в A. В результате ваши функции знают, какие адреса памяти хранить вещи, чтобы вы могли получить к нему доступ с помощью A [i] [j] без необходимости передавать гигантский кусок памяти.

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