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
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!
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
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
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!
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!:
Cita de: leosansan en 7 Febrero 2013, 23:17 PM
http://www.cplusplus.com/reference/cstdio/printf/
Saluditos!:
Ya, ahora ya lo había leído, gracias de todas formas :xD
Puesto a hacerlo sin usar más de un for salió esto, que además funciona:
#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?:
#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:
Teclea un digito (1-9):
6
1
222
33333
4444444
555555555
66666666666
Con sólo esto:
#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!.
¡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!