Recursividad en C++, programas que no comprendo muy bien

Iniciado por TaLaP0 XoR BiT, 25 Octubre 2012, 19:25 PM

0 Miembros y 4 Visitantes están viendo este tema.

TaLaP0 XoR BiT

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:


za.asi

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

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

TaLaP0 XoR BiT

Al correrlo el programa escribe

14768890

creo que estan mal anidados los for.  :(

Cita de: 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

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


leosansan

#3
Cita de: 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


CitarCreo 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 (cpp) [Seleccionar]
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
   int a,cont =0;
   cout << "Introduce un numero IMPAR: "<<endl;
   cin >> a;
   while (a>=0)
      {
           for (int i=1;i<=a;i++)
               cout<<i<<" " ;
           if (a<=3 )
               {a-=1;cont ++;}
           else
               {a-=2;cont+=2 ;}
           cout <<endl << setw(cont) << " ";
      }
   return 0;
}

Redito: tengo que "ajustarlo" para números más grandes de 11.

TaLaP0 XoR BiT

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>???


Cita de: leosansan en 25 Octubre 2012, 21:13 PM
Creo que lo he complicado demasiado, no estoy inspirado, pero es lo que te piden:
Código (cpp) [Seleccionar]
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
   int a,cont =0;
   cout << "Introduce un numero IMPAR: "<<endl;
   cin >> a;
   while (a>=0)
      {
           for (int i=1;i<=a;i++)
               cout<<i<<" " ;
           if (a<=3 )
               {a-=1;cont ++;}
           else
               {a-=2;cont+=2 ;}
           cout <<endl << setw(cont) << " ";
      }
   return 0;
}

Redito: tengo que "ajustarlo" para números más grandes de 10.

leosansan

Cita de: 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>???
CitarEntonces 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"

TaLaP0 XoR BiT


cypascal

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

y aqui:
#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
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

BatchianoISpyxolo

#8
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.

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

void figura(int n) {

int aux(int n, char * jump) {

if (n < -1) return 0;
else {

if (n==1) {
jump[strlen(jump)-1] = '\0';
printf("%s1 2\n", jump);
} else if (n==0 || n==-1) {
jump[strlen(jump)-1] = '\0';
printf("%s1\n", jump);
} else {
int i;
printf("%s", jump);
for ( i=1; i<=n; i++ )
printf("%d ", i);
printf("\n");

}

jump = strcat(jump, "  ");
aux(n-2,jump);
}

}

char * jump = malloc(n*sizeof(char)+1);
strcpy(jump, "");
aux(n,jump);

free(jump);
jump = NULL;

}

void main (int argc, char * argv[]) {
figura(atoi(argv[1]));
}


Ejemplos de funcionamiento:

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

Puede que desees aprender a programar desde 0: www.espascal.es

leosansan

#9
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!.