/* Pelda 2D matrixszorzasra: m1 = |1 2| |3 4| m2 = |4 5 6| |7 8 9| result = |18 21 24| |40 47 54| */ #include #include typedef double** data_t; // double tipusu mutato tipus letrehozasa typedef struct { // matrix_t nevu struktura definialasa, melynek ket attributuma van: n es data int n, m; data_t data; } matrix_t; /* Struktura elemeinek feltoltese */ void beolvas (matrix_t *mat){ int i, j; printf("Add meg a magassagot: "); scanf("%d", &mat->n); printf("Add meg a szelesseget: "); scanf("%d", &mat->m); mat->data = malloc( mat->n * sizeof(double*)); // helyet foglalunk a memoriaban matrix elemeinek for (i=0; i < mat->n ; i++){ mat->data[i] = malloc( mat->m * sizeof(double)); } for (i=0; i < mat->n ; i++){ // feltoltjuk a matrix elemit for (j=0; j < mat->m ; j++){ scanf("%lf", &mat->data[i][j]); } } } /* Struktura elemeinek kiiratasa */ void kiir (matrix_t *mat){ int i, j; printf("\nMagassag = %d, Szelesseg = %d\n", mat->n, mat->m); for (i=0; i < mat->n ; i++){ for (j=0; j < mat->m ; j++){ printf("%2.2lf ", mat->data[i][j]); } printf("\n"); } } /* Strukturak matrix attributumainak osszeszorzasa */ int szoroz (matrix_t *mat_1, matrix_t *mat_2, matrix_t *mat_res){ int i, j, k; double osszeg = 0; if (mat_1->m != mat_2->n){ // leellenorizzuk, hogy osszeszorozhatoak-e return 0; // ha nem, akkor 0 (hamis) ertekkel terunk vissza } else { /* Eredmeny struktura elemeinek feltoltese */ mat_res->n = mat_1->n; // a magassaga az elso matrix magassaga lesz mat_res->m = mat_2->m; // a szelessege az masodik matrix szelessege lesz // 2D matrix memoria foglalasa mat_res->data = malloc(mat_res->n * sizeof(double*)); // N darab for (i=0; i < mat_res->n; i++){ // majd mindhez M darab mat_res->data[i] = malloc(mat_res->m * sizeof(double)); } // Ezen elmelkedjunk el egy kicsit, hogy hogy is jon ki ez a 3 egymasba agyazott for ciklus (rajzoljuk is le, ha szukseges) for (k = 0; k < mat_res->m ; k++){ for (i = 0 ; i < mat_1->n ; i++){ for (j = 0; j< mat_2->n ; j++){ osszeg += mat_1->data[i][j] * mat_2->data[j][k]; } mat_res->data[i][k] = osszeg; osszeg = 0; } } return 1; } } /* Strukturan belul foglalt memoriaterulet felszabaditasa */ void torol(matrix_t *mat){ int i; for (i=0; i < mat->n ; i++){ free(mat->data[i]); } free(mat->data); } int main(){ int sikeres; matrix_t elso, masodik, eredmeny; // 2 matrix_t struktura letrehozasa beolvas(&elso); // ertekadas beolvas(&masodik); // ertekadas kiir(&elso); kiir(&masodik); sikeres = szoroz(&elso, &masodik, &eredmeny); // ket matrix osszeszorzasa. A sikeres volt a szorzas a "sikeres" valtozo erteke 1 lesz, ellenkezo esetben 0 if (sikeres == 1){ kiir(&eredmeny); torol(&eredmeny); } else { printf("\nA mereteknek meg kell egyezniuk!\n"); } torol(&elso); // lefoglalt memoriaterulet felszabaditasa torol(&masodik); // lefoglalt memoriaterulet felszabaditasa return 0; }