Foros del Web » Programando para Internet » PHP »

Producto de matrices.

Estas en el tema de Producto de matrices. en el foro de PHP en Foros del Web. Buenas, qué tal: Estoy iniciándome en la programación PHP y he visto este foro de casualidad por Google al buscar algo relacionado con el problema ...
  #1 (permalink)  
Antiguo 15/12/2009, 10:07
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Producto de matrices.

Buenas, qué tal:

Estoy iniciándome en la programación PHP y he visto este foro de casualidad por Google al buscar algo relacionado con el problema que estoy intentado resolver, os lo planteo a ver que os parece.

El enunciado completo es el siguiente:

La página, al ser invocada por primera vez, preguntará al usuario las dimensiones de las matrices NxM y MxP. Una vez enviado el formulario, la página mostrará un nuevo formulario conteniendo en forma de dos tablas tantas entradas como elementos tendrán las dos matrices. Finalmente, enviado este último formulario, se mostrarán las dos matrices (en forma de tabla) y el resultado de su producto. Al procesar los datos del formulario que contiene los datos de las matrices, se deberá comprobar que todos los datos se encuentran rellenos y que son numéricos. En caso de error, se volverá a mostrar el formulario de nuevo con los datos correctos ya prerrellenos y los datos incorrectos en sus campos teniendo éstos un fondo rojo para indicar el error. Este proceso se repetirá indefinidamente hasta que no haya errores.

Sé como realizar un formulario para introducir las dimensiones:

Código HTML:
<body>
        <form action="Elementos.php" method="post">
            <h1>Dimensiones</h1>
            N: <input type="text" name="N" /><br />
            M: <input type="text" name="M" /><br />
            P: <input type="text" name="P" /><br /><br />
            <input type="submit" name="Enviar" value="Enviar" />
            <input type="reset" name="Restaurar" value="Restaurar" />
        </form>
 </body> 
Siendo la página "Elementos.php" la siguiente:

Código PHP:
<body>
        <?php
            $N 
$_POST['N'];
            
$M $_POST['M'];
            
$P $_POST['P'];
            
$E '<input type="text" name="N" />';
            echo 
'<h3>';echo 'Matriz A';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$N;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$M;$j++){
                    echo 
"<td>";
                    echo 
$E;
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
            echo 
'<h3>';echo 'Matriz B';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$M;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$P;$j++){
                    echo 
"<td>";
                    echo 
$E;
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
        
?>
        <form action="Resultado.php" method="post">
            <input type="submit" name="Enviar" value="Enviar" />
            <input type="reset" name="Restaurar" value="Restaurar" />
        </form>
</body>
Lo que no sé es cómo acceder a cada elemento de las matrices una vez que éstos se han introducido en esta última página.

Si alguien sabe cómo hacerlo, que me lo comente si no es demasiada molestia.

Gracias de antemano.
  #2 (permalink)  
Antiguo 15/12/2009, 10:17
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Producto de matrices.

No estas metiendo los datos en ninguna matriz... solo estas sacando por pantalla los nº...
O eso creo a la vista del código...

Tienes que meter los datos en una matriz...
  #3 (permalink)  
Antiguo 15/12/2009, 10:23
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

A la vez que muestras la matriz pudes ir guardando los valores en un array multidimensional. La tabla que dibujas no deja de ser este array. Cuando lo tengas a un array podrás acceder a todos los elementos simplemente indicando $array[columna][fila].
  #4 (permalink)  
Antiguo 15/12/2009, 10:55
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Producto de matrices.

Gracias por responder.

Giorgi, sé que no los estoy metiendo, tal y como está el código, sólo aparecerían tantos cuadros de texto en forma de tabla como dimensiones se hayan indicado en la primera página.

Osdiwe, sé que de esa forma puedo acceder a los datos, el problema es que no puedo guardar los datos introducidos en los campos hasta que no pulse el botón "Enviar".
  #5 (permalink)  
Antiguo 15/12/2009, 11:12
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

Creo que el problema es que los campos de formulario que pones en cada celda de la tabla todos tienen el mismo atributo "name". Podrías poner un name o id a cada uno distinto, haciendo referencia a las coordenadas que ocupan en la matriz. Por ejemplo, los campos de la primera fila serian:

<input id="0-0" name="0-0" value="" />
<input id="0-1" name="0-1" value="" />
<input id="0-2" name="0-2" value="" />

Y para que se envien correctamente pon esta parte antes de la tabla:
<form action="Resultado.php" method="post">

Y así podrás recuperar todos los valores de cada celda, guardarlos, volver a mostrarlos, etc...
  #6 (permalink)  
Antiguo 15/12/2009, 11:21
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Producto de matrices.

Osdiwe, no puedo utilizar ese método ya que las dimensiones de las filas y columnas de las matrices pueden variar de un caso a otro.
  #7 (permalink)  
Antiguo 15/12/2009, 11:31
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

Por eso no hay problema. Puedes crear un código general que funcione en todos los casos. Te intento poner un ejemplo a partir de tu código:

Código PHP:
<body>
    <form action="Resultado.php" method="post">
        <?php
            $N 
$_POST['N'];
            
$M $_POST['M'];
            
$P $_POST['P'];
            echo 
'<h3>';echo 'Matriz A';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$N;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$M;$j++){
                    echo 
"<td>";
                    echo 
'<input type="text" name="' $i $j '" id="' $i $j '" value="" />;
                    echo "</td>";
                }
                echo "</tr>";
            }
            echo "</table>";
            echo '
<h3>';echo 'Matriz B';echo '</h3>';
            echo "<table border=\"1\">";
            for($i=0;$i<$M;$i++){
                echo "<tr>";
                for($j=0;$j<$P;$j++){
                    echo "<td>";
                    echo '
<input type="text" name="' . $i . $j '" id="' . $i . $j '" value="" />;
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
        
?>
            <input type="hidden" name="N" id="N" value="<?php echo $_POST['N']; ?>" />
            <input type="hidden" name="M" id="M" value="<?php echo $_POST['M']; ?>" />
            <input type="hidden" name="P" id="P" value="<?php echo $_POST['P']; ?>" />
            <input type="submit" name="Enviar" value="Enviar" />
            <input type="reset" name="Restaurar" value="Restaurar" />
        </form>
</body>
De esta forma te genera un input con el nombre relacionado con la posicion que ocupa en la matriz y los input "hidden" te permiten recuperar fácilmente las dimensiones de la matriz. Para recuperar los valores solamente debes realizar un bucle for como los que utilizas para mostrar la tabla. Te pongo un ejemplo senzillo que muestra los valores, solo deberás añadir el código de la tabla.

Código PHP:
for($i=0;$i<$_POST['N'];$i++){
                for(
$j=0;$j<$_POST['M'];$j++){
                    
$actual $i $j;
                    echo 
$_POST[$actual];
                }
            }

for(
$i=0;$i<$_POST['M'];$i++){
                for(
$j=0;$j<$_POST['P'];$j++){
                    
$actual $i $j;
                    echo 
$_POST[$actual];
                }
            } 
Si necesitas algo más solo tienes que decirlo.
  #8 (permalink)  
Antiguo 15/12/2009, 12:00
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Producto de matrices.

Gracias Osdiwe.

No obstante, las dos matrices aparecen iguales, es decir, los elementos que aparecen en la matriz A son los mismos que aparecen en la matriz B, una vez hecho el siguiente código:

Código PHP:
<body>
        <?php
            
echo '<h3>';echo 'Matriz A';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$_POST['N'];$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$_POST['M'];$j++){
                    echo 
"<td>";
                    
$actual $i.$j;
                    echo 
$_POST[$actual];
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
            echo 
'<h3>';echo 'Matriz B';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$_POST['M'];$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$_POST['P'];$j++){
                    echo 
"<td>";
                    
$actual $i.$j;
                    echo 
$_POST[$actual];
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
            echo 
'<h3>';echo 'Producto';echo '</h3>';
            for(
$i=0;$i<$elementosA;$i++){
                for(
$j=0;$j<$elementosA;$j++){
                    
$matrizC[$i][$j]=0;
                    for(
$k=0;$k<$elementosA;$k++){
                        
$matrizC[$i][$j]+=$matrizA[$i][$k]*$matrizB[$k][$j];
                    }
                }
                
$elementosC++;
            }
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$elementosC;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$elementosC;$j++){
                    echo 
"<td>";
                    echo 
$matrizC[$i][$j];
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
        
?>
</body>
Y, aunque aparezcan distintos, no sé como podría realizar el producto de las mismas en un mismo bucle for.
  #9 (permalink)  
Antiguo 15/12/2009, 12:14
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

Tienes razón. Hice el código demasiado rápido. En los inputs de cada elemento, a parte de poner la columna y fila a la que pertenecen deberías poner otro identificador para saber a qué matriz corresponde:

Código PHP:
<body>
    <form action="Resultado.php" method="post">
        <?php
            $N 
$_POST['N'];
            
$M $_POST['M'];
            
$P $_POST['P'];
            echo 
'<h3>';echo 'Matriz A';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$N;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$M;$j++){
                    echo 
"<td>";
                    echo 
'<input type="text" name="A' $i $j '" id="A' $i $j '" value="" />';
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
            echo 
'<h3>';echo 'Matriz B';echo '</h3>';
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$M;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$P;$j++){
                    echo 
"<td>";
                    echo 
'<input type="text" name="B' $i $j '" id="B' $i $j '" value="" />';
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>";
        
?>
            <input type="hidden" name="N" id="N" value="<?php echo $_POST['N']; ?>" />
            <input type="hidden" name="M" id="M" value="<?php echo $_POST['M']; ?>" />
            <input type="hidden" name="P" id="P" value="<?php echo $_POST['P']; ?>" />
            <input type="submit" name="Enviar" value="Enviar" />
            <input type="reset" name="Restaurar" value="Restaurar" />
        </form>
</body>
Y para recuperarlos modifica la linea donde se crea la variable actual por lo siguiente:

- En el primer bucle: $actual = "A".$i.$j;
- En el segundo bucle: $actual = "B".$i.$j;

Y respecto al producto de las matrices... tengo las matemáticas un poco olvidadas... Intentaré recuperar algunos apuntes y te cuento.
  #10 (permalink)  
Antiguo 15/12/2009, 12:23
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Producto de matrices.

Genial Osdiwe, gracias.

El producto es como aparece más abajo, es decir:

Código PHP:
            for($i=0;$i<$elementosA;$i++){ 
                for(
$j=0;$j<$elementosA;$j++){ 
                    
$matrizC[$i][$j]=0
                    for(
$k=0;$k<$elementosA;$k++){ 
                        
$matrizC[$i][$j]+=$matrizA[$i][$k]*$matrizB[$k][$j]; 
                    } 
                } 
                
$elementosC++; 
            } 
Sólo habría que cambiar las referencias, pero intuyo que es en vez de:

$matrizC[$i][$j]+=$matrizA[$i][$k]*$matrizB[$k][$j];

Es:

$matrizC[$i][$j]+="A".$i.$j*"B".$i.$j;
  #11 (permalink)  
Antiguo 15/12/2009, 12:36
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

$matrizC[$i][$j]+="A".$i.$j*"B".$i.$j;

Recuerda que "A".$i.$j y "B".$i.$j sirve para meterlo dentro de la variable POST que es donde recuperas los datos, si solo pones "A".$i.$j no te devolverá el valor, solo la referencia.
  #12 (permalink)  
Antiguo 15/12/2009, 13:17
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Producto de matrices.

Gracias Osdiwe por la ayuda prestada.

Para futuras consultas, he terminado el problema con el siguiente código:

Código PHP:
            for($i=0;$i<$_POST['N'];$i++){
                for(
$j=0;$j<$_POST['M'];$j++){
                    
$matrizC[$i][$j]=0;
                    for(
$k=0;$k<$_POST['P'];$k++){
                        
$actualA "A".$i.$k;
                        
$actualB "B".$k.$j;
                        
$matrizC[$i][$j]+=$_POST[$actualA]*$_POST[$actualB];
                    }
                }
                
$elementosC++;
            }
            echo 
"<table border=\"1\">";
            for(
$i=0;$i<$elementosC;$i++){
                echo 
"<tr>";
                for(
$j=0;$j<$elementosC;$j++){
                    echo 
"<td>";
                    echo 
$matrizC[$i][$j];
                    echo 
"</td>";
                }
                echo 
"</tr>";
            }
            echo 
"</table>"
Con esto, ya se multiplican y se muestra el producto correctamente.
  #13 (permalink)  
Antiguo 15/12/2009, 13:42
 
Fecha de Ingreso: diciembre-2009
Mensajes: 438
Antigüedad: 14 años, 11 meses
Puntos: 16
Respuesta: Producto de matrices.

¡De nada! Para eso estamos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:10.