elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Rombo con asteriscos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: [C] Rombo con asteriscos  (Leído 66,973 veces)
dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
[C] Rombo con asteriscos
« en: 1 Marzo 2014, 20:14 pm »

Buenas de nuevo, aqui os vengo otra vez con una duda, Esta vez he solucionado el problema que tengo pero de una manera poco ortodoxa ya que la segunda parte del problema la he ido rellenando por prueba y error.

Asi que no me quedo conforme con ello y os pido ayuda haber que es lo que se me escapa.

El problema es facil, imprimir un rombo tal como este

Código:
     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *

Aqui sale torcido, pero ya os haceis una idea xD.

Aqui el codigo que tengo, que funcionar funciona

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int a, n, n1;
  6. int contador = 1;
  7.  
  8. for (a = 5; a >= 1; a--){
  9. for (n = 0; n <= a; n++){
  10. printf(" ");
  11. }
  12. for (n1 = 1; n1 <= contador; n1++){
  13. printf("*");
  14. }
  15. printf("\n");                          /*Triangulo superior*/
  16. contador += 2;           /*Asta aqui dominado mas o menos :) */
  17. }
  18. for (a = 4; a >= 1; a--){      /*De aqui en adelante a sido una loteria :( */
  19. for (n = 6; n >= a; n--){        /*Triangulo inferior*/
  20. printf(" ");
  21. }
  22. for (n1 = 2; n1 <= contador-3; n1 ++){
  23. printf("*");
  24. }
  25. printf("\n");
  26. contador -= 2;
  27. }
  28. return 0;
  29.  
  30. }
  31.  
  32.  

Pero como os digo he tenido que ir rellenando esta linea
Código
  1. for (n1 = 2; n1 <= contador-3; n1 ++){

y esta otra

Código
  1. contador -= 2;

haciendo prueba y error asta ajustarlo, un metodo un poco guarro creo, ya que realmente no lo he dominado.

Bueno, pues eso, si alguien me orienta en donde pierdo el control, se lo agradeceria.

Un saludo


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #1 en: 2 Marzo 2014, 18:36 pm »



Sin más comentarios que los que te pongo en el código:

Código
  1. #include<stdio.h>
  2. int main()
  3. {
  4.  int n,i,j;
  5.  printf("\nTama\xA4o de la mitad superior: \n");
  6.  scanf ("%d",&n);
  7.  printf("\n\n");
  8.  for(i=1;i<=n;i++){  /** fijate que aqui i aumenta **/
  9.    printf("\t\t");
  10.    for(j=1;j<=n-i;j++)/** cada vez un espacio menos **/
  11.        printf(" ");
  12.    for(j=1;j<=2*i-1;j++)/** cada vez dos "*" mas **/
  13.      printf("*");     /** despues de los espacios **/
  14.  printf("\n");
  15.  }
  16.  
  17.  for(i=n-1;i>=1;i--){  /** fijate que aqui i disminuye **/
  18.    printf("\t\t");
  19.    for(j=1;j<=n-i;j++)/** cada vez un espacio mas **/
  20.      printf(" ");
  21.    for(j=1;j<=2*i-1;j++)/** cada vez dos "*" menos **/
  22.      printf("*");     /** despues de los espacios **/
  23.  printf("\n");
  24.  }
  25.  return 0;
  26. }
  27.  

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






En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #2 en: 2 Marzo 2014, 18:59 pm »

Para imprimir las secuencias de espacios y asteriscos se puede desarrollar una función, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LADO  5
  5.  
  6. void repetir(int reps, char ch);
  7.  
  8. int main(void)
  9. {
  10.   int i;
  11.  
  12.   for (i = 1; i < LADO * 2; i += 2){ /* 1, 3, 5, 7, 9 */
  13.      repetir((LADO - 1) - i/2, ' ');
  14.      repetir(i, '*');
  15.      putchar('\n');
  16.   }
  17.  
  18.   for (i -= 4; i > 0; i -= 2){ /* 7, 5, 3, 1 */
  19.      repetir((LADO - 1) - i/2, ' ');
  20.      repetir(i, '*');
  21.      putchar('\n');
  22.   }
  23.  
  24.   return EXIT_SUCCESS;
  25. }
  26.  
  27. void repetir(int reps, char ch)
  28. {
  29.   int i;
  30.  
  31.   for (i = 0; i < reps; i++)
  32.      putchar(ch);
  33. }

Otra forma de imprimir ese rombo en particular es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char ch[] = "*********";
  7.   int i;
  8.  
  9.   for (i = -4; i < 5; i++)
  10.      printf("%*c%.*s\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }

La primera es clara y flexible, la segunda es breve y esta bien para practicar con la biblioteca estándar de C pero es muy limitada (eso es evidente si se trata de modificar para el manejo de casos generales).

----

Editado: una forma ligeramente mas corta donde se evita imprimir si o si un espacio:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char ch[] = "*********";
  7.   int i;
  8.  
  9.   for (i = -4; i < 5; i++)
  10.      printf("%*.*s\n", 9 - abs(i), 1 + (4 - abs(i)) * 2, ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }

Un saludo
« Última modificación: 3 Marzo 2014, 17:41 pm por rir3760 » En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #3 en: 2 Marzo 2014, 20:02 pm »

Siguiendo los pasos del "maestro==rir3760" por usar funciones que no quede:

Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.  int i,n;
  7.  printf("\n\n");
  8.  printf("\nTama\xA4o de la mitad superior: \n");
  9.  scanf ("%d",&n);
  10.  
  11.  for(i=1;i<=n;i++)
  12.    repetir (n-i,' ',2*i-1,'*');
  13.  for(i=n-1;i>=1;i--)
  14.    repetir (n-i,' ',2*i-1,'*');
  15.  return EXIT_SUCCESS;
  16. }
  17.  
  18. void repetir(int reps, char ch,int reps1, char ch1)
  19. {
  20.  int j,k;
  21.  printf("\t\t");
  22.  for (j = 1; j <=reps; j++)
  23.    putchar(ch);
  24.  for (k = 1; k <=reps1; k++)
  25.    putchar(ch1);
  26.  putchar('\n');
  27. }
  28.  

Ante el "otro" código, el del printf, tan solo mirar boquiabierto y, como siempre, aprender de sus aportaciones, todo un lujo para el foro.

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



« Última modificación: 6 Marzo 2014, 22:23 pm por leosansan » En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #4 en: 2 Marzo 2014, 20:03 pm »

la segunda es breve y esta bien para practicar con la biblioteca estándar de C pero es muy limitada (eso es evidente si se trata de modificar para el manejo de casos generales).

Solo breve?  :o  :rolleyes:
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: [C] Rombo con asteriscos
« Respuesta #5 en: 3 Marzo 2014, 00:13 am »

Gracias a todos por responder, aun no llegue al tema de las funciones, pero en un par de dias llego.

Veo que me hago aún un lio con estas cosas, espero que con la practica vaya mejorando.

Con lo que me habeis puesto ya tengo trabajo donde comparar y aprender.

rir3760 si  que lo hicistes escueto, casi fugaz diria yo xD


Un saludo
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [C] Rombo con asteriscos
« Respuesta #6 en: 5 Marzo 2014, 21:23 pm »

Buenos días, lamento llegar un poco tarde, tampoco ser entrometido (como me acusaron en otro post  >:()

Inspirándome un poco en el enfoque de rir7360 que "centró" el rombo, es decir tomó los índices de -N a N, en lugar de 0 a 2*N, quiero aportar una función que dibuja un rombo general con cualquier número de líneas (impar positivo) dado.

El main() pide al usuario la cantidad de líneas del rombo, pero esto esta interfaz se puede modificar. Lo importante es el código de la función rombo() que gracias al enfoque de "centrar" los valores no requiere dividir entre la parte de arriba y la parte de abajo, ni entre derecha e izquierda, jeje.

Resultado, con 9 líneas:

    *   
   ***   
  ***** 
 *******
*********
 *******
  ***** 
   ***   
    *   


Básicamente lo que hacemos es calcular el "punto medio" p de N (redondeo por exceso de N/2), para el caso N=9 sería p=5. Luego recorremos tanto i como j desde -p+1 hasta p-1, o sea, desde -4 hasta 4. El asterisco se imprime si abs(j) < p - abs(i), y esto dibuja el rombo de manera correcta, tanto en su parte superior como la inferior. El código:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void rombo (int N);
  5.  
  6. int main(void) {
  7.  
  8. int N;
  9.  
  10. printf("Ancho del rombo: ");
  11. scanf("%d", &N);
  12.  
  13. /* limpia la entrada estandar por caracteres no leidos */
  14. while ( getchar() != '\n' )
  15. ;
  16.  
  17. /* comprueba N impar y positivo */
  18. if ( N > 0 && (N % 2) == 1)
  19. rombo( N );
  20. else
  21. printf("N debe ser impar positivo\n");
  22.  
  23. return 0;
  24. }
  25.  
  26. /* Imprime un rombo de N lineas */
  27. void rombo (int N) {
  28.  
  29. int i, j, p;
  30.  
  31. p = (int) N / 2 + 1; /* punto medio ente 1 y N */
  32. for (i = -p + 1; i <= p - 1; i++) {
  33. for (j = -p + 1; j <= p - 1; j++)
  34. if ( abs(j) < p - abs(i) )
  35. putchar('*');
  36. else
  37. putchar(' ');
  38. putchar('\n');
  39. }
  40. }
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #7 en: 6 Marzo 2014, 02:43 am »

¡¡¡El mío es más grande!!!


Es de cachondeo.

Pero el uso de una cadena por parte de rir3760 me ha hecho pensar una forma alternativa:parto de una cadena con un solo  asterisco en medio y a medida que bajo añado dos asteriscos por escalón, mientras en la parte inferior los voy quitando. Curioso, ¿verdad?:


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

O con un solo for:

Código
  1. #include <stdio.h>
  2. int main(void){
  3.  int i,j,n,p;
  4.  do{
  5.    printf("\nBase del rombo(numero impar): \n");
  6.    scanf("%d", &n);
  7.  }while ( n <=0 || (n % 2) == 0);
  8.  char asteriscos[n];
  9.  for (i=0;i<n;i++)
  10.    asteriscos[i]=' ';
  11.  asteriscos[i]='\0';
  12.  p=n/2;
  13.  asteriscos[p]='*';
  14.  for (i=-p;i<=p;i++){
  15.    if (i<=0){
  16.      printf ("\t\t%s\n",asteriscos);
  17.      if (i<0)
  18.      asteriscos[-i-1]=asteriscos[n+i]='*';
  19.    }
  20.    else{
  21.      j=-i;
  22.      asteriscos[-j-1]=asteriscos[n+j]=' ';
  23.      printf ("\t\t%s\n",asteriscos);
  24.    }
  25.  }
  26.  return 0;
  27. }

Aunque nada supera al printf de rir3760.

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






« Última modificación: 6 Marzo 2014, 08:49 am por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Rombo con asteriscos
« Respuesta #8 en: 6 Marzo 2014, 04:43 am »

Básicamente lo que hacemos es calcular el "punto medio" p de N (redondeo por exceso de N/2), para el caso N=9 sería p=5. Luego recorremos tanto i como j desde -p+1 hasta p-1, o sea, desde -4 hasta 4. El asterisco se imprime si abs(j) < p - abs(i), y esto dibuja el rombo de manera correcta, tanto en su parte superior como la inferior.
Solo un comentario: no es necesario imprimir los espacios al final de cada linea, por cada una basta con los primeros "N - abs(i)" caracteres.

La función con esa y otras modificaciones (todas ellas menores):
Código
  1. void rombo(int N)
  2. {
  3.   int i;
  4.   int j;
  5.  
  6.   for (i = -N/2; i <= N/2; i++){
  7.      for (j = 0; j < N - abs(i); j++)
  8.         putchar(j < abs(i) ? ' ' : '*');
  9.  
  10.      putchar('\n');
  11.   }
  12. }

----

Ya por ultimo la biblioteca estándar de C no incluye una función que permita imprimir N veces un determinado carácter. Las únicas dos excepciones (forzadas, por supuesto) son el espacio y el cero. Un ejemplo de ello es otra versión (mas) del bendito rombo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int i;
  7.  
  8.   for (i = -4; i < 5; i++)
  9.      printf("%*c%0*d\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, 0);
  10.  
  11.   return EXIT_SUCCESS;
  12. }

Produciendo la salida:
Código:
     0
    000
   00000
  0000000
 000000000
  0000000
   00000
    000
     0

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [C] Rombo con asteriscos
« Respuesta #9 en: 6 Marzo 2014, 16:37 pm »

Bueno ..... creo que ya hemos dado una tremenda cantidad de opciones al autor del post sobre cómo resolver su problema.

Lástima que él no haya seguido escribiendo, y al final terminamos agarrándonos el tema para nosotros, jeje  :laugh:

En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mini Reto Python. Dibujar rombo ~ « 1 2 »
Ejercicios
Dnk! 14 28,904 Último mensaje 6 Marzo 2013, 09:59 am
por santiasecas
Imprimir un patron de asteriscos
Programación C/C++
dmacias 5 6,316 Último mensaje 2 Febrero 2014, 18:35 pm
por dmacias
[C] Ayuda para cerrar mi rombo
Programación C/C++
izazaga 1 2,028 Último mensaje 29 Septiembre 2015, 20:34 pm
por ivancea96
Crear rombo de asteriscos en javascript
Desarrollo Web
LuisCardenas123 3 8,577 Último mensaje 4 Noviembre 2019, 09:41 am
por Agente Naranja
¿Cómo funciona el color del rombo?
Sugerencias y dudas sobre el Foro
Tachikomaia 5 7,359 Último mensaje 17 Noviembre 2020, 14:43 pm
por Danielㅤ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines