Programación en C [Pirámide de caracteres]

Hola a todos.
Acabo de empezar la carrera de ingeniería informática y uno de los primeros problemas que me han planteado es hacer un programa que haga lo siguiente:

Realizar un programa que lea de teclado un entero y un carácter. La salida en pantalla deber ser una figura como la que se muestra en el dibujo, compuesta por el carácter tecleado, y de altura dada por el número entero introducido. Por ejemplo, si el entero tecleado es 7 y el carácter el asterisco (*), la imagen debe ser:

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

He logrado hacer un programa que haga la mitad de la pirámide, pero no sé cómo continuar.

¿Alguien se le ocurre cómo?

PD: Hay que resolver el problema utilizando sentencias de control repetitivas (bucles), y yo había utilizado "for".
A ver, por darte pistas... En vez de iterar n veces, tienes que iterar (n*2)-1. En cada iteración debes calcular el número de caracteres a imprimir, que será 1, 2, ..., n-1, n, n-1, ..., 2, 1. Puedes utilizar el operador % (módulo) en el número de iteración para calcular el número de caracteres a imprimir.
Este es el programa que llevo hecho hasta ahora. Como veis, sólo consigo media pirámide:

#include <stdio.h>
#include <stdlib.h>

main ()
{
int altura,filas,blancos,columnas;
char caracter;

printf("El programa representara una piramide de cierta altura, introducida por el usuario, y compuesta por un simbolo, tambien introducido por el usuario.\n");
printf("El resultado sera algo similar a esto:\n\n");
puts("*");
puts("**");
puts("***");
puts("****");
puts("*****");
puts("******");
puts("*******");
puts("******");
puts("*****");
puts("****");
puts("***");
puts("**");
puts("*");


printf("\n\nIntroduce la altura que tendra la piramide: ");
scanf("%d",&altura);

while(altura<0)
{
printf("La altura de la piramide ha de ser un numero entero y positivo. Por favor, prueba de nuevo: ");
scanf("%d",&altura);
}


printf("Introduce el simbolo que compondra la piramide: ");
scanf("%s",&caracter);

system("cls");

printf("Piramide de altura %d y compuesta por '%c'\n",altura,caracter);
puts("========================================\n");

for (filas=1;filas<=altura;filas++)
{
for (columnas=1; columnas<=filas; columnas++)
{printf("%c",caracter);}

for (blancos=altura-1; blancos=0; blancos--)
{printf(" ");}

printf("\n");
}


system("pause");

}
mecadiego113 escribió:
for (filas=1;filas<=altura;filas++)
{
for (columnas=1; columnas<=filas; columnas++)
{printf("%c",caracter);}

for (blancos=altura-1; blancos=0; blancos--)
{printf(" ");}

printf("\n");
}


system("pause");


Como te han dicho, el "for" de las filas, o sea el primer, debe iterar (altura*2) - 1, ahí ya tendrías el número de iteracciones correcto, ahora tienes que pensar lo que tienes que hacer de los demás "for" para que funcione. Piensa que el programa tiene que saber cuando cambia la mecánica, es decir, cuando se llegue a 7 (en el ejemplo), la mecánica cambia, porque va ahora de mayor a menor...Piensa como controlar eso. ;)
Muchas gracias a los dos.
¿Cómo podría manejar ese cambio (de crecer a decrecer)?

He estado probado con "if" pero nada... me muestra el número de iteraciones correcto pero está siempre creciendo, no obtengo la forma de pirámide.
Yo haría la primera parte de la piramide así:

  int num,i,j;
  char car;
 
  printf("Introduce un caracter: ");
  scanf ("%c",&car);
  printf("Introduce un numero: ");
  scanf ("%d",&num);

  for(i=0;i<num;i++){
    for(j=0;j<i+1;j++){                 
       printf("%c ",car);
    }
    printf("\n");                   
  }


La segunda parte sería igual pero contando hacia atrás.
Juanjoab escribió:Yo haría la primera parte de la piramide así:

  int num,i,j;
  char car;
 
  printf("Introduce un caracter: ");
  scanf ("%c",&car);
  printf("Introduce un numero: ");
  scanf ("%d",&num);

  for(i=0;i<num;i++){
    for(j=0;j<i+1;j++){                 
       printf("%c ",car);
    }
    printf("\n");                   
  }


La segunda parte sería igual pero contando hacia atrás.


Muchas gracias de nuevo.
¿Cómo implementas la segunda parte de la pirámide dentro de ese programa?
También se puede hacer todo en la misma iteración, de 1 a 2*n-1. Sólo hay que encontrar una relación entre la iteración y n, siendo n el número introducido.

1 -> 1
2 -> 2
...
n-1 -> n-1
n -> n
n+1 -> n+1 - 2
n+2 -> n+2 - 4
...

Es sencillo, sólo hay que usar % y / correctamente, ponte con un papel y una hoja y en un rato lo sacas. Con 2 for anidados y 7 líneas se tiene.
A ver, el código que yo te he puesto tiene un bucle principal que cuenta desde 0 hasta el número que has introducido y otro bucle anidado que va imprimiendo los caracteres. La segunda parte sería prácticamente igual con otros dos bucles pero contando desde el número-1 hasta 0.
Bueno, pues muchas gracias a todos, ya lo he solucionado.
Bueno, ya que lo has solucionado, te pongo otra solución por si la quieres mirar:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
   int n = atoi(argv[1]);
   char c = argv[2][0];
   int i, j;

   for (i = 1; i <= 2*n-1; i++){
      for (j=0; j < i - (i / n)*(i % n)*2; j++)
         printf("%c", c);
      printf("\n");
   }
}
10 respuestas