Получить матрицу по правилу - C (СИ) (76451)
Формулировка задачи:
Даны квадратные матрицы А и В порядка n. Получить матрицу А(В-Е)+С, где Е-единичная матрица порядка n. а элементы матрицы вычисляются по формуле Сij=1/(i+j) i,j=1,2...n
Решение задачи: «Получить матрицу по правилу»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> #include <time.h> #include <stdlib.h> struct matrix { float **m; int sz; }; // вывод void print_matrix(struct matrix* k) { int i,j; for(i=0;i<k->sz;i++) { for(j=0;j<k->sz;j++) printf("%f ", k->m[i][j]); printf("\n"); } printf("\n"); } // res = a1-a2 void sub_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res) { int i,j, s; s = a1->sz; for(i=0;i<s;i++) for(j=0;j<s;j++) res->m[i][j] = a1->m[i][j] - a2->m[i][j]; } // res = a1 + a2 void add_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res) { int i,j, s; s = a1->sz; for(i=0;i<s;i++) for(j=0;j<s;j++) res->m[i][j] = a1->m[i][j] + a2->m[i][j]; } // res = a1 * a2 void mul_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res) { float y; int i,j, k, l, s; s = a1->sz; y =0.0; for(i=0;i<s;i++) { for(j=0;j<s;j++) { y = 0.0; //res->m[i][j] //a1->m[i][j] //a2->m[i][j]; for(k=0;k<s;k++) { y+= a1->m[i][k]*a2->m[k][j]; } res->m[i][j]=y; } } } int main() { int i,j, n; struct matrix *A,*B,*C,*E,*tmp,*tmp2,*tmp3; srand(time(0)); n = 5; // Код повторяется, но мне самому хотелось бы узнать // как передать функции указатель и // выделить память в функции так, чтобы при выходе из нее // память сохранилась A = (struct matrix*) malloc(sizeof(struct matrix)); B = (struct matrix*) malloc(sizeof(struct matrix)); C = (struct matrix*) malloc(sizeof(struct matrix)); E = (struct matrix*) malloc(sizeof(struct matrix)); tmp = (struct matrix*) malloc(sizeof(struct matrix)); tmp2 = (struct matrix*) malloc(sizeof(struct matrix)); tmp3 = (struct matrix*) malloc(sizeof(struct matrix)); A->m = (float**) malloc(n*sizeof(float*)); B->m = (float**) malloc(n*sizeof(float*)); C->m = (float**) malloc(n*sizeof(float*)); E->m = (float**) malloc(n*sizeof(float*)); tmp->m = (float**) malloc(n*sizeof(float*)); tmp2->m = (float**) malloc(n*sizeof(float*)); tmp3->m = (float**) malloc(n*sizeof(float*)); for(i=0;i<n;i++) { A->m[i] = (float*) malloc(n*sizeof(float)); B->m[i] = (float*) malloc(n*sizeof(float)); C->m[i] = (float*) malloc(n*sizeof(float)); E->m[i] = (float*) malloc(n*sizeof(float)); tmp->m[i] = (float*) malloc(n*sizeof(float)); tmp2->m[i] = (float*) malloc(n*sizeof(float)); tmp3->m[i] = (float*) malloc(n*sizeof(float)); } // A->sz = n; B->sz = n; C->sz = n; E->sz = n; tmp->sz = n; tmp2->sz = n; tmp3->sz = n; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if (i==j) E->m[i][j] = 1.0; else E->m[i][j] = 0.0; } } for(i=0;i<n;i++) for(j=0;j<n;j++) C->m[i][j] = 1.0/((float)(i+1)+(float)(j+1) ) ; for(i=0;i<n;i++) for(j=0;j<n;j++) A->m[i][j] = 1.0/(float)(rand()%9+1) ; for(i=0;i<n;i++) for(j=0;j<n;j++) B->m[i][j] = 1.0/(float)(rand()%9+1) ; print_matrix(A); print_matrix(B); print_matrix(C); print_matrix(E); sub_matrix(B, E, tmp); print_matrix(tmp); mul_matrix(A, tmp, tmp2); print_matrix(tmp2); add_matrix(tmp2, C, tmp3); print_matrix(tmp3); for(i=0;i<n;i++) { free (A->m[i]); free (B->m[i]); free (C->m[i]); free (E->m[i]); free (tmp->m[i]); free (tmp2->m[i]); free (tmp3->m[i]); } free (A->m); free (B->m); free (C->m); free (E->m); free (tmp->m); free (tmp2->m); free (tmp3->m); free (A); free (B); free (C); free (E); free (tmp); free (tmp2); free (tmp3); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д