Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: TaLaP0 XoR BiT en 25 Octubre 2012, 19:25 pm



Título: Recursividad en C++, programas que no comprendo muy bien
Publicado por: TaLaP0 XoR BiT en 25 Octubre 2012, 19:25 pm
Buen dia a todos, he comenzado a estudiar C++, y tengo dudas con las iteraciones y las estructuras repetitivas.

me dejaron un programa que pida un numero que este numero siempre sea impar y que despues imprima lo siguiente:

por ejemplo si introduces el 7

                                  1234567
                                    12345
                                      123
                                       12
                                        1


yo hago:

 for (i=1; i<=7; i++)
       cout<<"i";

Esto me imprime 1234567, mi pregunta es como hago para imprimir la piramide invertida?? no en comprendido muy bien el concepto de anidar los for :( alguien que me explique "en español", se lo agradeceria muchisimo. Gracias de antemano. :huh:



Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: za.asi en 25 Octubre 2012, 19:48 pm
Si quieres la piramide invertida lo que deberías hacer es pedir un numero y luego escribes

Código:
for (n=7, n>0, n--)
   {
    cout <<n;
   }
cout << endl;
for (n=n-1, n<0, n--)
   {
    cout << n;
   }
 


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: TaLaP0 XoR BiT en 25 Octubre 2012, 20:16 pm
Al correrlo el programa escribe

14768890

creo que estan mal anidados los for.  :(

Si quieres la piramide invertida lo que deberías hacer es pedir un numero y luego escribes

Código:
for (n=7, n>0, n--)
   {
    cout <<n;
   }
cout << endl;
for (n=n-1, n<0, n--)
   {
    cout << n;
   }
 


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 25 Octubre 2012, 21:13 pm
Buen dia a todos, he comenzado a estudiar C++, y tengo dudas con las iteraciones y las estructuras repetitivas.

me dejaron un programa que pida un numero que este numero siempre sea impar y que despues imprima lo siguiente:

por ejemplo si introduces el 7

                                  1234567
                                    12345
                                      123
                                       12
                                        1


Citar
Creo que sería más exacto:
                                     1 2 3 4 5 6 7
                                        1 2 3 4 5
                                           1 2 3
                                            1 2
                                             1
Creo que lo he complicado demasiado, no estoy inspirado, pero es lo que te piden:
Código
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int a,cont =0;
  8.    cout << "Introduce un numero IMPAR: "<<endl;
  9.    cin >> a;
  10.    while (a>=0)
  11.       {
  12.            for (int i=1;i<=a;i++)
  13.                cout<<i<<" " ;
  14.            if (a<=3 )
  15.                {a-=1;cont ++;}
  16.            else
  17.                {a-=2;cont+=2 ;}
  18.            cout <<endl << setw(cont) << " ";
  19.       }
  20.    return 0;
  21. }
Redito: tengo que "ajustarlo" para números más grandes de 11.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: TaLaP0 XoR BiT en 25 Octubre 2012, 21:30 pm
Muchas gracias Leonsansan, pero realmente es asi disminuye de a dos no de 1, es decir, en la primera linea saldra 1234567, en la segunda le restamos dos, 12345 y asi sucesivamente. Pero gracias. una cosa mas que libreria es esa <iomanip>???


Creo que lo he complicado demasiado, no estoy inspirado, pero es lo que te piden:
Código
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int a,cont =0;
  8.    cout << "Introduce un numero IMPAR: "<<endl;
  9.    cin >> a;
  10.    while (a>=0)
  11.       {
  12.            for (int i=1;i<=a;i++)
  13.                cout<<i<<" " ;
  14.            if (a<=3 )
  15.                {a-=1;cont ++;}
  16.            else
  17.                {a-=2;cont+=2 ;}
  18.            cout <<endl << setw(cont) << " ";
  19.       }
  20.    return 0;
  21. }
Redito: tengo que "ajustarlo" para números más grandes de 10.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 25 Octubre 2012, 21:37 pm
Muchas gracias Leonsansan, pero realmente es asi disminuye de a dos no de 1, es decir, en la primera linea saldra 1234567, en la segunda le restamos dos, 12345 y asi sucesivamente. Pero gracias. una cosa mas que libreria es esa <iomanip>???
Citar
Entonces el enunciado tiene un fallo ya que al llegar a 12 debajo va el 1 y si no tiene "hueco" irá debajo del 1 o debajo del 2, porque no tendrá sitio en medio de ambos.
La librería es para el uso de "setw· que permite configurar el "espaciado"



Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: TaLaP0 XoR BiT en 25 Octubre 2012, 21:49 pm

Gracias Leosansan, se te agradece mucho me has aclarado todo.





Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: cypascal en 26 Octubre 2012, 00:56 am
Usando unicamente la libreria de entrada salida, el siguiente programa permite la construcción de la piramide que tu quieres hasta el numero 99. Te lo dejo aqui:http://cypascal.blogspot.com.es/2012/10/problema-8-piramide-de-numeros.html (http://cypascal.blogspot.com.es/2012/10/problema-8-piramide-de-numeros.html)

y aqui:
Código:
#include <stdio.h>

int main()
{
int a,cont,espacios;

printf("Introduce un numero IMPAR: "); scanf("%d",&a);
printf("\n\n");

espacios=0;
while (a>=0)
{
if ((a)<8) espacios=espacios+1;
if ((a)>8) espacios=espacios+2;

for (cont=1;cont<=espacios;cont++) printf(" ");
for (cont=1;cont<=a;cont++)
{
printf("%d",cont);
}
printf("\n");
a=a-2;
}
return 0;
}

Espero que te sirva


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 01:45 am
Ya que tu título habla sobre recursividad te voy a dar la solución recursiva y funcional en C. Vale para cualquier entero y si quieres generar la misma figura
que la tuya solo le tienes que poner una condición para que genere correctamente las dos últimas filas.

Uso la librería stdlib.h para malloc y la string.h para jugar con el salto inical.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void figura(int n) {
  6.  
  7. int aux(int n, char * jump) {
  8.  
  9. if (n < -1) return 0;
  10. else {
  11.  
  12. if (n==1) {
  13. jump[strlen(jump)-1] = '\0';
  14. printf("%s1 2\n", jump);
  15. } else if (n==0 || n==-1) {
  16. jump[strlen(jump)-1] = '\0';
  17. printf("%s1\n", jump);
  18. } else {
  19. int i;
  20. printf("%s", jump);
  21. for ( i=1; i<=n; i++ )
  22. printf("%d ", i);
  23. printf("\n");
  24.  
  25. }
  26.  
  27. jump = strcat(jump, "  ");
  28. aux(n-2,jump);
  29. }
  30.  
  31. }
  32.  
  33. char * jump = malloc(n*sizeof(char)+1);
  34. strcpy(jump, "");
  35. aux(n,jump);
  36.  
  37. free(jump);
  38. jump = NULL;
  39.  
  40. }
  41.  
  42. void main (int argc, char * argv[]) {
  43. figura(atoi(argv[1]));
  44. }

Ejemplos de funcionamiento:

Código:
pyxolo@ubuntu:~/Escritorio$ ./f 3
1 2 3
 1 2
  1
pyxolo@ubuntu:~/Escritorio$ ./f 5
1 2 3 4 5
  1 2 3
   1 2
    1
pyxolo@ubuntu:~/Escritorio$ ./f 7
1 2 3 4 5 6 7
  1 2 3 4 5
    1 2 3
     1 2
      1
pyxolo@ubuntu:~/Escritorio$ ./f 9
1 2 3 4 5 6 7 8 9
  1 2 3 4 5 6 7
    1 2 3 4 5
      1 2 3
       1 2
        1
pyxolo@ubuntu:~/Escritorio$ ./f 11
1 2 3 4 5 6 7 8 9 10 11
  1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7
      1 2 3 4 5
        1 2 3
         1 2
          1
pyxolo@ubuntu:~/Escritorio$ ./f 13
1 2 3 4 5 6 7 8 9 10 11 12 13
  1 2 3 4 5 6 7 8 9 10 11
    1 2 3 4 5 6 7 8 9
      1 2 3 4 5 6 7
        1 2 3 4 5
          1 2 3
           1 2
            1
pyxolo@ubuntu:~/Escritorio$ ./f 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  1 2 3 4 5 6 7 8 9 10 11 12 13
    1 2 3 4 5 6 7 8 9 10 11
      1 2 3 4 5 6 7 8 9
        1 2 3 4 5 6 7
          1 2 3 4 5
            1 2 3
             1 2
              1



Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 26 Octubre 2012, 12:00 pm
Sólo tiene un pequeño fallo, no "termina" de hacer lo que quiere. En tú código se produce el resultado
1234567
  12345
    123
      1
cuando debería ser:
1 2 3 4 5 6 7
   1 2 3 4 5
     1 2 3
       1 2   <=== ésta faltaría en tú código.
        1
Saludos!.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 15:23 pm
...y si quieres generar la misma figura que la tuya solo le tienes que poner una condición para que genere correctamente las dos últimas filas.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 26 Octubre 2012, 15:39 pm
...y si quieres generar la misma figura que la tuya solo le tienes que poner una condición para que genere correctamente las dos últimas filas.
Lo haría con el código de cypascal, pero el tuyo es demasiado "denso": realmente has sacado la artillería pesada: strcpy, strcat, malloc ....
Pero reconozco que lo has "bordado", me parece increible.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 15:45 pm
Lo haría con el código de cypascal, pero el tuyo es demasiado "denso": realmente has sacado la artillería pesada: strcpy, strcat, malloc ....
Pero reconozco que lo has "bordado", me parece increible.


Opino lo mismo que tú :P

PD: ya modifiqué el código para que sea exactamente la figura que se pide.


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 26 Octubre 2012, 17:55 pm
Opino lo mismo que tú :P
PD: ya modifiqué el código para que sea exactamente la figura que se pide.
Corrige algo porque sólo me sale " 1 ". No veo la sentencia - scanf- que permita entrar el tamaño de la figura. Supongo que estoy torpe, pero no me "cuadra" el código sin un scanf o un tamaño predeterminado. Perdona las observaciones. ¿O lo entras por el terminal?. Sí, eso es de ahí la conversión atoi. OK. Aclarado. Basta cambiar
Código
  1. figura(atoi(argv[1]));
  2. por
  3.        int num;
  4. printf ("Entre un numero IMPAR:");
  5. scanf ("%d",&num);
  6. figura(num);
Pero no funciona correctamente ya que el 1 2 están desplazados una posición más a la derecha de lo que deberían; lo mismo le pasa al último 1.Saludos!


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 22:22 pm
Corrige algo porque sólo me sale " 1 ". No veo la sentencia - scanf- que permita entrar el tamaño de la figura. Supongo que estoy torpe, pero no me "cuadra" el código sin un scanf o un tamaño predeterminado. Perdona las observaciones. ¿O lo entras por el terminal?. Sí, eso es de ahí la conversión atoi. OK. Aclarado. Basta cambiar
Código
  1. figura(atoi(argv[1]));
  2. por
  3.        int num;
  4. printf ("Entre un numero IMPAR:");
  5. scanf ("%d",&num);
  6. figura(num);
Pero no funciona correctamente ya que el 1 2 están desplazados una posición más a la derecha de lo que deberían; lo mismo le pasa al último 1.Saludos!

Disculpa, no me fijé. Es sencillo, para esos dos casos, basta con rectificar su salto inicial (jump) en un espacio.

Código modificado.

PD: cuidado con recoger valores numéricos por teclado  :D


Título: Re: Recursividad en C++, programas que no comprendo muy bien
Publicado por: leosansan en 27 Octubre 2012, 00:31 am
Código modificado.
PD: cuidado con recoger valores numéricos por teclado  :D
;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
Y yo que creía que mi código lo había hecho demasiado complejo.....
Desde que tenga tiempo trataré de implementarlo con recursividad, pero más "humanizado"  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

REEDITO:

Ya lo tengo con recursividad y sin la "artilleria pesada"  :rolleyes: :rolleyes:
Código
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int cont=0;
  5. int dibuja (int a);
  6. int main()
  7. {
  8.    int a,cont =0;
  9.    cout << "Introduce un numero IMPAR: "<<endl;
  10.    cin >> a;
  11.    dibuja (a);
  12.    return 0;
  13. }
  14. int dibuja (int a)
  15. {
  16.    if (a==0) return 1;
  17.    for (int i=1;i<=a;i++)
  18.                cout<<i<<" " ;
  19.    cout <<endl << setw(cont) << " ";
  20.    if (a<=3 )
  21.                {cont ++;dibuja (a-1);}
  22.    else
  23.                {cont+=2;dibuja (a-2);}
  24.  
  25. }

Ahora en serio, envidio tus conocimientos en C++, yo me manejo mejor en C - y estoy empezando- y apenas en C++. Tu código demuestra un conocimiento y manejo de librerias, comandos y punteros que ya quisiera yo para mí.
...... Pero no me negaras que mi código es más "humano".
:silbar: :silbar: :silbar: