• Viernes 15 de Noviembre de 2024, 07:57

Autor Tema:  Dibujar un rombo con asteriscos con Lenguaje C  (Leído 12743 veces)

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Dibujar un rombo con asteriscos con Lenguaje C
« en: Martes 22 de Abril de 2014, 16:44 »
0
Hola a todos y que tengan un muy buen día.

Código: C
  1. #include <stdio.h>
  2.      
  3. int main (int argc,char **argv){
  4.      char *a[] = {"    *", "   ***", "  *****", " *******", "*********"};
  5.      int i=0, j=2;
  6.        
  7.      for(; i<9; i++){
  8.           if(i >= 0 && i <= 4){
  9.                printf("\n %s", a[i]);
  10.           }
  11.           else{
  12.                printf("\n %s", a[i-j]);
  13.                j+=2;
  14.           }
  15.      }
  16.      
  17.      printf("\n\n");
  18.      return 0;
  19. }

Bueno al fin lo logre, sin copiar a las muchas versiones que debe haber en internet, solo que me parece innecesarios los espacios que tuve que poner en el array de punteros “a”, supongo que debe haber otra manera.-
La consulta es, se puede introducir entre “%s” una variable entera para que quede de esta manera:
Int b = 7;
printf("\n %bs", a);
Me da error y no logro hacerlo de otra manera, cualquier sugerencia será bienvenida.-

Desde ya muchas gracias por el tiempo.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

chenech

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #1 en: Jueves 24 de Abril de 2014, 00:22 »
0
Hola, creo que la forma de ponerlo es:

Int b = 7;
printf("\n %i%s", b, a);

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #2 en: Jueves 24 de Abril de 2014, 19:33 »
0
Hola  chenech.
No obtengo el resultado esperado, parecería que no está contemplado en el prototipo de la función printf, de cualquier manera pude mejorar y de hecho optimizar mi código, sólo me falta hacerlo con el operador condicional (ternario), por el momento me falta un poco de práctica para lograrlo pero ya lo estoy intentando (si queréis darme una mano, te estaré muy agradecido).-   

Código: C
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.      int i=0, izq=5, der=5;
  5.      char ate[] = "          ";
  6.          
  7.      for(; i<10; i++){
  8.           if(i<5){
  9.                ate[izq] = '*';ate[der] = '*';
  10.                izq--;der++;
  11.           }
  12.           else{
  13.                izq++;der--;
  14.                ate[izq] = ' ';ate[der] = ' ';
  15.           }
  16.           printf("\n %s", ate);
  17.      }
  18.          
  19.      return 0;
  20. }

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

chenech

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #3 en: Jueves 24 de Abril de 2014, 19:39 »
0
El operador ternario funciona se puede usar normalmente en un if/else, de la siguiente forma:
Código: [Seleccionar]
in iValor, iResultado;
if(iValor == 0)
  iResultado = 1;
else
  iResultado = 0;
con el operador seria asi:
Código: [Seleccionar]
int iValor;
int iResultado = (iValor == 0) ? 1 : 0;
O sea, se pregunta por la condición y se asigna el primer valor o el segundo según sea cierta o no.
Los ceros y uno pueden ser perfectamente variables, lo he puesto asi para reducir código.
Un saludo.

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #4 en: Viernes 25 de Abril de 2014, 19:25 »
0
Hola  chenech
Muchas gracias por la ayuda, un solo favor más te voy a pedir, tan sólo decime si lo que quiero hacer (con el código de dejo a continuación) es factible, practique de todas maneras con paréntesis, punto y coma y nada, con solo saber que se puede hacer voy a seguir leyendo y practicando hasta lograrlo.-
   
Código: C
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.      int i=0, izq=5, der=5;
  5.      char ate[] = "          ";
  6.          
  7.      for(; i<10; i++){
  8.           (i<5) ? ate[izq] = '*' ate[der] = '*' izq-- der++ : izq++ der-- ate[izq] = ' ' ate[der] = ' ';
  9.      }
  10.      
  11.      getchar();
  12.        
  13.      return 0;
  14. }



Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

  • Nuevo Miembro
  • *
  • Mensajes: 8
  • Nacionalidad: es
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #5 en: Viernes 25 de Abril de 2014, 21:00 »
0
Hola  chenech
Muchas gracias por la ayuda, un solo favor más te voy a pedir, tan sólo decime si lo que quiero hacer (con el código de dejo a continuación) es factible, practique de todas maneras con paréntesis, punto y coma y nada, con solo saber que se puede hacer voy a seguir leyendo y practicando hasta lograrlo.-
...............................
Daniel

No soy chenech pero te ayudo igual.

Antes que nada ten en cuenta el uso de los pre y post incrementos ya que te aligeran el código, así como la igualación de dos variables:

Código: C++
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   int i=0, izq=5, der=5;
  5.   char ate[] = "          ";
  6.   for(; i<10; i++){
  7.     if(i<5)
  8.       ate[izq--] = ate[der++] = '*';
  9.     else
  10.       ate[++izq] =  ate[--der] = ' ';
  11.   printf("\n %s", ate);
  12.   }
  13.   return 0;
  14. }

Y respecto al operador ternario no te preocupes, es normal que al principio no te salga sobre todo con la cantidad de variables que incrementabas y post incrementabas por separado:

Código: C++
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   int i=0, izq=5, der=5;
  5.   char ate[] = "          ";
  6.   for(; i<10; i++){
  7.     (i<5) ? (ate[izq--] = ate[der++] = '*'):(ate[++izq] = ate[--der] = ' ');
  8.   printf("\n %s", ate);
  9.   }
  10.   return 0;
  11. }


¡¡¡¡ Saluditos! ..... !!!!


« última modificación: Viernes 25 de Abril de 2014, 21:44 por leosansan »

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #6 en: Viernes 25 de Abril de 2014, 21:56 »
0
Hola  leosansan
Maravilloso tú código ya estaba por desistir, tengo unas duditas para consultarte/consultarles.-

Si declaro la variable de esta manera funciona.
Código: C
  1. char ate[] = "          ";
Si la declaro de estas otras 2 no me imprime ningún asterisco.-
Código: C
  1. char ate[10] = "";
Código: C
  1. char ate[10] = {‘\0};
Me podrían dar alguna explicación.-

Otra cosita, según tengo entendido el signo igual tiene asociatividad por la derecha pero esto no lo entiendo.-

ate[izq--] = ate[der++] = '*';
 
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

  • Nuevo Miembro
  • *
  • Mensajes: 8
  • Nacionalidad: es
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #7 en: Sábado 26 de Abril de 2014, 15:18 »
0
Hola  leosansan
Maravilloso tú código ya estaba por desistir, tengo unas duditas para consultarte/consultarles.-

Si declaro la variable de esta manera funciona.
Código: C
  1. char ate[] = "          ";
Si la declaro de estas otras 2 no me imprime ningún asterisco.-
Código: C
  1. char ate[10] = "";
Código: C
  1. char ate[10] = {‘\0};
Me podrían dar alguna explicación.-
...............................

Estas llenando el array con nada, simplemente está vacío.

Tendrías que hacer algo como esto, y perdona que le halla cambiado el nombre al array:

Código: C++
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   int i, izq, der,n;
  5.   do{
  6.     printf("\nBase del rombo(numero impar positivo): \n");
  7.     scanf("%d", &n);
  8.     }while ( n <=0 || (n % 2) == 0);
  9.   izq = der =  --n/2;
  10.   char ch[n+1];
  11.   for(i=0; i<n; i++)
  12.     ch[i]=' ';
  13.   ch[i]='\0';
  14.   for(i=0; i<n; i++){
  15.     (i<n/2) ? (ch[izq--] = ch[der++] = '*'):(ch[++izq] = ch[--der] = ' ');
  16.   printf("\n %s", ch);
  17.   }
  18.   return 0;
  19. }

Hola  leosansan

.........................................................
Otra cosita, según tengo entendido el signo igual tiene asociatividad por la derecha pero esto no lo entiendo.-

ate[izq--] = ate[der++] = '*';
...............................

Te obsesiona la asociatividad pero en este caso no hay tal, simplemente hay una igualación de variables. :suerte:

¡¡¡¡ Saluditos! ..... !!!!



« última modificación: Sábado 26 de Abril de 2014, 15:20 por leosansan »

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #8 en: Sábado 26 de Abril de 2014, 20:50 »
0
Hola  leosansan
Muy bien entendí todo sólo que en mi compilador MinGW no me permite declarar las variables en cualquier lado, tiene que ser todas al principio de la función Main.-

Código: C
  1. .........
  2.   izq = der =  --n/2;
  3.   char ch[n+1];
  4.   for(i=0; i<n; i++)
  5. .........
  6.  

Saludos y gracias por tu tiempo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

  • Nuevo Miembro
  • *
  • Mensajes: 8
  • Nacionalidad: es
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #9 en: Domingo 27 de Abril de 2014, 07:39 »
0
Hola  leosansan
Muy bien entendí todo sólo que en mi compilador MinGW no me permite declarar las variables en cualquier lado, tiene que ser todas al principio de la función Main.-
.............................................

Yo también uso MinGW y lo único que lanza, estando en modo -Wall y -pedantic, es un warning, que no un error, porque no se ajusta al estándar  C90 ya superado, así que tu problema se arreglará actualizando tu versión del MinGW o bien la del compilador que usas. Yo usualmente uso el Code::Blocks, por supuesto.

Por cierto, he visto que algo fallaba, creo, en el anterior código así que te lo paso revisado por si acaso:

Código: C++
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   int i, izq, der,n;
  5.   do{
  6.     printf("\nBase del rombo(numero impar positivo): \n");
  7.     scanf("%d", &n);
  8.     }while ( n <=0 || (n % 2) == 0);
  9.   izq = der =  --n/2;
  10.   char ch[n+1];
  11.   for(i=0; i<n; i++)
  12.     ch[i]=' ';
  13.   ch[i]='\0';
  14.   for(i=0; i<n; i++){
  15.     (i<n/2) ? (ch[izq--] = ch[der++] = '*'):(ch[++izq] = ch[--der] = ' ');
  16.   printf("\n %s", ch);
  17.   }
  18.   return 0;
  19. }

¡¡¡¡ Saluditos! ..... !!!!


« última modificación: Domingo 27 de Abril de 2014, 07:41 por leosansan »

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #10 en: Domingo 27 de Abril de 2014, 19:58 »
0
Hola  leosansan
El caso es que al compilar me sigue dando error y no me deja crear el ejecutable, voy a actualizar el compilador.-



Saludos y gracias.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

  • Nuevo Miembro
  • *
  • Mensajes: 8
  • Nacionalidad: es
    • Ver Perfil
Re:Dibujar un rombo con asteriscos con Lenguaje C
« Respuesta #11 en: Lunes 28 de Abril de 2014, 20:07 »
0
Hola  leosansan
El caso es que al compilar me sigue dando error y no me deja crear el ejecutable, voy a actualizar el compilador.-
.............................
Saludos y gracias.
Daniel

Mientras tanto puedes declarar el array inicialmente sobredimensionado:

Código: C++
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.   int i, izq, der,n;
  5.   char ch[100];
  6.   do{
  7.     printf("\nBase del rombo(numero impar positivo): \n");
  8.     scanf("%d", &n);
  9.     }while ( n <=0 || (n % 2) == 0);
  10.   izq = der =  --n/2;
  11.  
  12.   for(i=0; i<n; i++)
  13.     ch[i]=' ';
  14.   ch[i]='\0';
  15.   for(i=0; i<n; i++){
  16.     (i<n/2) ? (ch[izq--] = ch[der++] = '*'):(ch[++izq] = ch[--der] = ' ');
  17.   printf("\n %s", ch);
  18.   }
  19.   return 0;
  20. }

Pero actualiza, es lo mejor.

¡¡¡¡ Saluditos! ..... !!!!