Hola! quisiera saber como hacer una piramide en c++?
pidiendo en un char la letra o lo que quiera (en este caso un asterisco'*') y en otra pidiendo la dimension; por ejemplo si es 7 seria algo asi como:
*
**
***
****
*****
******
*******
Sin hacer uso de for, unicamente con while y sin las librerias de c(conio.h y stdio.h)
#include <iostream>
using namespace std;
int main(void)
{
int cols = 7,e,i;
char c = '*';
e = 0;
while (e<cols){
i = 0;
while (i<e){
cout << c;
i++;
}
cout << endl;
e++;
}
return 0;
}
Hola te dejo el primer ejemplo hecho en C el segundo te toca a ti, es practicamente los mismo.
Si te cuesta realizar el segundo necesitas repasar nuevamente tus conceptos de programacion.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j=0;
char caracter;
printf("Ingrese un caracter \n");
scanf("%c",&caracter);
for(i=0;i<10;i++){
for(j=0;j<i;j++){
printf("%c",caracter);
}
printf("\n");//saltamos de linea
}
//###############################################
return 0;
}
Cita de: boctulus en 18 Abril 2016, 21:43 PM
#include <iostream>
using namespace std;
int main(void)
{
int cols = 7,e,i;
char c = '*';
e = 0;
while (e<cols){
i = 0;
while (i<e){
cout << c;
i++;
}
cout << endl;
e++;
}
return 0;
}
@boctulus es lo que necesito, sin embargo no entiendo muy bien la funcion de las variables i y e en el codigo.
@crack81 muchas gracias por la respuesta, igual use tu codigo, cambiandolo a c++ y los for a while y me funciono aunque sigo con la pregunta de que es la i y la j en el codigo.
Uno es el contador de las columnas horizontales y el otro el contador de los asteriscos que tiene que imprimir.
saludos.
i,j o e,i son variables de control de lazo (bucle, ciclo)
Se podria haber hecho con un solo while() si sabes cuantos caracteres esperas al final:
#include <iostream>
using namespace std;
int main(void)
{
int num = 5, pad, inc, row, tmp;
char c = '*';
// cantidad de caracteres = suma de los n primeros naturales: n(n+1)/2
pad = num * (num+1) * 0.5;
inc = 0; row =1; tmp = 1;
while (inc<pad){
cout << c;
if (tmp==row){
cout << endl;
tmp=0;
row++;
}
inc++;
tmp++;
}
return 0;
}
Este tipo de problemas se puden resolver con 2 bucles pero tambien con 1 bucle + 1 if() interno y seria como hacer una transformacion del mundo (x,y) al (u,v) :
(bucle externo, bucle interno) ---> (bucle externo 2, if interno)
El bucle externo no es el mismo y por tanto el if() interno no reemplaza (estoy editando mi respuesta) al bucle interno. Por esto se puede hablar de transformación (https://es.wikipedia.org/wiki/Transformaci%C3%B3n_(funci%C3%B3n)) en sentido matematico.
PD: ya habia dado una respuesta......... pero no daré respuestas a ejercicios completos en otros hilos. Me disculpo por eso.
Os propongo un ejecicio:
Realizar la figura que se muestra a continuación en el ejemplo.
El programa debe aceptar un entero que representa la altura de los triangulos pequeños que forman el total.
Así, con la entrada de un 5 se consigue:
*
***
*****
*******
*********
* *
*** ***
***** *****
******* *******
********* *********
Con una entrada de un 3:
*
***
*****
* *
*** ***
***** *****
Lo mas facil seria crear una matriz bidimensional de 2H*2H siendo H la altura del trinangulo, hacer una simple funcion que cree el triangulo con un caracter, y colocar el "cursor" dentro de la matriz donde se necesite e ir pintando cada triangulo
(sin son los llenos con asteriscos son solo 3 de ellos, si son rellenos con espacios sobre un fondo de asteriscos son mas triangulos y ni siquiera son equilateros)
Por qué no jaja
#include <iostream>
using namespace std;
void printWithStrings(unsigned short height, char c = '*'){
int k = height*2-1;
int p = k;
for(int i=0; i<height; i++)
cout << string(k-i, ' ') << string(i*2+1, c) << '\n';
for(int i=0; i<height; i++){
const string &&s = string(i*2+1, c);
cout << string(k/2-i, ' ') << s << string(k-i*2, ' ') << s << '\n';
}
flush(cout);
}
void print(unsigned short height, char c = '*'){
int k = height*2-1;
int p = k;
char bSpace[k],
bChar[k];
for(int i=0; i<k; i++){
bSpace[i] = ' ';
bChar[i] = c;
}
for(int i=0; i<height; i++){
cout.write(bSpace, k-i);
cout.write(bChar, i*2+1);
cout << '\n';
}
for(int i=0; i<height; i++){
cout.write(bSpace, k/2-i);
cout.write(bChar, i*2+1);
cout.write(bSpace, k-i*2);
cout.write(bChar, i*2+1);
cout << '\n';
}
flush(cout);
}
int main(){
print(5);
printWithStrings(5);
}
Una forma eficiente y otra menos eficiente xD
Esta es mi solución:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void printchars(int __char, int ntimes) {
for(int i = 0; i < ntimes; ++i)
putchar(__char);
}
int main()
{
int N;
int nspaces;
int nasterisks;
scanf("%d", &N);
nspaces = N * 2 - 1;
nasterisks = 1;
for(int i = 0; i < N; ++i) {
printchars(' ', nspaces);
printchars('*', nasterisks);
--nspaces;
nasterisks += 2;
putchar('\n');
}
nasterisks = 1;
for(int i = 0; i < N; ++i) {
printchars(' ', nspaces);
printchars('*', nasterisks);
printchars(' ', (N - i) * 2 - 1);
printchars('*', nasterisks);
--nspaces;
nasterisks += 2;
putchar('\n');
}
return 0;
}
Animaos a publicar vuestros códigos. El ejercicio es interesante.
No se si es "eficiente" pero esta bien estructurado (a mejorar: no usar variables globales)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct matrix {
int rows,cols;
char **cells;
};
matrix m;
void make_board(int h,char c=' ');
void put_block(int x,int y, int len, char c = '*');
void triangle(int x,int y, int h, char c = '*');
void render(void);
void release(void);
int main(void) {
int h = 4;
make_board(h);
triangle(h*2-1,0,h);
triangle(h-1,h,h);
triangle(h*3-1,h,h);
render();
release();
return 0;
}
void make_board(int h, char c=' ')
{
int i,j;
m.cols = h*4-1; m.rows = h*2;
m.cells = (char**) malloc(m.cols* sizeof(char*));
for (i=0; i<m.cols; i++)
m.cells[i] = (char*) malloc(m.rows * sizeof(char));
for (i=0; i<m.rows; i++)
for (j=0; j<m.cols; j++)
m.cells[i][j]= c;
}
void release(void){ free(m.cells); }
void render(void)
{
int i,j;
for (i=0; i<m.rows; i++){ // fila
for (j=0; j<m.cols; j++) // columna
cout << m.cells[i][j];
cout << endl;
}
}
void put_block(int x,int y, int len, char c = '*'){
int ix, iy=y;
for (ix=x; ix<x+len; ix++){
m.cells[iy][ix] = c;
}
}
void triangle(int x,int y, int h, char c = '*')
{
int ix=x,iy,len=1;
for (iy=y; iy<y+h; iy++){
put_block(ix,iy,len,c);
ix--;
len+=2;
}
}
UPDATE: hay una mini-libreria que he hecho y sirve para hacer eso mucho mas facil aun, aqui (http://foro.elhacker.net/programacion_cc/dibuje_una_piramide_rombo_pacman_xd-t451426.0.html)
Like this! Viene bien, de vez en cuánto realizar pequeños rompecabezas, hace más emocionante esta sección :D
Venga, ahora que se reciba otro entero, que será las filas de triángulos que habrá.
Para altura 2 y 1 fila:
*
***
Para altura 2 y 2 filas:
*
***
* *
*** ***