ProgIng - Programación en Ingeniería
Loading...
Searching...
No Matches
Ejemplo040.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3
4double *crearMat(int r, int c)
5{
6 double *M;
7 M = (double*)malloc(r*c*sizeof(double));
8 if(M==NULL)
9 return NULL;
10 return M;
11}
12
13double **crearMatC(int r, int c)
14{
15 double **M;
16 int i;
17 M = (double**)malloc(r*sizeof(double*));
18 if(M==NULL)
19 return NULL;
20 M[0] = (double*)malloc(r*c*sizeof(double));
21 if(M[0]==NULL)
22 {
23 free(M);
24 return NULL;
25 }
26 for(i=1; i<r; i++)
27 M[i] = M[i-1]+c;
28 return M;
29}
30
31double **crearMatD(int r, int c)
32{
33 double **M;
34 int i;
35 M = (double**)malloc(r*sizeof(double*));
36 if(M==NULL)
37 return NULL;
38 for(i=0; i<r; i++)
39 {
40 M[i] = (double*)malloc(c*sizeof(double));
41 if(M[i]==NULL)
42 {
43 for(--i; i>-1; i--)
44 free(M[i]);
45 free(M);
46 return NULL;
47 }
48 }
49 return M;
50}
51
52int capturar(double *M, int r, int c, char *str)
53{
54 int i, j;
55 for(i=0; i<r; i++)
56 for(j=0; j<c; j++)
57 {
58 printf("%s[%d][%d] = ", str, i+1, j+1);
59 scanf("%lf", M+c*i+j);
60 }
61 return 0;
62}
63
64int imprimir(double *M, int r, int c)
65{
66 int i, j;
67 for(i=0; i<r; i++)
68 {
69 for(j=0; j<c; j++)
70 printf("%.4lf\t", M[c*i+j]);
71 printf("\n");
72 }
73 return 0;
74}
75
76int imprimirM(double **M, int r, int c)
77{
78 int i, j;
79 for(i=0; i<r; i++)
80 {
81 for(j=0; j<c; j++)
82 printf("%.4lf\t", M[i][j]);
83 printf("\n");
84 }
85 return 0;
86}
87
88double *multiplicar(double *M1, int r1, int c1, double *M2, int r2, int c2)
89{
90 int i, j, k;
91 double *M3;
92 if(c1!=r2)
93 {
94 printf("Error: En el tamaño de las matrices.\n");
95 return NULL;
96 }
97 M3 = crearMat(r1, c2);
98 if(M3==NULL)
99 return NULL;
100 for(i=0; i<r1; i++)
101 for(j=0; j<c2; j++)
102 for(k=0, M3[i*c1+j]=0; k<c1; k++)
103 M3[i*c2+j] += M1[i*c1+k]*M2[k*c2+j];
104// M3[i][j] = M3[i][j]+M1[i][k]*M2[k][j]
105// M3[i][j] += M1[i][k]*M2[k][j]
106// M3[i*c2+j] += M1[i*c1+k]*M2[k*r2+j]
107 return M3;
108}
109
110double **multiplicarM(double **M1, int r1, int c1, double **M2, int r2, int c2)
111{
112 int i, j, k;
113 double **M3;
114 if(c1!=r2)
115 {
116 printf("Error: En el tamaño de las matrices.\n");
117 return NULL;
118 }
119 M3 = crearMatC(r1, c2);
120 if(M3==NULL)
121 return NULL;
122 for(i=0; i<r1; i++)
123 for(j=0; j<c2; j++)
124 for(k=0, M3[i][j]=0; k<c1; k++)
125 M3[i][j] += M1[i][k]*M2[k][j];
126 return M3;
127}
128
129int capturarM(double **M, int r, int c, char *str)
130{
131 int i, j;
132 for(i=0; i<r; i++)
133 for(j=0; j<c; j++)
134 {
135 printf("%s[%d][%d] = ", str, i+1, j+1);
136 scanf("%lf", M[i]+j);
137 }
138 return 0;
139}
140
141int liberar(double **M, int r)
142{
143 int i;
144 for(i=0; i<r; i++)
145 free(M[i]);
146 free(M);
147 return 0;
148}
149
150int main(int argc, char *argv[])
151{
152 int rA, rB, cA, cB;
153 double **A, **B, **C;
154 do{
155 printf("Ingrese el numero de renglones de A: ");
156 scanf("%d", &rA);
157 }while(rA<1);
158 do{
159 printf("Ingrese el numero de columnas de A: ");
160 scanf("%d", &cA);
161 }while(cA<1);
162 A = crearMatC(rA, cA);
163 if(A==NULL)
164 return 1;
165 capturarM(A, rA, cA, "A");
166 do{
167 printf("Ingrese el numero de renglones de B: ");
168 scanf("%d", &rB);
169 }while(rB<1);
170 do{
171 printf("Ingrese el numero de columnas de B: ");
172 scanf("%d", &cB);
173 }while(cB<1);
174 B = crearMatD(rB, cB);
175 if(B==NULL)
176 {
177 free(A[0]);
178 free(A);
179 return 2;
180 }
181 capturarM(B, rB, cB, "B");
182 C = multiplicarM(A, rA, cA, B, rB, cB);
183 if(C==NULL)
184 {
185 free(A[0]);
186 free(A);
187 liberar(B, rB);
188 return 4;
189 }
190 printf("A\n");
191 imprimirM(A, rA, cA);
192 printf("B\n");
193 imprimirM(B, rB, cB);
194 printf("C\n");
195 imprimirM(C, rA, cB);
196 free(A[0]);
197 free(A);
198 liberar(B, rB);
199 free(C);
200 return 0;
201}
#define M
int capturarM(double **M, int r, int c, char *str)
Definition Ejemplo040.c:129
double ** multiplicarM(double **M1, int r1, int c1, double **M2, int r2, int c2)
Definition Ejemplo040.c:110
int liberar(double **M, int r)
Definition Ejemplo040.c:141
double ** crearMatD(int r, int c)
Definition Ejemplo040.c:31
int capturar(double *M, int r, int c, char *str)
Definition Ejemplo040.c:52
double * crearMat(int r, int c)
Definition Ejemplo040.c:4
double * multiplicar(double *M1, int r1, int c1, double *M2, int r2, int c2)
Definition Ejemplo040.c:88
int imprimir(double *M, int r, int c)
Definition Ejemplo040.c:64
double ** crearMatC(int r, int c)
Definition Ejemplo040.c:13
int imprimirM(double **M, int r, int c)
Definition Ejemplo040.c:76
int main(void)
Definition Ejemplo_035.c:15