Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dmacias en 1 Marzo 2014, 20:14 pm



Título: [C] Rombo con asteriscos
Publicado por: dmacias 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


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 2 Marzo 2014, 18:36 pm

(http://i1280.photobucket.com/albums/a497/leosansan/rombo_zps5b75ca99.jpg)

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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: [C] Rombo con asteriscos
Publicado por: rir3760 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


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan 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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [C] Rombo con asteriscos
Publicado por: MeCraniDOS 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:


Título: Re: [C] Rombo con asteriscos
Publicado por: dmacias 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


Título: Re: [C] Rombo con asteriscos
Publicado por: Yoel Alejandro 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. }


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 6 Marzo 2014, 02:43 am
¡¡¡El mío es más grande!!!

(http://i1280.photobucket.com/albums/a497/leosansan/romboleosan_zps96d68359.jpg)

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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)






Título: Re: [C] Rombo con asteriscos
Publicado por: rir3760 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


Título: Re: [C] Rombo con asteriscos
Publicado por: Yoel Alejandro 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:



Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 6 Marzo 2014, 22:21 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:



Me quedó un mal regusto al tener que usar un array en la última versión, así que ahí va una sin un array de caracteres:

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

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: [C] Rombo con asteriscos
Publicado por: do-while en 7 Marzo 2014, 01:09 am
¡Buenas!

Como aun no había ninguna solución recursiva, aquí os dejo una  ;D
Código
  1. #include <stdio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. /* n == numero total de filas del rombo (no puede ser par) y el segundo parametro siempre es cero:
  6.    ejemplos: rombo(3,0);
  7.              rombo(11,0);
  8. */
  9. void rombo(int n,int paso)
  10. {
  11.    char *str = malloc(n / 2 + paso + 4);
  12.  
  13.    if(!(n & 1))
  14.        return;
  15.  
  16.    memset(str,' ',n / 2 - paso + 1);
  17.    memset(str + n / 2 - paso + 1 , '*' , 2 * paso + 1);
  18.    memcpy(str + n / 2 + paso + 2 ,"\n\0",2);
  19.  
  20.    printf("%s",str);
  21.  
  22.    if(paso == n / 2)
  23.    {
  24.        free(str);
  25.        return;
  26.    }
  27.  
  28.    rombo(n,paso+1);
  29.  
  30.    printf("%s",str);
  31.  
  32.    free(str);
  33. }
  34.  
  35. int main(int argc, char *argv[])
  36. {
  37.    rombo(5,0);
  38.    rombo(4,0);
  39.    return 0;
  40. }
  41.  


Título: Re: [C] Rombo con asteriscos
Publicado por: rir3760 en 7 Marzo 2014, 03:53 am
Otra solución recursiva pero forzada (ya que parte de la información se codifica en la cadena a imprimir) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void f(char *ch);
  5.  
  6. int main(void)
  7. {
  8.   char ch[] = "    *\0*******";
  9.  
  10.   f(ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }
  14.  
  15. void f(char *ch)
  16. {
  17.   int i = printf("%s\n", ch) - 1;
  18.  
  19.   if (*ch == ' '){
  20.      ch[i] = '*';
  21.      ch[i + 2] = '\0';
  22.      f(ch + 1);
  23.  
  24.      printf("%.*s\n", i, ch);
  25.   }
  26. }

Un saludo


Título: Re: [C] Rombo con asteriscos
Publicado por: eferion en 7 Marzo 2014, 09:48 am
Venga va, yo también aporto un código con recursividad.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void paso( int max_filas, int fila, int col );
  5.  
  6. int main()
  7. {
  8.  paso( 11, 0, 0 );
  9.  return EXIT_SUCCESS;
  10. }
  11.  
  12. void paso( int max_filas, int fila, int col )
  13. {
  14.  const char* chars = " *";
  15.  if( fila < max_filas )
  16.  {
  17.    int num_sp = abs( max_filas/2 - fila);
  18.    int end = max_filas - num_sp;
  19.    if ( col == end )
  20.    {
  21.      printf( "\n" );
  22.      col = -1;
  23.      fila++;
  24.    }
  25.    else
  26.      printf( "%c", chars[ col >= num_sp ] );
  27.  
  28.    paso( max_filas, fila, ++col );
  29.  }
  30. }


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 7 Marzo 2014, 18:56 pm
Sin arrays, sólo printf y un par de for menos que antes:

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

Y por qué no dibujar el rombo "vacio":

(http://i1280.photobucket.com/albums/a497/leosansan/romboleosanvacio_zps94595f82.jpg)

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

Y para que no falte, uno con recursividad:

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

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] Rombo con asteriscos
Publicado por: dmacias en 7 Marzo 2014, 22:57 pm
Vaya, si que os entreteneis con esto jajajajaja.
He estado liado, de trabajo asta las cejas asi que llevo unos dias parado con los estudios, pero en unos dias me pongo a ello de nuevo.

De todo lo que habeis puesto, de la mayoria hay cosas que no entiendo, soy muy nuevo y solo llevo 4 temas del libro vistos, pero de todos modos les hechare un vistazo.

Gracias a todos por ponerme tantos ejemplos, asi tengo donde elegir y comparar las logicas de cada uno.

Un saludo


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 8 Marzo 2014, 15:50 pm

Vaya, si que os entreteneis con esto jajajajaja.
...............................................................

Gracias a todos por ponerme tantos ejemplos, asi tengo donde elegir y comparar las lógicas de cada uno.

Un saludo

Pues si que ha sido entretenido.

Y aunque do-while me lo piso, no me resisto a poner el caso con memset. Es ligeramente diferente al suyo ya que no uso recurrencia y es ligeramente más cortito:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void){
  6.  int i,j,a;
  7.  do{
  8.    printf("\nBase del rombo(numero impar positivo): \n");
  9.    scanf("%d",&a);
  10.    }while ( a <=0 || (a % 2) == 0);
  11.  char *str = malloc(2*a+1);
  12.  for (i = -a/2; i <= a/2; i++){
  13.    j=i;
  14.  if (i>0)
  15.    j=-i;
  16.    memset (str,' ',(a/2)-j);/** relleno izquierda con espacios **/
  17.    memset (str+(a/2)-j, '*',2*((a/2)+j)+1); /** relleno derecha con asteriscos **/
  18.    printf ("%s\n",str);
  19.    memset (str,0,2*a+1);/** hago nula la cadena para volver a usarla **/
  20.  }
  21.  free(str);
  22.  return EXIT_SUCCESS;
  23. }

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [C] Rombo con asteriscos
Publicado por: do-while en 8 Marzo 2014, 16:58 pm
Otra forma mas. Esta considerando la pantalla una matriz de 20X80 caracteres y dibujando así sobre la matriz el rombo.
Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define MAX_FILAS 20
  7. #define MAX_COLUMNAS 80
  8.  
  9. void dibujar_borde(char pantalla[][MAX_COLUMNAS],int n_filas)
  10. {
  11.    int i;
  12.  
  13.    for(i = 0 ; i < n_filas ; i++)
  14.        pantalla[i][abs(n_filas / 2 - i)] = pantalla[i][n_filas - abs(n_filas / 2 - i) - 1] = '*';
  15. }
  16.  
  17. void rellenar(char pantalla[][MAX_COLUMNAS], int fila, int columna)
  18. {
  19.    if(pantalla[fila][columna] == '*' || fila < 0 || fila >= MAX_FILAS || columna < 0 || columna >= MAX_COLUMNAS)
  20.        return;
  21.  
  22.    pantalla[fila][columna] = '*';
  23.  
  24.    rellenar(pantalla, fila - 1, columna);
  25.    rellenar(pantalla, fila + 1, columna);
  26.    rellenar(pantalla, fila, columna - 1);
  27.    rellenar(pantalla, fila, columna + 1);
  28. }
  29.  
  30. void imprimir(char pantalla[][MAX_COLUMNAS])
  31. {
  32.    int i;
  33.  
  34.    for(i = 0 ; i < MAX_FILAS ; i++)
  35.        printf("%.*s\n",MAX_COLUMNAS - 1 , pantalla[i]);
  36. }
  37.  
  38. void rombo_2(int n_filas)
  39. {
  40.    char pantalla[MAX_FILAS][MAX_COLUMNAS];
  41.    int i;
  42.  
  43.    if(!(n_filas & 1))
  44.        return;
  45.  
  46.    for(i = 0 ; i < MAX_FILAS ; i++)
  47.        memset(pantalla[i],' ',MAX_COLUMNAS);
  48.  
  49.    dibujar_borde(pantalla,n_filas);
  50.    rellenar(pantalla , n_filas / 2 , n_filas / 2);
  51.    imprimir(pantalla);
  52. }
  53.  
  54. int main(int argc, char *argv[])
  55. {
  56.    rombo_2(11);
  57.  
  58.    return 0;
  59. }
  60.  

No es tan corta como las otras pero bueno, primero dibuja el perimetro y luego rellena el interior. Si rellenais el exterior tendreis el dibujo en "negativo".

¡Saludos!

Y ahora complicandolo un poco mas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_FILAS 20
  6. #define MAX_COLUMNAS 80
  7.  
  8. int correcto(int fila,int columna)
  9. {
  10.    return fila >= 0 && fila < MAX_FILAS && columna >=0 && columna < MAX_COLUMNAS;
  11. }
  12.  
  13. void dibujar_borde(char pantalla[][MAX_COLUMNAS],int n_filas , int fila_centro, int columna_centro)
  14. {
  15.    int i;
  16.  
  17.    for(i = 0 ; i < n_filas ; i++)
  18.    {
  19.        if(correcto(fila_centro - n_filas / 2 + i , columna_centro - n_filas / 2 + abs(n_filas / 2 - i)))
  20.            pantalla[fila_centro - n_filas / 2 + i][columna_centro - n_filas / 2 + abs(n_filas / 2 - i)] = '*';
  21.  
  22.        if(correcto(fila_centro - n_filas / 2 + i , columna_centro + n_filas / 2 - abs(n_filas / 2 - i)))
  23.            pantalla[fila_centro - n_filas / 2 + i][columna_centro + n_filas / 2 - abs(n_filas / 2 - i)] = '*';
  24.    }
  25. }
  26.  
  27. void rellenar(char pantalla[][MAX_COLUMNAS], int fila, int columna)
  28. {
  29.    if(pantalla[fila][columna] == '*' || fila < 0 || fila >= MAX_FILAS || columna < 0 || columna > MAX_COLUMNAS)
  30.        return;
  31.  
  32.    pantalla[fila][columna] = '*';
  33.  
  34.    rellenar(pantalla, fila - 1, columna);
  35.    rellenar(pantalla, fila + 1, columna);
  36.    rellenar(pantalla, fila, columna - 1);
  37.    rellenar(pantalla, fila, columna + 1);
  38. }
  39.  
  40. void imprimir(char pantalla[][MAX_COLUMNAS])
  41. {
  42.    int i;
  43.  
  44.    for(i = 0 ; i < MAX_FILAS ; i++)
  45.        printf("%.*s\n",MAX_COLUMNAS - 1 , pantalla[i]);
  46. }
  47.  
  48. void rombo_3(char pantalla[][MAX_COLUMNAS], int n_filas, int fila_centro, int columna_centro)
  49. {
  50.    int i;
  51.  
  52.    if(!(n_filas & 1))
  53.        return;
  54.  
  55.    dibujar_borde(pantalla , n_filas, fila_centro , columna_centro);
  56.    rellenar(pantalla , fila_centro, columna_centro);
  57. }
  58.  
  59. int main(int argc, char *argv[])
  60. {
  61.    char pantalla[MAX_FILAS][MAX_COLUMNAS];
  62.    int i;
  63.    char cad[] = "QUEDA BONITO";
  64.  
  65.    for(i = 0 ; i < MAX_FILAS ; i++)
  66.        memset(pantalla[i],' ',MAX_COLUMNAS);
  67.  
  68.    rombo_3(pantalla, 11 , 10, 11/2);
  69.    rombo_3(pantalla, 17 , 10 , 11 + 17/2);
  70.    rombo_3(pantalla, 19 , 10 , 28 + 19 / 2);
  71.  
  72.    for(i = 0 ; cad[i] ; i++)
  73.        pantalla[5 + i][50] = cad[i];
  74.  
  75.    imprimir(pantalla);
  76. }
  77.  

¡Saludos!

Y en esta tercera versión, podéis jugar con los caracteres que forman el borde y los rellenos.
Código
  1.  
  2.  
  3. int correcto(int fila,int columna)
  4. {
  5.    return fila >= 0 && fila < MAX_FILAS && columna >=0 && columna < MAX_COLUMNAS;
  6. }
  7.  
  8. void dibujar_borde(char pantalla[][MAX_COLUMNAS],int n_filas , int fila_centro, int columna_centro,char ch)
  9. {
  10.    int i;
  11.  
  12.    for(i = 0 ; i < n_filas ; i++)
  13.    {
  14.        if(correcto(fila_centro - n_filas / 2 + i , columna_centro - n_filas / 2 + abs(n_filas / 2 - i)))
  15.            pantalla[fila_centro - n_filas / 2 + i][columna_centro - n_filas / 2 + abs(n_filas / 2 - i)] = ch;
  16.  
  17.        if(correcto(fila_centro - n_filas / 2 + i , columna_centro + n_filas / 2 - abs(n_filas / 2 - i)))
  18.            pantalla[fila_centro - n_filas / 2 + i][columna_centro + n_filas / 2 - abs(n_filas / 2 - i)] = ch;
  19.    }
  20. }
  21.  
  22. void rellenar(char pantalla[][MAX_COLUMNAS], int fila, int columna, char relleno)
  23. {
  24.    char actual;
  25.  
  26.    if(!correcto(fila,columna))
  27.        return;
  28.  
  29.    actual = pantalla[fila][columna];
  30.  
  31.    if(relleno == actual)
  32.        return;
  33.  
  34.    pantalla[fila][columna] = relleno;
  35.  
  36.    if(correcto(fila - 1,columna) && actual == pantalla[fila - 1][columna])
  37.        rellenar(pantalla, fila - 1, columna,relleno);
  38.  
  39.    if(correcto(fila + 1,columna) && actual == pantalla[fila + 1][columna])
  40.        rellenar(pantalla, fila + 1, columna,relleno);
  41.  
  42.    if(correcto(fila,columna + 1) && actual == pantalla[fila][columna + 1])
  43.        rellenar(pantalla, fila, columna + 1,relleno);
  44.  
  45.    if(correcto(fila,columna - 1) && actual == pantalla[fila][columna - 1])
  46.        rellenar(pantalla, fila, columna - 1,relleno);
  47.  
  48.    pantalla[fila][columna] = relleno;
  49. }
  50.  
  51. void imprimir(char pantalla[][MAX_COLUMNAS])
  52. {
  53.    int i;
  54.  
  55.    for(i = 0 ; i < MAX_FILAS ; i++)
  56.        printf("%.*s\n",MAX_COLUMNAS - 1 , pantalla[i]);
  57. }
  58.  
  59. int main(int argc, char *argv[])
  60. {
  61.    char pantalla[MAX_FILAS][MAX_COLUMNAS];
  62.    int i;
  63.    char cad[] = "QUEDA BONITO",interior = '*', exterior = ' ';
  64.  
  65.    for(i = 0 ; i < MAX_FILAS ; i++)
  66.        memset(pantalla[i],' ',MAX_COLUMNAS);
  67.  
  68.    dibujar_borde(pantalla, 11 , 10, 11/2 , interior);
  69.    rellenar(pantalla,10,11/2,interior);
  70.  
  71.    dibujar_borde(pantalla, 17 , 10, 10 + 17/2, interior);
  72.    rellenar(pantalla, 10 , 10 + 17 / 2, interior);
  73.  
  74.    dibujar_borde(pantalla, 11 , 10, 26 + 11 / 2, interior);
  75.    rellenar(pantalla, 10 , 26 + 11 / 2 , interior);
  76.  
  77.    rellenar(pantalla,0,0,exterior);
  78.  
  79.    for(i = 0 ; cad[i] ; i++)
  80.        pantalla[5 + i][50] = cad[i];
  81.  
  82.    imprimir(pantalla);
  83.  
  84.    return 0;
  85. }
  86.  

¡Saludos de nuevo!


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 9 Marzo 2014, 08:04 am

Vamos, con matrices.

Ahí va una con el borde:


(http://i1280.photobucket.com/albums/a497/leosansan/romboleosanvacioconnombre_zps0e4513a4.jpg)

Código
  1. /** BORDES **/
  2. #include <stdio.h>
  3.  
  4. int main(){
  5.  int i=0,j,k=1,a=21;
  6.  
  7.  /*do{
  8.     printf("\nBase del rombo(numero impar positivo): \n");
  9.     scanf("%d",&a);
  10.     }while ( a <=0 || (a % 2) == 0);*/
  11.    char A[a+4][a+4],cad[]="L E O S A N S A N";
  12.    for ( i=0;i<=a+4;i++)
  13.      for ( j=0;j<=a+4;j++)
  14.        A[i][j]='0';
  15.    A[0][a/2]='*';
  16.    i=1;
  17.    while (i<=a/2){
  18.      A[i][(a/2)-i]=A[i][i+(a/2)]='*';
  19.      i++;
  20.    }
  21.    k=i;
  22.    while (i>=(a/2)+1 && i<=a){
  23.      k--;
  24.      A[i][(a/2)+1-k]=A[i][(a/2)+k-1]='*';
  25.      i++;
  26.    }
  27.    if (a>20){
  28.      for ( i=(a/2)-8,k=0;i<(a/2)+10;i++,k++)
  29.        A[i][22]=cad[k];
  30.    }
  31.  
  32.    putchar ('\n');
  33.    for ( i=0;i<a;i++){
  34.      printf("\t\t");
  35.      for ( j=0;j<a+2;j++){
  36.         if (A[i][j]=='0' )
  37.            printf("%c",' ');
  38.          else
  39.            printf("%c",A[i][j]);
  40.      }
  41.      putchar ('\n');
  42.    }
  43.    return 0;
  44. }

Y por qué no en positivo y negativo:

(http://i1280.photobucket.com/albums/a497/leosansan/romboposiynega_zps0aec8fba.jpg)

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  int i=0,j,k=1,a=21;
  5.  /*do{
  6.     printf("\nBase del rombo(numero impar positivo): \n");
  7.     scanf("%d",&a);
  8.     }while ( a <=0 || (a % 2) == 0);*/
  9.    char A[a+1][a+1];
  10.    for ( i=0;i<=a;i++)
  11.      for ( j=0;j<=a;j++)
  12.        A[i][j]='0';
  13.    A[0][a/2]='*';
  14.    i=1;
  15.    while (i<=a/2){
  16.      for ( j=(a/2)-i;j<=i+(a/2);j++){
  17.        A[i][j]='*';
  18.      }
  19.      i++;
  20.    }
  21.    k=i;
  22.    while (i>=(a/2) && i<=a){
  23.      --k;
  24.      for ( j=(a/2)+1-k;j<(a/2)+k;j++)
  25.        A[i][j]='*';
  26.      i++;
  27.    }
  28.    /** EN POSITIVO **/
  29.    for ( i=0;i<=a;i++){
  30.      printf("\t\t");
  31.      for ( j=0;j<a;j++){
  32.         if (A[i][j]=='0')
  33.            printf("%c",' ');
  34.          else
  35.            printf("%c",A[i][j]);
  36.      }
  37.      putchar ('\n');
  38.    }
  39.    putchar ('\n');
  40.    /** EN NEGATIVO **/
  41.    for ( i=0;i<=a;i++){
  42.      printf("\t\t");
  43.      for ( j=0;j<a;j++){
  44.         if (A[i][j]=='0')
  45.            printf("%c",'*');
  46.          else
  47.            printf("%c",' ');
  48.      }
  49.      putchar ('\n');
  50.    }
  51.    return 0;
  52. }

He preferido hacer dos códigos en lugar de uno con funciones para los posibles seguidores de este tema .... y paso de traslaciones, empiezo a estar saturado de tanto rombo. ¿Alguien se anima a empezar un nuevo tema con el triángulo de Pascal o Tartaglia? (http://st.forocoches.com/foro/images/smilies/simba1.gif)

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] Rombo con asteriscos
Publicado por: Yoel Alejandro en 9 Marzo 2014, 17:28 pm
Ok, el triángulo de Pascal, pero exactamente qué se te ocurre hacer?? Acepto el reto, jeje (claro, en un nuevo post) ...


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 9 Marzo 2014, 17:39 pm
Acepto el reto, jeje (claro, en un nuevo post) ...
[/b]

Pues a por él, pero eso sí en forma de triángulo isósceles. La forma clásica, vamos.

Ya que te lanzo el guante te dejo que elijas "armas", es decir que empieces el tema cuando te "sientas preparado". ..... es broma, ¿ehh..?.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 12 Marzo 2014, 21:02 pm
Perdonen que vuelva a la carga, pero creo que esto no está terminado :laugh:.

Antes que nada poner un caso que se me traspapelo entre tanto rombo. Es el caso de distinguir entre el borde y el interior:



(http://i1280.photobucket.com/albums/a497/leosansan/romboleosanbordesyrelleno_zps356488c1.jpg)

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  int i=0,j,k=1,l,a=21;
  5.  /*do{
  6.     printf("\nBase del rombo(numero impar positivo): \n");
  7.     scanf("%d",&a);
  8.     }while ( a <=0 || (a % 2) == 0);*/
  9.    char A[a+4][a+4],cad[]="L E O S A N S A N";
  10.    for ( i=0;i<=a+4;i++)
  11.      for ( j=0;j<=a+4;j++)
  12.        A[i][j]='0';
  13.    A[0][a/2]=254;
  14.    i=1;
  15.    while (i<=a/2){
  16.      l=i;
  17.      for ( j=(a/2)-i;j<=i+(a/2);j++){
  18.        if (j==(a/2)-l || j==l+(a/2))
  19.          A[i][j]=254;
  20.        else
  21.          A[i][j]='*';
  22.      }
  23.      i++;
  24.    }
  25.    k=i;
  26.    while (i>=(a/2) && i<=a){
  27.      --k;
  28.      l=k;
  29.      for ( j=(a/2)+1-k;j<(a/2)+k;j++)
  30.        if (j==(a/2)+1-l || j==(a/2)+l-1)
  31.          A[i][j]=254;
  32.        else
  33.          A[i][j]='*';
  34.      i++;
  35.    }
  36.    if (a>20){
  37.      for ( i=(a/2)-8,k=0;i<(a/2)+10;i++,k++)
  38.        A[i][a+1]=cad[k];
  39.    }
  40.    for ( i=0;i<a;i++){
  41.      printf("\t\t");
  42.      for ( j=0;j<a+2;j++){
  43.         if (A[i][j]=='0')
  44.            printf("%c",' ');
  45.          else
  46.            printf("%c",A[i][j]);
  47.      }
  48.      putchar ('\n');
  49.    }
  50.    putchar ('\n');
  51.    return 0;
  52. }

¿Qué pasa con los expertos en C++?

A ver si se animan a colgar algo de código en C++.

Yo en dicho lenguaje soy un total neófito, pero por lo menos se traducir algo de C  a C++. Así me salió esto:


Código
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n,fila,col;
  6. cout<<"Introduce un numero IMPAR: "<<endl;
  7. cin >> n;
  8.    for(fila=1;fila<=n;fila++){
  9.        for(col=1;col<=n-fila;col++)
  10.           cout<<(" ");
  11.        for(col=1;col<=2*fila-1;col++)
  12.          cout<<("*");
  13.    cout<<endl;
  14.    }
  15.    for(fila=n-1;fila>=1;fila--) {
  16.        for(col=1;col<=n-fila;col++)
  17.          cout<<(" ");
  18.        for(col=1;col<=2*fila-1;col++)
  19.        cout<<("*");
  20.    cout<<endl;
  21.    }
  22. }

Pero claro, yo espero más de los expertos en C++, que haberlos hay los, todo está en que se animen con nuevas aportaciones.

Y todavía estoy a la espera que yoel_alejandro intervenga, que me dijo me iba a sorprender. No lo dejes estar mucho tiempo que se enfría el tema.

Y dedicado precisamente a yoel_alejandro al que rete en mi anterior mensaje, le dejo una versión "made in leosansan" del triángulo de Pascal, en este caso para que sea más a tono con el tema que se trata, de la pirámide de Pascal .... si ya sé que me acabo de inventar el término, pero ¿a qué queda bien? ...



(http://i1280.photobucket.com/albums/a497/leosansan/pascalpiramide_zps35289e63.jpg)

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [C] Rombo con asteriscos
Publicado por: dmacias en 13 Marzo 2014, 22:24 pm
Vaya leosansan, siq ue le has cojido el gusto al rombo jijijijjii
haber si me dejan un poco mas de tiempo libre e intento el triangulo de pascal ese, haber que sale


Título: Re: [C] Rombo con asteriscos
Publicado por: amchacon en 14 Marzo 2014, 01:39 am
Huy, a mi dibujar formas en ASCII me da un dolor de cabeza... Es de los ejercicios que no puedo xD

Solo decir que las llamadas a printf/cout tienen mucho retraso, es más eficiente pintar línea a línea que caracter a caracter.

Pero vamos, son detallitos. Para que empezases a notar la diferencia tendría que ser rombos de más de 1000 o cosa así.

PD: El triangulo de pascal... ¿Recursivo?


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 14 Marzo 2014, 18:43 pm

Huy, a mi dibujar formas en ASCII me da un dolor de cabeza... Es de los ejercicios que no puedo xD
..............................................................................

PD: El triangulo de pascal... ¿Recursivo?


¡¡¡Vamos hombre!!!, que no se trata de crear retratos o figuras complejas, además si te animas con el triángulo de Pascal, ya que tienes que crear la forma de triángulo, te será fácil dibujar la parte inferior y así ya tienes el rombo.

Hablando del triángulo de Pascal, me da igual como se obtenga,con recursión o sin ella,  la idea es que la gente aporte soluciones variadas, como un reto, ni más ni menos. Ya luego podremos comenta rentre todos  cual ha sido el más eficiente y cosas así.

Y para que no decaiga el tema yo aporto otro granito de arena al tema de los rombos en C++, que repito soy un pardillo total. Me cuesta horrores porque no controlo las salidas por pantalla, en C tengo los printf pero en C++ ..... sólo conozco cout, pero no sus posibilidades que me imagino tendrá, y setw. Y con este último me ha salido otro código con recursividad incluida:


Código
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int dibuja_arriba (int a,int cont);
  5. int dibuja_abajo (int a,int cont);
  6.  
  7. int main()
  8. {
  9.    int cont=25,a=0;
  10.    /*cout << "Introduce un numero IMPAR: "<<endl;
  11.     cin >> a;
  12.     cout <<endl ;*/
  13.    dibuja_arriba (a,cont);
  14.    cout <<  "  ";
  15.    dibuja_abajo (cont-2,a+1);
  16.    return 0;
  17. }
  18.  
  19. int dibuja_arriba (int a,int cont){
  20.    if (cont<=0)
  21.      return 1;
  22.    cout <<setw((cont/2)+1) << " ";
  23.    for (int i=0;i<=a;i++)
  24.      cout<< "*";
  25.    cout << endl;
  26.    dibuja_arriba (a+2,cont-2);
  27. }
  28.  
  29. int dibuja_abajo (int a,int cont){
  30.    if (a<=0)
  31.      return 1;
  32.    for (int i=1;i<=a;i++)
  33.      cout<<"*";
  34.    cout << endl << setw(cont+2) << " ";
  35.    dibuja_abajo (a-2,cont+1);
  36. }

Tuve que hacer algún ajuste "extraño" pero sale bien la pirámide.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [C] Rombo con asteriscos
Publicado por: amchacon en 14 Marzo 2014, 22:58 pm
Bueno que no se diga, dibujare señales cuadradas. Aquí teneís varias a distintas escalas:

(https://dl.dropboxusercontent.com/u/69551225/Sin%20t%C3%ADtulo.png)

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. void DibujarSenyalCuadrada(const int frecuencia = 1,char caracter = '*',ostream &fout = cout);
  7.  
  8. int main()
  9. {
  10.    int frecuencia;
  11.    //cout<<"Introduca frecuencia: ";
  12.    //cin>>frecuencia;
  13.    for (int i = 3; i < 20;i++)
  14.    {
  15.        DibujarSenyalCuadrada(i);
  16.        cout<<endl;
  17.    }
  18.    return 0;
  19. }
  20.  
  21. void DibujarSenyalCuadrada(const int frecuencia,char caracter,ostream &fout)
  22. {
  23.    const int max_asci = 50;
  24.    int j = 0;
  25.    string separador(frecuencia-2,' ');
  26.    string escalon(frecuencia,caracter);
  27.  
  28.    while (j < max_asci)
  29.    {
  30.        fout<<escalon;
  31.        fout<<separador;
  32.        j += 2*frecuencia;
  33.    }
  34.  
  35.    fout<<endl;
  36.    // escalones de bajada
  37.  
  38.    for (int i = 0; i < frecuencia;i++)
  39.    {
  40.        j = 0;
  41.        fout<<' ';
  42.        while (j < max_asci)
  43.        {
  44.            fout<<separador;
  45.            fout<<caracter;
  46.            j += frecuencia;
  47.        }
  48.        fout<<endl;
  49.    }
  50.  
  51.    // barreras inferiores
  52.  
  53.    fout<<separador;
  54.    fout<<' ';
  55.    j = 0;
  56.  
  57.    while (j < max_asci)
  58.    {
  59.        fout<<escalon;
  60.        fout<<separador;
  61.        j += 2*frecuencia;
  62.    }
  63.    fout<<endl;
  64. }

Notese que escribo en fout en vez de cout. De esa forma puedo decirle a la función que escriba en un fichero externo en vez de la pantalla:

Código
  1. int main()
  2. {
  3.    ofstream fichero("cuadrada.txt");
  4.  
  5.    for (int i = 3; i < 20;i++)
  6.    {
  7.        DibujarSenyalCuadrada(i,'*',fichero);
  8.        fichero<<endl;
  9.    }
  10.    return 0;
  11. }


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 15 Marzo 2014, 14:29 pm

Bueno que no se diga, dibujare señales cuadradas.


Pero ese no era el tema, estábamos hablando de pirámides.

Pero bueno, para que no se diga, sin array, strings ni funciones. Solamente con el misero pero potente printf y mucha imaginación:

(http://i1280.photobucket.com/albums/a497/leosansan/ondacuadrada1_zps8532e527.jpg)

A mi ni me caben más en la pantalla:

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  int i,j,k,l=0,cont=0,cont1=0,tam,MAX=40;
  5.  for (tam=3;tam<=15;tam++){
  6.    cont=cont1=0;
  7.    for (i=0,j=0;i<MAX-1;i++,j++){
  8.      putchar('*');
  9.      if (j==tam-1)
  10.        printf ("%*c", tam-2, ' ');
  11.       if (i%tam==0){
  12.         cont++;
  13.         j=0;
  14.       }
  15.    }
  16.    putchar ('\n');
  17.    for (k=0;k<tam;k++){
  18.      for (i=0,j=0;i<2*MAX/tam-1;i++,j++){
  19.        if (cont1==cont-1)
  20.          break;
  21.        if (j==0)
  22.          printf ("%*c", tam, '*');
  23.        else
  24.            printf ("%*c", tam-1, '*');
  25.        if (k==tam-1  && i<(2*MAX/tam-1)/2+1){
  26.          cont1++;
  27.          for (l=0;l<tam-1;l++){
  28.            putchar('*');
  29.          }
  30.        }
  31.        if (i%(tam+1)==0)
  32.          j=0;
  33.      }
  34.      putchar ('\n');
  35.    }
  36.  putchar ('\n');
  37.  }
  38. return 0;
  39. }

De todas formas sería más fácil usando una función matemática. ¿Te animas?.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] Rombo con asteriscos
Publicado por: amchacon en 15 Marzo 2014, 16:53 pm
Pero esque las piramides ya las hecho ;D

Pensé en hacer un circulo, pero hacer un circulo en una consola ASCII no es trivial. Para que te quedara bien habría que hacer "anti-alising" con alguna letra más redondita.

De todas formas sería más fácil usando una función matemática. ¿Te animas?.[/center]
¿Más fácil? De eso nada xD

Para empezar rompe el enfoque arriba-abajo, además para sacarla tendrías que hacer unas series de fourier muy divertidas... Y probablemente alguna casilla te salga mal ya que no es exacta y las casillas no admiten decimales.


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 15 Marzo 2014, 20:19 pm

 
Pero es que las pirámides ya las hecho ;D

.......................................

Pero apenas en C++, ya te digo que no sé muy bien como imprimir de  forma avanzada. No obstante continuo con mis aportaciones, para que vean lo que puede dar de sí este tema:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/romboleosancuadrado_zpsbdcf2c66.jpg)

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. /*********************************/
  5. void entrar_num_base (int &n){
  6.   /*cout << "Introduce un numero IMPAR: "<<endl;
  7.     cin >> n;
  8.     cout <<endl ;*/
  9. }
  10. /*********************************/
  11. void asteriscos (int &i){
  12.  for(int j=1;j<=i;j++)
  13.    cout<<'*'<<" ";
  14.  cout<<endl;
  15. }
  16.  
  17. /*********************************/
  18. void parte_superor (int i, int n){
  19.  for(i=1;i<=n;i+=2){
  20.    for(int b=n-i;b>0;b--)
  21.      cout<<" ";
  22.    asteriscos(i);
  23.  }
  24. }
  25. /*********************************/
  26. void parte_inferior(int i,int n){
  27.  for(i=n-2;i>=1;i-=2){
  28.    for(int b=n-i;b>0;b--)
  29.      cout<<" ";
  30.    asteriscos(i);
  31.  }
  32. }
  33. /*********************************/
  34.  
  35. int main(){
  36.  int i=0,num_base=25;
  37.  ///entrar_num_base (num_base);
  38.  parte_superor (i,num_base);
  39.  parte_inferior(i,num_base);
  40.  return 0;
  41. }

...................................................
¿Más fácil? De eso nada xD

Para empezar rompe el enfoque arriba-abajo, además para sacarla tendrías que hacer unas series de fourier muy divertidas... Y probablemente alguna casilla te salga mal ya que no es exacta y las casillas no admiten decimales.



¡No hombre!, no pensaba en ese sistema, para eso ya tengo el Mathematica y el Matlab.

Pensaba en esta idea:


Citar


f(x)=a/2 ......    0<=x<=a/2

f(x)=-a/2 ...... -a/2<x<a


Para ello me apoyo en el uso del gotoxy, bien mediante la librería de conio, más exactamente la conio2.h:

Código
  1. #include <stdio.h>
  2. #include <conio2.h>
  3.  
  4. int main(){
  5.  int  i,j,k,l,a;
  6.  for (a=2,l=1;a<19;a++,l+=2*a+2){
  7.    for (k=1;k<=50;k+=2*a) {
  8.      for (i=0;i<=a;i++){
  9.        gotoxy(i+k,0+l);
  10.        putchar('*');
  11.        for (j=0;j<=a;j++){
  12.          gotoxy(a+k,j+l);
  13.          putchar('*');
  14.        }
  15.        gotoxy(i+a+k,a+l);
  16.        putchar('*');
  17.        for (j=0;j<=a;j++){
  18.          gotoxy(2*a+k,j+l);
  19.          putchar('*');
  20.        }
  21.      }
  22.    }
  23.  }
  24.  return 0;
  25. }

O bien en la librería de windows.h:

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. int gotoxy(int x, int y);
  5.  
  6. int main(){
  7.  int  i,j,k,l,a;
  8.  for (a=2,l=0;a<20;a++,l+=2*a+2){
  9.    for (k=0;k<=50;k+=2*a) {
  10.      for (i=0;i<=a;i++){
  11.        gotoxy(i+k,0+l);
  12.        putchar('*');
  13.        for (j=0;j<=a;j++){
  14.          gotoxy(a+k,j+l);
  15.          putchar('*');
  16.        }
  17.        gotoxy(i+a+k,a+l);
  18.        putchar('*');
  19.        for (j=0;j<=a;j++){
  20.          gotoxy(2*a+k,j+l);
  21.          putchar('*');
  22.        }
  23.      }
  24.    }
  25.  }
  26.  return 0;
  27. }
  28.  
  29.  
  30. int gotoxy(int x, int y)
  31. {
  32.   COORD coord;
  33.   HANDLE h_stdout;
  34.   coord.X = x;
  35.   coord.Y = y;
  36.   if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  37.      return 0;
  38.   if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  39.      return 0;
  40.   return 1;
  41. }


No he puesto los ejes por pereza xD. ;)

Esta vez, en vista de que "no cabe" en la página todas las funciones que genero, de 3 a 19 o 20, las metí en un vídeo, ..... tranquilos, dura menos de un minutito: :o


RM-UJ-lAhWE

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] Rombo con asteriscos
Publicado por: amchacon en 16 Marzo 2014, 14:02 pm
Chachi ^^. Un paso curioso sería hacerlas animadas (borrando y reescribiendola con otra posición cada x tiempo).

Yo de florituras en la pantalla, ni se me dan bien ni me gustan mucho. Por no dejar el tema a medias he hecho algo más de mi gusto: Una class Triangulo_Pascal:

Código
  1. /** Resumen de los metodos públicos:
  2.  
  3. - Constructor(int n = 0): Genera un triangulo de pascal de tamanyo N
  4. - Constructor(triangulo_pascal): Constructor copia.
  5. - getPosicion(int x,int y): Devuelve el valor en la posicion en la posicion x,y. Lanza una excepcion si es una posición incorrecta
  6. - getSize(): Devuelve el tamanyo actual del triangulo
  7. - resize(int n): Reconstruye el triangulo para un ancho n
  8. - clear(): Borra el triangulo dejandolo con un tamanyo 0.
  9. - toString(): Obtiene una expresion escrita del triangulo.
  10.  
  11. Operadores:
  12.  
  13. triangulo_pascal = triangulo_pascal   /** asignacion *
  14. triangulo_pascal == triangulo_pascal  /** iguales? *
  15. triangulo_pascal != triangulo_pascal  /** diferentes? *
  16. **/
  17.  
  18. class triangulo_pascal
  19. {
  20.    int** Matriz;
  21.    int TAM;
  22.    string texto;
  23.  
  24.    int contar_cifras() const
  25.    {
  26.        int cifras = 1;
  27.        int aux = Matriz[TAM-1][TAM/2];
  28.  
  29.        while (aux > 9)
  30.        {
  31.            cifras++;
  32.            aux /= 10;
  33.        }
  34.  
  35.        return cifras;
  36.    }
  37.  
  38.    void generar(const int n)
  39.    {
  40.        TAM = n;
  41.        Matriz = new int*[n];
  42.        Matriz[0] = new int[1];
  43.        Matriz[0][0] = 1;
  44.  
  45.        for (int i = 1; i < n;i++)
  46.        {
  47.            Matriz[i] = new int[i+1];
  48.  
  49.            Matriz[i][0] = 1;
  50.            for (int j = 1; j < i;j++)
  51.            {
  52.                Matriz[i][j] = Matriz[i-1][j-1]+Matriz[i-1][j];
  53.            }
  54.            Matriz[i][i] = 1;
  55.        }
  56.  
  57.        generarString();
  58.    }
  59.  
  60.    void generarString()
  61.    {
  62.        stringstream ss;
  63.  
  64.        const int size = contar_cifras();
  65.  
  66.        for (int i = 0; i < TAM;i++)
  67.        {
  68.            for (int k = 0; k <= (TAM-i-2);k++)
  69.                ss<<" ";
  70.  
  71.            ss<<Matriz[i][0];
  72.  
  73.            for (int j = 1; j <= i;j++)
  74.            {
  75.                ss<<" ";
  76.  
  77.                ss<<setw(size)<<Matriz[i][j];
  78.            }
  79.  
  80.            ss<<endl;
  81.        }
  82.  
  83.        texto = ss.str();
  84.    }
  85. public:
  86.    triangulo_pascal(int n = 0)
  87.    {
  88.        if (n != 0)
  89.        {
  90.            generar(n);
  91.        }
  92.        else Matriz = NULL;
  93.    }
  94.  
  95.    triangulo_pascal(const triangulo_pascal &a)
  96.    {
  97.        if (a.getSize() != 0)
  98.            generar(a.getSize());
  99.        else Matriz = NULL;
  100.    }
  101.  
  102.    triangulo_pascal& operator=(const triangulo_pascal &a)
  103.    {
  104.        if (a.getSize() != 0)
  105.            generar(a.getSize());
  106.        else Matriz = NULL;
  107.    }
  108.  
  109.    bool operator==(const triangulo_pascal &b)
  110.    {
  111.        return TAM == b.TAM;
  112.    }
  113.  
  114.    bool operator!=(const triangulo_pascal &c)
  115.    {
  116.        return TAM != c.TAM;
  117.    }
  118.  
  119.    int getPosicion(int x,int y) const
  120.    {
  121.        if (y < TAM || (x > y)) throw "Error, fuera de rango";
  122.        return Matriz[x][y];
  123.    }
  124.  
  125.    int getSize() const { return TAM;}
  126.  
  127.    void resize(int n)
  128.    {
  129.        if (n < 0) throw "Error, tamanyo negativo";
  130.  
  131.        clear();
  132.  
  133.        if (n == 0){return;}
  134.  
  135.        generar(n);
  136.    }
  137.  
  138.    void clear()
  139.    {
  140.        if (Matriz == NULL) return;
  141.  
  142.        for (int i = 0; i < TAM;i++)
  143.            delete[] Matriz[i];
  144.  
  145.        delete[] Matriz;
  146.  
  147.        Matriz = NULL;
  148.        TAM = 0;
  149.    }
  150.  
  151.    string toString() const
  152.    {
  153.        return texto;
  154.    }
  155.  
  156.    operator string()
  157.    {
  158.        return toString();
  159.    }
  160.  
  161.    ~triangulo_pascal()
  162.    {
  163.        clear();
  164.    }
  165. };
  166.  

De la cual, podemos hacer algunas pruebas:

Código
  1. int main()
  2. {
  3.    triangulo_pascal mi_triangulo(5);
  4.  
  5.    cout<<mi_triangulo.toString()<<endl;
  6.    mi_triangulo.resize(4);
  7.    cout<<mi_triangulo.toString()<<endl;
  8.  
  9.    triangulo_pascal segundo(1);
  10.  
  11.    if (mi_triangulo != segundo)
  12.    {
  13.        cout<<"Son diferentes :("<<endl<<endl;
  14.    }
  15.  
  16.    cout<<(string)segundo<<endl; // otra forma de pasarlo a string es usando los casts
  17.    return 0;
  18. }
  19.  

El mayor fallo que tiene es la función para pasarlo a string, que aunque siempre genera el triangulo, lo hace un poco "raro" para algunos valores de N.


Título: Re: [C] Rombo con asteriscos
Publicado por: leosansan en 16 Marzo 2014, 16:17 pm

...........AMCHACON..................


Espero que no te tomes a mal la licencia que me he tomado al colgar este código en el nuevo tema del binomio de Newton y triángulo de Pascal. Me pareció más oportuno.

Así dejaremos este para las ondas y continuar con la pirámide de asteriscos.

Y no quiero dejar de pasar la ocasión de brindar un homenaje a un antiguo "maestro" aunque de otro foro, pero creo que su punto de vista es "rompedor" con todo lo visto hasta ahora. Es un maestro en lo que yo he dado por llamar "códigos raritos y cortitos": el amigo Pantalàimon.

Conste que yo lo único que he hecho en este caso es "traducir" el código de C++ a C e implementar el que sólo salgan los impares. Ahí va:

Código
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. bool en_rombo( int n, int i, int j ){
  5.   if ((((i+j+n)%2) && i + j > n && i + j < 3*n
  6.       && i - j < n && i - j >  -n))
  7.    return true;
  8.  else
  9.    return false;
  10. }
  11.  
  12. int main(){
  13.  int i, j, n=21;
  14.  /*do{
  15.     printf("\nBase del rombo(numero impar positivo): \n");
  16.     scanf("%d", &n);
  17.   }while ( n <=0 || (n % 2) == 0);*/
  18.  for( i = 1; i < 2*n; i+=2 ){
  19.    for( j = 1; j < 2*n; j+=2 )
  20.      printf ("%c",en_rombo( n, i, j ) ? '*' : ' ' );
  21.    putchar ('\n');
  22.  }
  23.  return 0;
  24. }

Viendo otros códigos, con la excepción del aportado por rir3760 , este se sale. Lo repito, es todo un homenaje a  Pantalàimon al que desde aquí le reitero mis gracias por lo mucho que me ayudo en los inicios, junto a rir3760, Cheroky , untio y Sorancio. GRACIAS.


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/emoticonos22_zpsaaeb9e29.gif)(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/10aplaudir_zps90bfad09.gif)(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/emoticonos22_zpsaaeb9e29.gif)