Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 4 Febrero 2013, 23:57 pm



Título: alinear texto
Publicado por: m@o_614 en 4 Febrero 2013, 23:57 pm
Saludos  :)

tengo este código que me tiene que hacer una piramide de manera que quede como:

     1
   22
  333
4444

el problema es que no se cómo alinear los números a la derecha

Código
  1. int main()
  2. {
  3.    int i,j,numero;
  4.    printf("Dame un numero\n");
  5.    scanf("%d",&numero);
  6.    for(i=1;i<=numero;i++)
  7.    {
  8.        printf("\n");
  9.        for(j=1;j<=i;j++)
  10.           printf("%d",i);
  11.    }
  12.    return 0;
  13. }
gracias de antemano


Título: Re: alinear texto
Publicado por: xassiz~ en 5 Febrero 2013, 00:50 am
No entendí muy bien la representación de tu "pirámide", pero si te refieres a que queden todos alineados a la derecha, podrías pensarlo así:

Si el usuario introduce "numero", te imaginas una cuadrícula de dimensión "numero x numero".
Como sabes que lo que va a ocupar la linea, tienes que imprimir numero-i espacios antes que el propio número. Sería algo así:

Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i, j, z, numero;
  6.  
  7.    printf("Dame un numero\n");
  8.    scanf("%i",&numero);
  9.  
  10.    for(i=1;i<=numero;i++)
  11.    {
  12.        for(z=0;z<(numero-i);z++)
  13.            printf(" ");
  14.  
  15.        for(j=1;j<=i;j++)
  16.            printf("%i",i);
  17.  
  18.        printf("\n");
  19.    }
  20.  
  21.    return 0;
  22. }
Código:
$ ./test
Dame un numero
4
   1
  22
 333
4444

Saludos!


Título: Re: alinear texto
Publicado por: durasno en 6 Febrero 2013, 19:35 pm
Hola! la solucion ya te la dijeron, pero por si no lo sabias el printf tiene alineacion derecha(aunq para este programa no te va a servir). Ejemplo:
Código
  1.    int main()
  2.    {
  3. int a=10;
  4. int i=0;
  5. while(i<5) {
  6. printf("%6d\n",a); // el "6" hace que la salida se alinie 6 espacios hacia la derecha
  7. a*=10;
  8. i++;
  9. }
  10.       return 0;
  11.    }


Saludos


Título: Re: alinear texto
Publicado por: rir3760 en 7 Febrero 2013, 16:21 pm
Para imprimir un triangulo rectángulo (o un pirámide, o un rombo, son casos similares) se deben imprimir dos secuencias: la primera de caracteres de espacio para alinear y la segunda el relleno.

El problema aquí es la falta de una función que imprima de forma repetida un determinado carácter. La excepción es utilizar la función printf con los especificadores de anchura de campo y "*" para conseguir la repetición de espacios.

Un ejemplo que imprime un triangulo de dígitos (y nada mas) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int i;
  8.   int j;
  9.  
  10.   puts("Dame un digito (1-9):");
  11.   if (scanf("%d",&num) != 1)
  12.      return EXIT_FAILURE;
  13.  
  14.   for (i = 0; i < num; i++){
  15.      /* Secuencia de espacios (alineacion) mas un caracter */
  16.      printf("%*d", num - i, i + 1);
  17.  
  18.      /* Caracteres restantes (relleno) */
  19.      for (j = 0; j < i; j++)
  20.         putchar('1' + i);
  21.      putchar('\n');
  22.   }
  23.  
  24.   return EXIT_SUCCESS;
  25. }

Un saludo


Título: Re: alinear texto
Publicado por: xassiz~ en 7 Febrero 2013, 17:46 pm
La excepción es utilizar la función printf con los especificadores de anchura de campo y "*" para conseguir la repetición de espacios.
Buen algoritmo, no conocía el especificador de anchura de printf, gracias!


Título: Re: alinear texto
Publicado por: leosansan en 7 Febrero 2013, 23:17 pm
Buen algoritmo, no conocía el especificador de anchura de printf, gracias!

http://www.cplusplus.com/reference/cstdio/printf/

Saluditos!:


Título: Re: alinear texto
Publicado por: xassiz~ en 7 Febrero 2013, 23:54 pm
http://www.cplusplus.com/reference/cstdio/printf/

Saluditos!:
Ya, ahora ya lo había leído, gracias de todas formas :xD


Título: Re: alinear texto
Publicado por: leosansan en 8 Febrero 2013, 20:31 pm
Puesto a hacerlo sin usar más de un for salió esto, que además funciona:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void){
  6.  int i,num;
  7.  char valor[2],str[20]={0};
  8.  printf("Dame un digito (1-9): \n");
  9.  scanf("%d",&num);
  10.  for (i = 1; i <=num; i++){
  11.    memset (str,' ',num-i);
  12.    strcat(str,itoa (i,valor,10));
  13.    memset (&str[strlen (str)-1], i+'0',i);
  14.    printf ("%s\n",str);
  15.    memset (str,0,strlen (str)-1);
  16.  }
  17.   return EXIT_SUCCESS;
  18. }
  19.  
Se admiten críticas o sugerencias.
Saluditos!.


REEDITO: Pensándolo bien, ¿para qué usar strcat?:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void){
  6.  int i,num;
  7.  char valor[2],str[20]={0};
  8.  printf("Teclea un digito (1-9): \n");
  9.  scanf("%d",&num);
  10.  for (i = 1; i <=num; i++){
  11.    memset (str,' ',num-i);//relleno izquierda con espacios
  12.    memset (&str[strlen (str)], i+'0',i);//relleno derecha con numeros
  13.    printf ("%s\n",str);
  14.    memset (str,0,strlen (str)-1);//hago nula la cadena para volver a usarla
  15.  }
  16.   return EXIT_SUCCESS;
  17. }
  18.  

Y con una pequeña variante puedo obtener una pirámide, tipo:

Código
  1. Teclea un digito (1-9):
  2. 6
  3.     1
  4.    222
  5.   33333
  6.  4444444
  7. 555555555
  8. 66666666666
  9.  

Con sólo esto:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void){
  6.  int i,num;
  7.  char valor[2],str[20]={0};
  8.  printf("Teclea un digito (1-9): \n");
  9.  scanf("%d",&num);
  10.  for (i = 1; i <=num; i++){
  11.    memset (str,' ',num-i);//relleno izquierda con espacios
  12.    memset (&str[strlen (str)], i+'0',2*i-1);//relleno derecha con numeros
  13.    printf ("%s\n",str);
  14.    memset (str,0,strlen (str)-1);//hago nula la cadena para volver a usarla
  15.  }
  16.   return EXIT_SUCCESS;
  17. }
  18.  
  19.  

Hay que ver lo que da de sí memset ¡ ¡ ¡.

Nuevamente, Saluditos!.


Título: Re: alinear texto
Publicado por: do-while en 10 Febrero 2013, 20:20 pm
¡Buenas!

Viendo que ya te han dado varias soluciones aqui va la mia.

Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5.    int i,j,n;
  6.  
  7.  
  8.    /* esto esta hecho rapido y mal, deberias de asegurarte de que los datos leidos son correctos */
  9.    scanf("%d",&n);
  10.  
  11.    /* mostramos la piramide */
  12.    for(i = 0 ; i < n ; i++)
  13.    {
  14.        for(j = 0 ; j <= i ; j++)
  15.            printf("\r%*d",n - j, i + 1);
  16.  
  17.        printf("\n");
  18.    }
  19.  
  20.    return 0;
  21. }
  22.  

¡Saludos!