Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ianmorar03 en 18 Abril 2016, 21:34 pm



Título: [AYUDA] piramide en c++?
Publicado por: ianmorar03 en 18 Abril 2016, 21:34 pm
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)


Título: Re: [AYUDA] piramide en c++?
Publicado por: HardForo en 18 Abril 2016, 21:43 pm
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(void)
  5. {
  6.    int cols = 7,e,i;
  7.    char c = '*';    
  8.  
  9. e = 0;  
  10. while (e<cols){    
  11.            i = 0;
  12.            while (i<e){
  13.         cout << c;
  14.         i++;
  15.    }
  16.    cout << endl;
  17.    e++;
  18.    }        
  19.  
  20.    return 0;
  21. }
  22.  


Título: Re: [AYUDA] piramide en c++?
Publicado por: crack81 en 18 Abril 2016, 23:07 pm
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.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int i,j=0;
  7.    char caracter;
  8.  
  9.    printf("Ingrese un caracter \n");
  10.    scanf("%c",&caracter);
  11.  
  12.    for(i=0;i<10;i++){
  13.        for(j=0;j<i;j++){
  14.            printf("%c",caracter);
  15.        }
  16.       printf("\n");//saltamos de linea
  17.    }
  18.    //###############################################
  19.  
  20.    return 0;
  21. }
  22.  


Título: Re: [AYUDA] piramide en c++?
Publicado por: ianmorar03 en 19 Abril 2016, 01:27 am
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(void)
  5. {
  6.    int cols = 7,e,i;
  7.    char c = '*';    
  8.  
  9. e = 0;  
  10. while (e<cols){    
  11.     i = 0;
  12.        while (i<e){
  13.         cout << c;
  14.         i++;
  15. }
  16. cout << endl;
  17. e++;
  18.    }        
  19.  
  20.    return 0;
  21. }
  22.  

@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.


Título: Re: [AYUDA] piramide en c++?
Publicado por: fary en 19 Abril 2016, 09:59 am
Uno es el contador de las columnas horizontales y el otro el contador de los asteriscos que tiene que imprimir.

saludos.


Título: Re: [AYUDA] piramide en c++?
Publicado por: HardForo en 19 Abril 2016, 12:38 pm
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:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(void)
  5. {
  6.    int num = 5, pad, inc, row, tmp;
  7.    char c = '*';    
  8.  
  9. // cantidad de caracteres =  suma de los n primeros naturales: n(n+1)/2
  10. pad = num * (num+1) * 0.5;
  11.  
  12. inc = 0; row =1; tmp = 1;
  13. while (inc<pad){
  14. cout << c;
  15. if (tmp==row){
  16. cout << endl;
  17. tmp=0;
  18. row++;
  19. }
  20. inc++;
  21. tmp++;
  22. }
  23.  
  24.    return 0;
  25. }
  26.  


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.


Título: Re: [AYUDA] piramide en c++?
Publicado por: MAFUS en 20 Abril 2016, 12:18 pm
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:
Código:
         *
        ***
       *****
      *******
     *********
    *         *
   ***       ***
  *****     *****
 *******   *******
********* *********

Con una entrada de un 3:
Código:
     *
    ***
   *****
  *     *
 ***   ***
***** *****


Título: Re: [AYUDA] piramide en c++?
Publicado por: HardForo en 20 Abril 2016, 17:05 pm
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)


Título: Re: [AYUDA] piramide en c++?
Publicado por: ivancea96 en 20 Abril 2016, 18:58 pm
Por qué no jaja

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void printWithStrings(unsigned short height, char c = '*'){
  6. int k = height*2-1;
  7. int p = k;
  8. for(int i=0; i<height; i++)
  9. cout << string(k-i, ' ') << string(i*2+1, c) << '\n';
  10. for(int i=0; i<height; i++){
  11. const string &&s = string(i*2+1, c);
  12. cout << string(k/2-i, ' ') << s << string(k-i*2, ' ') << s << '\n';
  13. }
  14. flush(cout);
  15. }
  16.  
  17. void print(unsigned short height, char c = '*'){
  18. int k = height*2-1;
  19. int p = k;
  20. char bSpace[k],
  21.  bChar[k];
  22. for(int i=0; i<k; i++){
  23. bSpace[i] = ' ';
  24. bChar[i] = c;
  25. }
  26. for(int i=0; i<height; i++){
  27. cout.write(bSpace, k-i);
  28. cout.write(bChar, i*2+1);
  29. cout << '\n';
  30. }
  31. for(int i=0; i<height; i++){
  32. cout.write(bSpace, k/2-i);
  33. cout.write(bChar, i*2+1);
  34. cout.write(bSpace, k-i*2);
  35. cout.write(bChar, i*2+1);
  36. cout << '\n';
  37. }
  38. flush(cout);
  39. }
  40.  
  41. int main(){
  42. print(5);
  43. printWithStrings(5);
  44. }

Una forma eficiente y otra menos eficiente xD


Título: Re: [AYUDA] piramide en c++?
Publicado por: MAFUS en 20 Abril 2016, 19:43 pm
Esta es mi solución:
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void printchars(int __char, int ntimes) {
  6.    for(int i = 0; i < ntimes; ++i)
  7.        putchar(__char);
  8. }
  9.  
  10. int main()
  11. {
  12.    int N;
  13.    int nspaces;
  14.    int nasterisks;
  15.    scanf("%d", &N);
  16.  
  17.    nspaces = N * 2 - 1;
  18.  
  19.    nasterisks = 1;
  20.    for(int i = 0; i < N; ++i) {
  21.        printchars(' ', nspaces);
  22.        printchars('*', nasterisks);
  23.        --nspaces;
  24.        nasterisks += 2;
  25.        putchar('\n');
  26.    }
  27.  
  28.    nasterisks = 1;
  29.    for(int i = 0; i < N; ++i) {
  30.        printchars(' ', nspaces);
  31.        printchars('*', nasterisks);
  32.        printchars(' ', (N - i) * 2 - 1);
  33.        printchars('*', nasterisks);
  34.        --nspaces;
  35.        nasterisks += 2;
  36.        putchar('\n');
  37.    }
  38.  
  39.    return 0;
  40. }

Animaos a publicar vuestros códigos. El ejercicio es interesante.


Título: Re: [AYUDA] piramide en c++?
Publicado por: HardForo en 20 Abril 2016, 22:07 pm
No se si es "eficiente" pero esta bien estructurado (a mejorar: no usar variables globales)

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6.  
  7. struct matrix {
  8. int rows,cols;
  9. char **cells;
  10. };
  11.  
  12. matrix m;
  13.  
  14. void make_board(int h,char c=' ');
  15. void put_block(int x,int y, int len, char c = '*');
  16. void triangle(int x,int y, int h, char c = '*');
  17. void render(void);
  18. void release(void);
  19.  
  20.  
  21. int main(void) {
  22. int h = 4;
  23. make_board(h);
  24. triangle(h*2-1,0,h);
  25. triangle(h-1,h,h);
  26. triangle(h*3-1,h,h);
  27. render();
  28. release();
  29.    return 0;
  30. }
  31.  
  32. void make_board(int h, char c=' ')
  33. {
  34. int i,j;
  35.  
  36. m.cols = h*4-1; m.rows = h*2;
  37. m.cells = (char**) malloc(m.cols* sizeof(char*));
  38. for (i=0; i<m.cols; i++)
  39. m.cells[i] = (char*) malloc(m.rows * sizeof(char));
  40.  
  41. for (i=0; i<m.rows; i++)
  42. for (j=0; j<m.cols; j++)
  43. m.cells[i][j]= c;
  44.  
  45. }
  46.  
  47. void release(void){ free(m.cells); }
  48.  
  49. void render(void)
  50. {
  51. int i,j;
  52. for (i=0; i<m.rows; i++){ // fila
  53. for (j=0; j<m.cols; j++) // columna
  54. cout << m.cells[i][j];
  55. cout << endl;
  56.    }
  57. }
  58.  
  59. void put_block(int x,int y, int len, char c = '*'){
  60. int ix, iy=y;
  61. for (ix=x; ix<x+len; ix++){
  62. m.cells[iy][ix] = c;
  63. }
  64. }
  65.  
  66. void triangle(int x,int y, int h, char c = '*')
  67. {
  68. int ix=x,iy,len=1;
  69. for (iy=y; iy<y+h; iy++){
  70. put_block(ix,iy,len,c);
  71. ix--;
  72. len+=2;
  73. }
  74. }
  75.  


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)


Título: Re: [AYUDA] piramide en c++?
Publicado por: MAFUS en 20 Abril 2016, 23:00 pm
Like this! Viene bien, de vez en cuánto realizar pequeños rompecabezas, hace más emocionante esta sección :D


Título: Re: [AYUDA] piramide en c++?
Publicado por: ivancea96 en 20 Abril 2016, 23:08 pm
Venga, ahora que se reciba otro entero, que será las filas de triángulos que habrá.

Para altura 2 y 1 fila:
Código:
 *
***
Para altura 2 y 2 filas:
Código:
   *
  ***
 *   *
*** ***