Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <math.h>
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- int Create_Matrix(int*** m, int h, int l)
- {
- int i;
- *m = (int**)malloc(h * sizeof(int*)); // Выделение памяти под массив указателей размера h
- for (i = 0; i < h; i++)
- {
- (*m)[i] = (int*)malloc(l * sizeof(int)); // Выделение памяти под массив int размера l
- }
- return 0;
- }
- int Input_Matrix(int** m, int h, int l)
- {
- // Вывод (для красоты)
- printf("\nEnter matrix %d x %d:\n", h, l);
- int i, j;
- for (j = 0; j < h; j++)
- {
- for (i = 0; i < l; i++)
- {
- scanf("%d", &m[j][i]);
- }
- }
- return 0;
- }
- // Размер первой матрицы: h1, l1
- // Размер второй матрицы: h2, l2
- // Размер результата: h1, l2
- // Ожидается, что l1 == h2, иначе матрицы невозможно перемножить
- int Multiply_Matrix(int** m1, int** m2, int** mr, int h1, int l1, int h2, int l2)
- {
- if (l1 != h2)
- {
- return -1; // Что-то вроде ошибки
- }
- int i, j, k;
- // Инициализация массива нулями
- for (j = 0; j < h1; j++) {
- for (i = 0; i < l2; i++) {
- mr[j][i] = 0;
- }
- }
- // j - строка, i - столбец в результирующей матрице
- // k - номер слагаемого ( R_ji = A_j0 * B_0i + A_j1 * B_1i + ... + A_jk * B_1k + ... + A_jn * B_1n)
- for (j = 0; j < h1; j++)
- {
- for (i = 0; i < l2; i++)
- {
- for (k = 0; k < l1; k++)
- {
- mr[j][i] += m1[j][k] * m2[k][i];
- }
- }
- }
- return 0;
- }
- int Output_Matrix(int** m, int h, int l)
- {
- // Вывод (для красоты)
- printf("\nResult matrix %d x %d:\n", h, l);
- int i, j;
- for (j = 0; j < h; j++)
- {
- for (i = 0; i < l; i++)
- {
- printf("%d ", m[j][i]);
- }
- printf("\n");
- }
- return 0;
- }
- // Интересует двумерный массив и количество строк
- int Delete_matrix(int** m, int h)
- {
- int i;
- // Сначала очищаем память, выделенную под строки
- for (i = 0; i < h; i++)
- {
- free(m[i]);
- }
- // Теперь очищаем память, выделенную под массив указателей
- free(m);
- }
- int main()
- {
- int** m1 = NULL;
- int** m2 = NULL;
- int** mr = NULL;
- // h - количество строк
- // l - количество столбцов
- int l1, h1, l2, h2;
- printf("Enter left matrix size (rows, columns): ");
- scanf("%d %d", &h1, &l1);
- printf("Enter right matrix size (rows, columns): ");
- scanf("%d %d", &h2, &l2);
- Create_Matrix(&m1, h1, l1);
- Create_Matrix(&m2, h2, l2);
- Create_Matrix(&mr, h1, l2); // Потому что при A*B (где размеры A и B равны m x n и n x h) размер результата: m x h
- Input_Matrix(m1, h1, l1);
- Input_Matrix(m2, h2, l2);
- Multiply_Matrix(m1, m2, mr, h1, l1, h2, l2);
- Output_Matrix(mr, h1, l2);
- Delete_matrix(m1, h1);
- Delete_matrix(m2, h2);
- Delete_matrix(mr, h1);
- _getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement