› Foros › Off-Topic › Miscelánea
#include <stdio.h>
#include <stdlib.h>
#define MAXFILS 10
#define MAXCOLS 10
void main()
{
int A[MAXFILS][MAXCOLS], B[MAXFILS][MAXCOLS], C[MAXFILS][MAXCOLS];
int M, N, P, Q;
int leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],
int M, int N);
printf("Introduzca el valor de M y N de la matriz A\n");
scanf("%d %d",&M, &N);
printf ("Introduzca la matriz A\n");
leerMatriz(A,M,N);
printf("Matriz A\n");
visualMatriz(A,M,N);
printf("\nIntroduzca el valor de P y Q de la matriz B\n");
scanf("%d %d",&P, &Q);
printf("\nIntroduzca la matriz B\n");
leerMatriz(B,P,Q);
printf("Matriz B\n");
visualMatriz(B,P,Q);
productMatriz(A,B,C, M,Q);
printf ("\nEl resultado es:\n");
visualMatriz(C,M,Q);
getch();
}
void leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
int i, j;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
scanf("%d",&arr[i][j]);
}
}
}
void visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
int i, j;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
printf("%d",arr[i][j]);
}
}
}
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
}
PiraBeLiO escribió:Hola, vereis, estoy liadisimo haciendo esta práctica. No sé por qué no me funciona...
Alguna sugerencia??
Gracias!!#include <stdio.h>
#include <stdlib.h>
#define MAXFILS 10
#define MAXCOLS 10
void main()
{
int A[MAXFILS][MAXCOLS], B[MAXFILS][MAXCOLS], C[MAXFILS][MAXCOLS];
int M, N, P, Q;
int leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],
int M, int N);
printf("Introduzca el valor de M y N de la matriz A\n");
scanf("%d %d",&M, &N);
printf ("Introduzca la matriz A\n");
leerMatriz(A,M,N);
printf("Matriz A\n");
visualMatriz(A,M,N);
printf("\nIntroduzca el valor de P y Q de la matriz B\n");
scanf("%d %d",&P, &Q);
printf("\nIntroduzca la matriz B\n");
leerMatriz(B,P,Q);
printf("Matriz B\n");
visualMatriz(B,P,Q);
productMatriz(A,B,C, M,Q);
printf ("\nEl resultado es:\n");
visualMatriz(C,M,Q);
getch();
}
void leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
int i, j;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
scanf("%d",&arr[i][j]);
}
}
}
void visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
int i, j;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
printf("%d",arr[i][j]);
}
}
}
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
}
PiraBeLiO escribió:Es en tiempo de ejecución, el programa se ejecuta perfectamente, pero el valor de la matriz resultado no tiene sentido.
Te refieres a que en la función de multiplicación me falta un bucle con los tamaños de las matrices para hacer la operación??
Gracias!!
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
}
paliyoes escribió:PiraBeLiO escribió:Es en tiempo de ejecución, el programa se ejecuta perfectamente, pero el valor de la matriz resultado no tiene sentido.
Te refieres a que en la función de multiplicación me falta un bucle con los tamaños de las matrices para hacer la operación??
Gracias!!
Vamos a ver, mira este bucle:void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
}
Si multiplicas una matriz A(MxN) y otra B(PXQ), el resultado es una C(MXQ). Pues bien, en caso de que M > P o que Q > N (o ambas a la vez), fíjate en qué pasaría en tu bucle, creo que está ahí el fallo, a simple vista, vamos.
Rojos saludos.
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
}
}
}
Wizard 5 escribió:void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < N; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
}
}
}
He cambiado los índices de A y B de A[i][k] * B[k][j] a A[j][k] * B[k][i].
Creo que es eso, pero no tengo ganas de comprobarlo
PiraBeLiO escribió:Pero en realidad sólo fallaría si introdujese mal los parámetros de las matrices, en el caso de que los introdujese bien debería funcionar no?? Porque aunque en la función multiplicar se vean los parámetros M y N, los que se le pasa en realidad son M y Q.
Gracias por la ayuda!
Rugal_kof94 escribió:Ejecuta paso a paso...
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N, int P){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < P; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
}
}
}
Zespris escribió:Necesitas pasar tres parámetros al programa de multiplicación.
Si multiplicas una matriz A(m x n) por una matriz B(n x p) te dará una matriz C(m x p)void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N, int P){
int i, j, k;
for(i=0; i< M ; i++){
for ( j=0; j < N; j++){
C[i][j] = 0 ;
for (k=0; k < P; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
}
}
}
Así debería funcionar si multiplicas A(m x p) por B(p x n).
C[i][j] = 0 ;
for (k=0; k < P; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
Zespris escribió:Ten en cuenta que tu tienes dos matrices...
A(m,n) y B(p,q).
Sólo las puedes multiplicar si n=p, y te da una matriz C(m,q), hasta ahí bien?
Pues entonces, el elemento i,j de la matriz C viene dado por:
C(i,j) = SUMA (k=1,p) A(i,k)*B(k,j)...
que sería el bucle interno:C[i][j] = 0 ;
for (k=0; k < P; k++){
C[i][j] = C[i][j] + A[j][k] * B[k][i];
}
El resto de bucles es para ir pasando por todos los i,j elementos de C.
Entonces, necesitas pasarle p al programa, para que sepa cuantos elementos contar.
Si A fuera (3x2) y B (2x4), C sería (3x4).
C(1,2) sería A(1,1)*B(1,2)+A(1,2)*B(2,2).
Pero si A fuera (3x4) y B (4x4), C también sería (3x4). Aun así, el algoritmo de multiplicación sería diferente, ya que tendrías que sumar 4 productos para calcular cada elemento de C.
C(1,2) ahora sería sería A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(4,2).
Ahora?