Не считает произведение матриц через указатель - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Суть в том, что нужно умножить две матрицы, записанные из файла, сначала обычным способом, а потом через указатели, но при умножении через указатели программа ломается, но при это никаких ошибок не выдает, что здесь не так? ниже прикреплены два файла с матрицами
#include "stdafx.h"
#include <stdio.h>
#include "conio.h"
 
#define N 3
#define C c[i][j]
#define A printf("can't open the file\n");
#define D "%d "
 
FILE *f,*p;
int m, i, j, T, a[N][N], b[N][N], c[N][N],r;
int *ptr, *ptr1, *res;
int menu();
void read();
void matrix();
void print();
 
void readp();
void matrixp();
void printp();
 
int main()
{
    switch (menu()) {
    case 1:
        read();
        matrix();
        print();
        fclose(p);
        fclose(f);
        break;
 
    case 2:
        readp();
        matrixp();
        printp();
        fclose(p);
        fclose(f);
        break;
    }

    return 0;
}
int menu() {
    printf("Chose the format of the matrix\n1-for integer numbers\n2-for float numbers\n3-with using of pointer\n\n");
    scanf_s("%d", &m);
    return m;
}
void read() {
    if (!(f = _fsopen("f.txt", "r", _SH_DENYNO))) {
        A
            return ;
    }
    if (!(p = _fsopen("p.txt", "r", _SH_DENYNO))) {
        A
            return ;
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j<N; j++)
            fscanf_s(f, "%d", &a[i][j]);
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j<N; j++)
            fscanf_s(p, "%d", &b[i][j]);
    }
    return;
}
void matrix() {
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            C = 0;
            for (T = 0; T < N; T++) {
                C += a[i][T] * b[T][j];
 
            }
        }
    }
    return;
}
void print() {
    printf("If you want to print the result and initial matrix?\n1-Yes\n2-No\n\n");
    scanf_s("%d", &r);
    if (r == 1)
#define R 1
#ifdef R 
    {
        printf("THE FIRST MATRIX:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf(D, a[i][j]);
        printf("\n");
    }
    printf("\nTHE SECOND MATRIX:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf(D , b[i][j]);
        printf("\n");
    }
    printf("\nRESULT:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf(D , C);
        printf("\n");
    }
    }
#endif
 
}
 
void readp() {
    if (!(f = _fsopen("f.txt", "r+", _SH_DENYNO))) {
        A
            return;
    }
    if (!(p = _fsopen("p.txt", "r", _SH_DENYNO))) {
        A
            return;
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j<N; j++)
            fscanf_s(f, D, ptr+i*N+j);
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j<N; j++)
            fscanf_s(p, D, ptr1 + i * N + j);
    }
    return;
}
void matrixp() {
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            *(res + i * N + j) = 0;
            for (T = 0; T < N; T++) {
                *(res+i*N+j)=*(ptr+N*i+T)* *(ptr1+T*N+j);
 
            }
        }
    }
    return;
}
void printp() {
    printf("If you want to print the result and initial matrix?\n1-Yes\n2-No\n\n");
    scanf_s("%d", &r);
    if (r == 1)
#define R 1
#ifdef R 
    {
        printf("THE FIRST MATRIX:\n");
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++)
                printf(D, *(ptr + i * N + j));
            printf("\n");
        }
        printf("\nTHE SECOND MATRIX:\n");
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++)
                printf(D, *(ptr1 + i * N + j));
            printf("\n");
        }
        printf("\nRESULT:\n");
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++)
                printf(D, *(res + i * N + j));
            printf("\n");
        }
    }
#endif
    return;
}

Решение задачи: «Не считает произведение матриц через указатель»

textual
Листинг программы
//*(res+i*N+j)=*(ptr+N*i+T)* *(ptr1+T*N+j);
*(res+i*N+j)+=*(ptr+N*i+T)* *(ptr1+T*N+j);

Объяснение кода листинга программы

  1. В этом коде происходит сложение двух произведений матриц, результат сохраняется в третьей матрице.
  2. Первая матрица, которую мы обозначаем как res, представляет собой результат первой операции умножения матриц.
  3. Вторая матрица ptr - это матрица, элементы которой умножаются на элементы первой матрицы res.
  4. Третья матрица ptr1 - это матрица, элементы которой умножаются на элементы второй матрицы ptr.
  5. i и j - это индексы, которые используются для доступа к элементам матриц.
  6. N - это размерность матрицы.
  7. T - это количество строк во второй матрице ptr, которые умножаются на элементы первой матрицы res.
  8. (res+i*N+j) - это ссылка на элемент третьей матрицы res, который находится в строке i и столбце j.
  9. (ptr+N*i+T) - это ссылка на элемент второй матрицы ptr, который находится в строке i и столбце T.
  10. (ptr1+T*N+j) - это ссылка на элемент третьей матрицы ptr1, который находится в строке T и столбце j.
  11. *(res+i*N+j) - это значение элемента третьей матрицы res, который находится в строке i и столбце j.
  12. *(ptr+N*i+T) - это значение элемента второй матрицы ptr, который находится в строке i и столбце T.
  13. *(ptr1+T*N+j) - это значение элемента третьей матрицы ptr1, который находится в строке T и столбце j.
  14. *(res+i*N+j)+=*(ptr+N*i+T)* *(ptr1+T*N+j); - это операция сложения, которая происходит в третьей матрице res.
  15. *(res+i*N+j) - это значение элемента третьей матрицы res, который находится в строке i и столбце j после операции сложения.
  16. *(ptr+N*i+T) - это значение элемента второй матрицы ptr, который находится в строке i и столбце T после операции умножения.
  17. *(ptr1+T*N+j) - это значение элемента третьей матрицы ptr1, который находится в строке T и столбце j после операции умножения.
  18. res, ptr и ptr1 - это матрицы, которые используются в операции сложения.
  19. i и j - это индексы, которые используются для доступа к элементам матриц.
  20. N и T - это размерности матриц, которые используются в операции сложения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы