Не считает произведение матриц через указатель - 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);
Объяснение кода листинга программы
- В этом коде происходит сложение двух произведений матриц, результат сохраняется в третьей матрице.
- Первая матрица, которую мы обозначаем как
res
, представляет собой результат первой операции умножения матриц. - Вторая матрица
ptr
- это матрица, элементы которой умножаются на элементы первой матрицыres
. - Третья матрица
ptr1
- это матрица, элементы которой умножаются на элементы второй матрицыptr
. i
иj
- это индексы, которые используются для доступа к элементам матриц.N
- это размерность матрицы.T
- это количество строк во второй матрицеptr
, которые умножаются на элементы первой матрицыres
.(res+i*N+j)
- это ссылка на элемент третьей матрицыres
, который находится в строкеi
и столбцеj
.(ptr+N*i+T)
- это ссылка на элемент второй матрицыptr
, который находится в строкеi
и столбцеT
.(ptr1+T*N+j)
- это ссылка на элемент третьей матрицыptr1
, который находится в строкеT
и столбцеj
.*(res+i*N+j)
- это значение элемента третьей матрицыres
, который находится в строкеi
и столбцеj
.*(ptr+N*i+T)
- это значение элемента второй матрицыptr
, который находится в строкеi
и столбцеT
.*(ptr1+T*N+j)
- это значение элемента третьей матрицыptr1
, который находится в строкеT
и столбцеj
.*(res+i*N+j)+=*(ptr+N*i+T)* *(ptr1+T*N+j);
- это операция сложения, которая происходит в третьей матрицеres
.*(res+i*N+j)
- это значение элемента третьей матрицыres
, который находится в строкеi
и столбцеj
после операции сложения.*(ptr+N*i+T)
- это значение элемента второй матрицыptr
, который находится в строкеi
и столбцеT
после операции умножения.*(ptr1+T*N+j)
- это значение элемента третьей матрицыptr1
, который находится в строкеT
и столбцеj
после операции умножения.res
,ptr
иptr1
- это матрицы, которые используются в операции сложения.i
иj
- это индексы, которые используются для доступа к элементам матриц.N
иT
- это размерности матриц, которые используются в операции сложения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д