#include #include #include /* Program demonstruje nasobeni dvou matic. * * Nasobenim matice s rozmery m1 x n1 (m1 radku, n1 sloupcu) s matici o rozmerech n1 x n2 * vznikne matice o rozmerech m1 x n2. Z toho vyplyva, ze lze vynasobit spolu matice, ktere * maji neco spolecne - konkretne pocet sloupcu prvni matice musi byt roven poctu radku * druhe matice. * * Pro jednoduchost overovani se matice plni nahodnymi cisly pouze z rozsahu 0 - 3. */ // funkce na vypis matice void vypisMatici(unsigned int m, unsigned int n, int mat[m][n]) { for (unsigned int i = 0; i < m; ++i) { printf("|"); for (unsigned int j = 0; j < n; ++j) printf("%4d", mat[i][j]); printf(" |\n"); } } // naplneni matice nahodnymi cisly void vymysliObsah(unsigned int m, unsigned int n, int mat[m][n]) { for (unsigned int i = 0; i < m; ++i) for (unsigned int j = 0; j < n; ++j) mat[i][j] = rand() % 4; } // vynylovani matice void nulujMatici(unsigned int m, unsigned int n, int mat[m][n]) { for (unsigned int i = 0; i < m; ++i) for (unsigned int j = 0; j < n; ++j) mat[i][j] = 0; } // vlastni nasobeni natic void vynasobMatice(unsigned int m1, unsigned int n1, unsigned int n2, int mat1[m1][n1], int mat2[n1][n2], int matVysl[m1][n2]) { nulujMatici(m1, n2, matVysl); for (unsigned int i = 0; i < n2; ++i) // pres sloupce druhe matice for (unsigned int j = 0; j < m1; ++j) // pres radky prvni matice for (unsigned int k = 0; k < n1; ++k) // pres sloupce prvni a radky druhe matice matVysl[j][i] += mat1[j][k] * mat2[k][i]; // poscitame vynasobene hodnoty } int main(void) { unsigned int m1, n1, m2, n2; srand(time(NULL)); printf("Zadej velikost prvni matice - 2 cisla (m x n): "); if (2 != scanf("%u %u", &m1, &n1)) { // primitivni osetreni vstupu fprintf(stderr, "Chyba na vstupu!\n"); // chyba na standardni chybovy vystup return 1; } printf("Zadej velikost druhe matice - 2 cisla (m x n): "); if (2 != scanf("%u %u", &m2, &n2)) { // primitivni osetreni vstupu fprintf(stderr, "Chyba na vstupu!\n"); // chyba na standardni chybovy vystup return 1; } printf("Zadal jsi matice rozmeru: %u x %u, %u x %u\n", m1, n1, m2, n2); if (n1 != m2) { // osetreni, aby slo soucin provest printf("Pocet sloupcu (%u) prvni matice se neshoduje s poctem radku (%u) druhe matice,\n" "nelze provest soucin!.\n", n1, m2); return 2; } if (!m1 || !n1 || !m2 || !n2) { printf("Alespon jedna matice ma nulovy rozmer, nema smysl.\n"); return 0; } else if (m1+n1+m2+n2 > 40000) { printf("Tak velkou matici se mi nechce zpracovavat :-)\n"); return 3; } int mat1[m1][n1], mat2[m2][n2]; // deklarace matice int matVysl[m1][n2]; // matice vysledku vymysliObsah(m1, n1, mat1); // naplneni matic nahodnym obsahem vymysliObsah(m2, n2, mat2); vypisMatici(m1, n1, mat1); // vypis prvni matice printf("\tx\n"); vypisMatici(m2, n2, mat2); // vypis druhe matice printf("\t==\n"); vynasobMatice(m1,n1,n2, mat1, mat2, matVysl); // vynasobeni matic vypisMatici(m1, n2, matVysl); // vypis vysledku return 0; }