jazykc  2013.3
upoljazykc
 All Classes Files Functions Variables Typedefs Macros Pages
soucin-matic.c
1 /****** Součin matic ******
2 Téma: Dynamická vícerozměrná pole
3 Procvičované učivo: dynamická vícerozměrná pole, funkce, cykly
4 Napište v jazyku C funkci double **soucin(int m, int n, int o, double **A,
5 double **B), která vypočítá součin matice A o rozměrech mxn a matice B o
6 rozměrech nxo. Funkce vrací alokované dvojrozměrné pole s hodnotami výsledné
7 matice.
8 
9 Příklad výstupu:
10 Matice A:
11  1 2 3
12  4 5 6
13 
14 Matice B:
15  1 0
16  2 1
17  0 -1
18 
19 Vysledna matice:
20  5 -1
21 14 -1
22 Alternativy úlohy: součet matic
23 */
24 //Povolené knihovny:
25 #include <stdio.h>
26 #include <stdlib.h>
27 //#include <assert.h> //na 'osetreni' chyb
28 
29 /* A je mxn, B je nxo, vysledna C je
30  * nasobeni viz http://www.matweb.cz/matice
31  *
32  * double** je pointer na pole double* pointeru!!!
33 
34 <ditaa>
35 double ∗∗C; double ∗[m]//malloc()-ed
36 +-------+++ +-------++ +-----+-----+---+-----+
37 | C *--+++--->+ *---++---->| | |...| | double[o]
38 +-------+++ +-------++ +-----+-----+---+-----+
39  | *---++---->| | |...| | kazdy radek malloc()-ed
40  +-------++ +-----+-----+---+-----+
41  | *---++---->| | |...| |
42  +-------++ +-----+-----+---+-----+
43 </ditaa>
44  */
45 double **soucin(int m, int n, int o, double **A, double **B) {
46  int i,j,p;
47  double Cij;
48  double **C = (double **)malloc(m * sizeof(double*));//pole double (*)[m]
49  for (i=0; i < m; i++) {
50  C[i] = (double*)malloc(o * sizeof(double));//radek/pole double velikosti [o]
51  for (j=0; j < o; j++) {
52  for (p=0, Cij=0.0; p < n; p++) {
53 // printf("Cij += A[%d][%d] * B[%d][%d]\n",i,p, p,j);//overeni vzorce pro nasobeni matice
54  Cij += A[i][p] * B[p][j];
55  }
56 // printf("C[%d][%d]=%g\n",i,j,Cij);
57  C[i][j] = Cij;
58  }
59  }
60  return C;//free() musi delat volajici!
61 }
62 
63 void vypis_matice(int m, int n, double **A) {
64  int i,j;
65  for(i=0;i<m;i++) {
66  for(j=0;j<n;j++) {
67  printf("%s%g", j?", ":"", A[i][j]);
68  }
69  printf("\n");
70  }
71 }
72 
73 //A,B na testovani si udelame staticky:
74 double A23[2][3] = { {1,2,3}, {4,5,6}};
75 double B32[3][2] = { {1,0}, {2,1}, {0, -1}};
76 // double** je ale pointer na pole pointeru!!!, resp. nazev pole je taky pointer!
77 // A,B pole pointeru nastavime na radky statickych A23,B32 -- nemusime malloc()
78 double *A[2] = {&A23[0][0], &A23[1][0]};
79 double *B[3] = {&B32[0][0], &B32[1][0], &B32[2][0]};
80 
81 int main(void) {
82  double **C;
83  vypis_matice(2,3,A);
84  vypis_matice(3,2,B);
85  C = soucin(2,3,2, A, B);
86  vypis_matice(2,2,C);
87  return 0;
88 }