C программа для расчета определителей матриц с параметрами командной строки - PullRequest
0 голосов
/ 15 декабря 2018

Итак, у меня есть задача, подобная этой: «Напишите программу, которая будет вычислять определители матриц. Размер матрицы должен быть введен в качестве параметра командной строки программы. Пользователь должен набрать матричные элементы с клавиатуры после того, как программаВыполнено. Определители должны быть рассчитаны для разных размеров квадратной матрицы (<= 3), а не для одного фиксированного. Разделите вашу программу на несколько функций. Используйте указатели. Размер используемых вами массивов определяется пользователем во времявыполнение программы, поэтому нет необходимости использовать динамическое выделение памяти. "</p>

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

Это то, что у меня есть до сих пор (это неправильно компилируется):

void inputMatrix(int size);
void printMatrix(int *matrix, int size);

int main(int argc, char *argv[])
{

    int size = atoi(argv[1]);
    int *matrix;
    inputMatrix(size);
    printMatrix(*matrix, size);



return 0;
}

void inputMatrix(int size)
{
    int i, j;
    int *matrix;

    for(i=0; i<size; i++)
    {
        for(j=0; j<size; j++)
        {
            scanf("%d", (*(matrix + i) + j));
        }
    }
}

void printMatrix(int *matrix, int size)
{
    int i, j;
    int *matrix;

    for(i=0; i<size; i++)
    {
        for(j=0; j<size; j++)
        {
            printf("%d ", *(*(matrix +i) + j));
        }
        printf("\n");
    }
}

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Ответ Joni решает основную проблему, но есть и другие вещи, которые необходимо исправить в коде OP.

Для начала нам нужно решить, использовать ли массив массивов (например, int mat[3][3];) или простой массив (например, int mat[9];), в то время как в коде OP есть некоторая путаница:

int main(int argc, char *argv[])
{
    // ...
    int *matrix;        // <-- This pointer is uninitialized, its value is indeterminated
    // ...
    printMatrix(*matrix, size);
    //          ^ dereferencing it, you are passing an 'int'
}
// ...
void printMatrix(int *matrix, int size)
{   //               ^ a pointer to an int is expected
    int i, j;
    int *matrix;  // <-- This is a local variable that will shadow the parameter
                  //     with the same name and it is also uninitialized.

    for(i=0; i<size; i++)
    {
        for(j=0; j<size; j++)
        {
            printf("%d ", *(*(matrix +i) + j));
            //            ^^^^  this is equivalent to 'matrix[i][j]',
            //                  but 'matrix' is only a pointer to 'int'
        }
        printf("\n");
    }
}

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

// ...
#define MAX_SIZE 3

int main(int argc, char *argv[])
{
    int matrix[MAX_SIZE][MAX_SIZE];
    // read 'size' from command line arguments, then
    inputMatrix(size, matrix);   // <-- Note that I'm passing 'matrix' here too.
    printMatrix(size, matrix);
    // ...
}

// The functions must be modified accordingly, e.g.:
void printMatrix(int size, int matrix[][MAX_SIZE])
// The inner dimension must be specified ^^^^^^
{   
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            printf("%d ", *(*(matrix + i) + j)); // <-- "Use pointers." they said
        }
        printf("\n");
    }
}

Если вы хотите использовать вместо него простой массив, его можно записатькак это:

// ...
#define MAX_SIZE 9    // <-- the total size: 3*3

int main(int argc, char *argv[])
{
    int matrix[MAX_SIZE];
    // ...
    printMatrix(size, matrix);
    // ...
}

void printMatrix(int size, int matrix[])
{   
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            printf("%d ", *(matrix + (i * size + j));
            // Note the math      ^^^^^^^^^^^^^^^^^ 
            // In this simple case of row wise traversal, it could be as simple as
            //            *(matrix++) 
        }
        printf("\n");
    }
}
0 голосов
/ 20 мая 2019

Найти определитель квадратной матрицы порядка n (n конечно) довольно просто с динамическим распределением памяти.Но, что важно в этом случае, это освободить память в конце программы.

Вы можете посмотреть мой код здесь !

0 голосов
/ 15 декабря 2018

Поскольку вы не можете использовать динамическое выделение памяти, вам придется создать матрицу в главной функции и передать ее другим функциям в качестве параметра.При этом используется функция C, называемая массивами переменной длины:

int matrix[size*size];
inputMatrix(size, matrix);

Если массивы переменной длины также не разрешены, просто сделайте это matrix[9] - размер не более 3 в вашем назначении

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