alinear texto

Iniciado por m@o_614, 4 Febrero 2013, 23:57 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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

int main()
{
    int i,j,numero;
    printf("Dame un numero\n");
    scanf("%d",&numero);
    for(i=1;i<=numero;i++)
    {
        printf("\n");
        for(j=1;j<=i;j++)
           printf("%d",i);
    }
    return 0;
}

gracias de antemano

xassiz~

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í:


#include<stdio.h>

int main()
{
   int i, j, z, numero;

   printf("Dame un numero\n");
   scanf("%i",&numero);

   for(i=1;i<=numero;i++)
   {
       for(z=0;z<(numero-i);z++)
           printf(" ");

       for(j=1;j<=i;j++)
           printf("%i",i);

       printf("\n");
   }

   return 0;
}


$ ./test
Dame un numero
4
   1
  22
333
4444


Saludos!

durasno

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:
    int main()
    {
int a=10;
int i=0;
while(i<5) {
printf("%6d\n",a); // el "6" hace que la salida se alinie 6 espacios hacia la derecha
a*=10;
i++;
}
       return 0;
    }



Saludos
Ahorrate una pregunta, lee el man

rir3760

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num;
   int i;
   int j;
   
   puts("Dame un digito (1-9):");
   if (scanf("%d",&num) != 1)
      return EXIT_FAILURE;
   
   for (i = 0; i < num; i++){
      /* Secuencia de espacios (alineacion) mas un caracter */
      printf("%*d", num - i, i + 1);
     
      /* Caracteres restantes (relleno) */
      for (j = 0; j < i; j++)
         putchar('1' + i);
      putchar('\n');
   }
   
   return EXIT_SUCCESS;
}


Un saludo
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

xassiz~

Cita de: rir3760 en  7 Febrero 2013, 16:21 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!

leosansan

Cita de: xassiz~ en  7 Febrero 2013, 17:46 PM
Buen algoritmo, no conocía el especificador de anchura de printf, gracias!

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

Saluditos!:


leosansan

#7
Puesto a hacerlo sin usar más de un for salió esto, que además funciona:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
 int i,num;
 char valor[2],str[20]={0};
 printf("Dame un digito (1-9): \n");
 scanf("%d",&num);
 for (i = 1; i <=num; i++){
   memset (str,' ',num-i);
   strcat(str,itoa (i,valor,10));
   memset (&str[strlen (str)-1], i+'0',i);
   printf ("%s\n",str);
   memset (str,0,strlen (str)-1);
 }
  return EXIT_SUCCESS;
}

Se admiten críticas o sugerencias.
Saluditos!.


REEDITO: Pensándolo bien, ¿para qué usar strcat?:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
 int i,num;
 char valor[2],str[20]={0};
 printf("Teclea un digito (1-9): \n");
 scanf("%d",&num);
 for (i = 1; i <=num; i++){
   memset (str,' ',num-i);//relleno izquierda con espacios
   memset (&str[strlen (str)], i+'0',i);//relleno derecha con numeros
   printf ("%s\n",str);
   memset (str,0,strlen (str)-1);//hago nula la cadena para volver a usarla
 }
  return EXIT_SUCCESS;
}


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

Código (cpp) [Seleccionar]
Teclea un digito (1-9):
6
     1
    222
   33333
  4444444
555555555
66666666666


Con sólo esto:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
  int i,num;
  char valor[2],str[20]={0};
  printf("Teclea un digito (1-9): \n");
  scanf("%d",&num);
  for (i = 1; i <=num; i++){
    memset (str,' ',num-i);//relleno izquierda con espacios
    memset (&str[strlen (str)], i+'0',2*i-1);//relleno derecha con numeros
    printf ("%s\n",str);
    memset (str,0,strlen (str)-1);//hago nula la cadena para volver a usarla
  }
   return EXIT_SUCCESS;
}



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

Nuevamente, Saluditos!.

do-while

¡Buenas!

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


#include <stdio.h>

int main(int argc, char *argv[])
{
    int i,j,n;


    /* esto esta hecho rapido y mal, deberias de asegurarte de que los datos leidos son correctos */
    scanf("%d",&n);

    /* mostramos la piramide */
    for(i = 0 ; i < n ; i++)
    {
        for(j = 0 ; j <= i ; j++)
            printf("\r%*d",n - j, i + 1);

        printf("\n");
    }

    return 0;
}


¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!