Programación General > C/C++
Explicación de código
player_:
Alguien por favor me puede explicar por qué este código imprime el cuadrado con asteriscos y lo de dentro está vacío?
--- Código: Text --- #include <stdio.h>#include <stdlib.h> int main(void){ int i, j, filas ,columnas; printf("Introduzca el numero de filas: "); fflush(stdout); if (scanf("%d", &filas) != 1) return EXIT_FAILURE; printf("Introduzca el numero de columnas: "); fflush(stdout); if (scanf("%d",&columnas) != 1) return EXIT_FAILURE; for (i = 1; i <= filas; i++){ for(j = 1; j <= columnas ; j++) if (i == 1 || i == filas || j == 1 || j == columnas) printf("*"); else printf(" "); printf("n"); } system ("PAUSE"); return 0;} He encontrado el código por internet y no consigo comprender el funcionamiento de los 2 for seguidos. No veo por qué el for hace que en la primera fila todo sean asteriscos, en las siguientes solo haya asteriscos en los laterales del cuadrado y lo de dentro esté vacío y en la ultima fila vuelva a aparecer toda la fila con asteriscos. Tampoco comprendo por qué filas pone asteriscos en filas y columnas pone asteriscos en columnas. Se agradecería una explicación del funcionamiento de estos 2 for juntos por pasos con algún ejemplo práctico que aclare la situación. Gracias!!!
Eternal Idol:
La clave esta en la condicion que decide que caracter usar con el printf (asterisco o espacio):
--- Código: C++ ---if (i == 1 || i == filas || j == 1 || j == columnas) printf("*");else printf(" ");
A grosso modo dice esto:
si i es 1 o si i es el numero de filas o si j es 1 o si j es el numero de columnas entonces usamos asterisco con printf, sino usamos espacio.
Si te fijas en el primer for este usa la variable i como contador y es la primera condicion del if. Por eso la primera fila es todo asteriscos. Los laterales se corresponden a la tercera y cuarta condicion, cuando j variable contador del segundo for sea 1 (lateral izquierdo) o sea igual al numero de columnas (lateral derecho) usara el asterisco para el printf. Finalmente para la ultima fila la segunda condicion determina que tambien sean todos asteriscos los usados con printf al ser la variable i igual al numero de filas. Si no se cumple ninguna de esas condiciones (|| es or) entonces se imprime el espacio.
player_:
A ver.. tenemos
--- Código: Text --- for (i = 1; i <= filas; i++){ for(j = 1; j <= columnas ; j++) if (i == 1 || i == filas || j == 1 || j == columnas) printf("*"); else printf(" "); printf("n");
Supongamos que el número de filas es 4 y el número de columnas 6.
Primero se entra en el primer for y tenemos ( i=1; 1<= 4; 1++)
Después se entra en el segundo for y tenemos (j=1; 1<=6;1++)
de ahí se evalúan las 2 primeras condiciones, si i==1 ó j==1 se imprime * sino se imprime espacio, si j==1 ó j==6 se imprime * sino se imprime espacio
entonces en este primer turno como i==1 y j==1, se imprimen los asteriscos y hace salto de línea. El contador ahora vale 2 al incrementarse
******
Por segunda vez se vuelve a entrar al for y tenemos (i=2; 2<=4; 2++)
Seguidamente se entra en el segundo for y tenemos (j=2; 2<=6;2++)
como ahora no se cumple ninguna condición, no se imprime ningún asterisco, se ponen todo espacios y se haría salto de línea
******
Tercera vez
Por tercera vez se vuelve a entrar al for y tenemos (i=3; 3<=4; 3++)
Seguidamente se entra en el segundo for y tenemos (j=3; 3<=6;3++)
no se cumple ninguna condición y no se imprime nada, se hace salto de línea
******
Por cuarta vez se vuelve a entrar al for y tenemos (i=4; 4<=4; 4++)
Seguidamente se entra en el segundo for y tenemos (j=4; 4<=6;4++)
Ahora se cumple para el primer for que i == filas entonces se imprime 1 asterisco y para j no se cumple ninguna condición
******
*
Y ahora que pasa hasta que j<=6?
Ya sé que los pasos no los hace así, pero siguiendo los for paso a paso es como yo lo entiendo y lo estoy entendiendo mal. No me lo podéis explicar paso a paso como he hecho yo para ver como se va formando el cuadrado a medida que va pasando por los for y la condición if?
Eternal Idol:
filas 2, columnas 3:
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
Si lo depuras lo veras mas facilmente.
player_:
Si se cumplen 2 condiciones del if, se imprimen 2 asteriscos o sólo 1? Creo que sólo 1...Ya entiendo la estructura de los 2 for pero al intentar hacerlo manualmente no me salen los asteriscos cerrando el cuadrado, me faltan los laterales de la derecha.
Y otra cosa, si primero i==1 se imprime un asterisco y si despueés i==2 y concide con el número de filas se vuelve a imprimir asterisco? Si es así me salen más asteriscos de los que deben formar un cuadrado....me rindo, lo dejo por imposible.
Navegación
[#] Página Siguiente
Ir a la versión completa