• Domingo 19 de Mayo de 2024, 23:28

Autor Tema:  Explicación de código  (Leído 3128 veces)

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Explicación de código
« en: Domingo 5 de Julio de 2009, 19:37 »
0
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
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(void)
  6. {
  7.    int i, j, filas ,columnas;
  8.    
  9.    printf("Introduzca el numero de filas: ");
  10.    fflush(stdout);
  11.    if (scanf("%d", &filas) != 1)
  12.       return EXIT_FAILURE;
  13.    
  14.    printf("Introduzca el numero de columnas: ");
  15.    fflush(stdout);
  16.    if (scanf("%d",&columnas) != 1)
  17.       return EXIT_FAILURE;
  18.    
  19.    for (i = 1; i <= filas; i++){
  20.       for(j = 1; j <= columnas ; j++)
  21.          if (i == 1 || i == filas || j == 1 || j == columnas)
  22.             printf("*");
  23.          else
  24.             printf(" ");
  25.      
  26.       printf("n");
  27.    }
  28.    
  29.    system ("PAUSE");
  30.    return 0;
  31. }
  32.  
  33.  
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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #1 en: Domingo 5 de Julio de 2009, 19:46 »
0
La clave esta en la condicion que decide que caracter usar con el printf (asterisco o espacio):

Código: C++
  1. if (i == 1 || i == filas || j == 1 || j == columnas)
  2.   printf("*");
  3. else
  4.   printf(" ");
  5.  
  6.  

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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #2 en: Domingo 5 de Julio de 2009, 21:09 »
0
A ver.. tenemos
Código: Text
  1.  
  2. for (i = 1; i <= filas; i++){
  3.       for(j = 1; j <= columnas ; j++)
  4.          if (i == 1 || i == filas || j == 1 || j == columnas)
  5.             printf("*");
  6.          else
  7.             printf(" ");
  8.      
  9.       printf("n");
  10.  
  11.  

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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #3 en: Domingo 5 de Julio de 2009, 21:54 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #4 en: Domingo 5 de Julio de 2009, 23:51 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #5 en: Domingo 5 de Julio de 2009, 23:59 »
0
La condicion es or para cada expresion de la misma y por lo tanto solo se evalua hasta encontrar una condicion que sea true, no tiene importancia si hay mas condiciones que fueran verdaderas. En cada iteracion del segundo for se imprime un solo caracter, o asterico o espacio.

Si con esto no lo logras y lo queres entender de verdad DEPURALO linea por linea observando lo que hace en cada iteracion.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #6 en: Lunes 6 de Julio de 2009, 00:19 »
0
vemos... 3 filas y 3 columnas para que hayan espacios en el medio

La condición es if (i == 1 || i == filas || j == 1 || j == columnas)


i=1 j=1     La primera condición del if es verdadera por lo que imprimimos asterisco y hacemos n

*

i=1 j=2     La primera condicion del if es verdadera por lo que imprimimos asterisco y hacemos n

*
*

i=1 j=3     La primera condicion del if es verdadera por lo que imprimimos asterisco y hacemos n

*
*
*

volvemos al primer for e incrementamos i a 2

i=2 j=1     La tercera condición se cumple, imprimimos asterisco y hacemos n

**
*
*

i=2 j=2     No se cumple ninguna condición, imprimimos espacio y hacemos n

**
*
*

i=2 j=3 Se cumple la cuarta condición, imprimimos asterisco y hacemos n

**
*
**

volvemos al primer for e incrementamos i a 3

i=3 j=1 Se cumple la segunda condición, imprimimos asterisco y hacemos n

***
*
**

i=3 j=2 Se cumple la segunda condición, imprimimos asterisco y hacemos n (recordemos que ya hay un espacio en la segunda posición)

***
* *
**

i=3 j=3 Se cumple la segunda condición, imprimimos asterisco y hacemos n

***
* *
***

Cuadrado de 3 filas y 3 columnas...está bien así???
Cita de: "Eternal Idol"
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
No tengo claro que esto sea así, ya que por ejemplo cuando i=1 durante las 3 primeras veces, todas las filas serían todo asteriscos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #7 en: Lunes 6 de Julio de 2009, 00:30 »
0
Te confundiste todo por el n que supongo no sabes que es un salto de linea (un enter), con la cantidad de n's que hubieran pasado segun lo que decis ese 3x3 ocuparia muchisimo mas de 3 lineas, en realidad el printf del n se ejecuta al final de cada fila y no al final de cada columna, sino no podrias volver a escribir en la misma linea ... printf escribe donde esta el cursor ...

3x3 es asi:
***n
* *n
***n

Cita de: "player_"
No tengo claro que esto sea así, ya que por ejemplo cuando i=1 durante las 3 primeras veces, todas las filas serían todo asteriscos.

Sino estas convencido depuralo y listo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #8 en: Lunes 6 de Julio de 2009, 01:22 »
0
Ok... entonces el printf("n"); se imprime cada vez que salimos del segundo for

La condición es if (i == 1 || i == filas || j == 1 || j == columnas)


i=1 j=1 La primera condición del if es verdadera por lo que imprimimos asterisco y seguimos en la misma línea

*

i=1 j=2 La primera condicion del if es verdadera por lo que imprimimos asterisco y seguimos en la misma línea

**


i=1 j=3 La primera condicion del if es verdadera por lo que imprimimos asterisco y hacemos n porque salimos del for

***

volvemos al primer for e incrementamos i a 2

i=2 j=1 La tercera condición se cumple, imprimimos asterisco y seguimos en la misma línea

***
*


i=2 j=2 No se cumple ninguna condición, imprimimos espacio y seguimos en la misma línea

***
*


i=2 j=3 Se cumple la cuarta condición, imprimimos asterisco y hacemos n porque salimos del for

***
* *


volvemos al primer for e incrementamos i a 3

i=3 j=1 Se cumple la segunda condición, imprimimos asterisco y seguimos en la misma línea

***
* *
*

i=3 j=2 Se cumple la segunda condición, imprimimos asterisco y seguimos en la misma línea

***
* *
**

i=3 j=3 Se cumple la segunda condición, imprimimos asterisco y hacemos n porque salimos del for

***
* *
***
3 filas y 3 columnas, ya está bien así no? Lo del n de antes lo puse así porque creía que se imprimía después de hacer cada condición pero ya veo que únicamente se imprime cuando salimos del for. Ok, si así ya me dices que está bien te agradezco mucho tu ayuda :good:
« última modificación: Lunes 6 de Julio de 2009, 09:47 por player_ »

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #9 en: Lunes 6 de Julio de 2009, 08:14 »
0
No lo lei todo, ni con mucha atencion, pero ahora si parece estar bien.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #10 en: Lunes 6 de Julio de 2009, 09:49 »
0
Bueno, entonces me fiaré de que está bien. Me puedes confirmar que el n sólo se hace cuando salimos del segundo for? Así ya creo que lo tengo bastante claro.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #11 en: Lunes 6 de Julio de 2009, 10:03 »
0
Si, el n es parte de cada iteracion del primer for (al igual que lo es el segundo), en cada iteracion del primer for se ejecuta el segundo for completo y se escribe el n.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Explicación de código
« Respuesta #12 en: Lunes 6 de Julio de 2009, 10:23 »
0
Gracias, por fin lo veo claramente.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Explicación de código
« Respuesta #13 en: Lunes 6 de Julio de 2009, 11:23 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.