Duda rápida de C++: do... while...
Posted: 26 May 2011, 18:48
Me han dado un código fuente para la práctica de Álgebra II que tengo mañana, al cual le tendré que hacer las modificaciones que me pidan allí. Este programa busca el autovalor máximo y el autovector correspondiente de una matriz simétrica por medio de un proceso iterativo.
El algoritmo no comprueba que el usuario está introduciendo una matriz simétrica, es decir, que coincide con su transpuesta (o lo que es lo mismo, que cada elemento A[i][j] es igual al elemento A[j][i]). No sé si me pedirán modificar esto, pero lo voy a hacer porque además me resultará más cómodo mañana saber si estoy metiendo matrices simétricas.
Una forma es especificarle al programa que no le pida al usuario introducir el elemento A[j][i] si ya ha introducido el A[i][j], pero prefiero que dé un error y pida introducir una matriz nueva.
Este es el algoritmo para que el usuario introduzca los elementos de la matriz.
No sé muy bien qué hace el #ifdef DEBUG, pero es lo que hay y no molesta.
Entonces mi plan es que haga que el usuario introduzca los elementos de la matriz y, si no cumple la condición del while, entonces vuelve a pedir que los introduzca.
La condición de que la matriz no sea simétrica (y por tanto vuelva a repetir el input) es:
Por tanto, utilizando la estructura do-while y según mi lógica, quedaría algo así:
Esto al compilador no le mola y me imagino que a la gente que entiende de C/C++ tampoco. ¿No puedo introducir un bucle en la condición del while? Porque claro, yo quiero que revise la condición para todos los elementos A[i][j].
Otra opción es decirle en el propio input que compruebe si el elemento A[j][i] es igual que el elemento A[i][j] para todos los elementos con j>i (porque si no, lo comprobaría con las primeras entradas y otras que aún no hemos introducido). Sin embargo, yo creo que esto es más sucio y complicado.
¡Muchas gracias!
El algoritmo no comprueba que el usuario está introduciendo una matriz simétrica, es decir, que coincide con su transpuesta (o lo que es lo mismo, que cada elemento A[i][j] es igual al elemento A[j][i]). No sé si me pedirán modificar esto, pero lo voy a hacer porque además me resultará más cómodo mañana saber si estoy metiendo matrices simétricas.
Una forma es especificarle al programa que no le pida al usuario introducir el elemento A[j][i] si ya ha introducido el A[i][j], pero prefiero que dé un error y pida introducir una matriz nueva.
Este es el algoritmo para que el usuario introduzca los elementos de la matriz.
Code: Select all
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("\nelemento [%d][%d]= ",i,j);
scanf("%f",&A[i][j]);
//#ifdef DEBUG
printf("%f \n",A[i][j]);
//#endif
}
}
No sé muy bien qué hace el #ifdef DEBUG, pero es lo que hay y no molesta.
Entonces mi plan es que haga que el usuario introduzca los elementos de la matriz y, si no cumple la condición del while, entonces vuelve a pedir que los introduzca.
La condición de que la matriz no sea simétrica (y por tanto vuelva a repetir el input) es:
Code: Select all
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
A[i][j]!=A[j][i];
}
}
Por tanto, utilizando la estructura do-while y según mi lógica, quedaría algo así:
Code: Select all
do
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("\nelemento [%d][%d]= ",i,j);
scanf("%f",&A[i][j]);
//#ifdef DEBUG
printf("%f \n",A[i][j]);
//#endif
}
}
}
while
(
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
A[i][j]!=A[j][i];
}
}
);
Esto al compilador no le mola y me imagino que a la gente que entiende de C/C++ tampoco. ¿No puedo introducir un bucle en la condición del while? Porque claro, yo quiero que revise la condición para todos los elementos A[i][j].
Otra opción es decirle en el propio input que compruebe si el elemento A[j][i] es igual que el elemento A[i][j] para todos los elementos con j>i (porque si no, lo comprobaría con las primeras entradas y otras que aún no hemos introducido). Sin embargo, yo creo que esto es más sucio y complicado.
¡Muchas gracias!