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:
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;
}
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;
}
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:#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.
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:
#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.
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"
Gracias Leosansan, se te agradece mucho me has aclarado todo.
Cita de: leosansan en 25 Octubre 2012, 21:37 PM
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:
#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
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
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!.
Cita de: BatchianoISpyxolo en 26 Octubre 2012, 01:45 AM
...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.
Cita de: 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.
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.
Cita de: leosansan en 26 Octubre 2012, 15:39 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.
Cita de: BatchianoISpyxolo en 26 Octubre 2012, 15:45 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
figura(atoi(argv[1]));
por
int num;
printf ("Entre un numero IMPAR:");
scanf ("%d",&num);
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!
Cita de: leosansan en 26 Octubre 2012, 17:55 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
figura(atoi(argv[1]));
por
int num;
printf ("Entre un numero IMPAR:");
scanf ("%d",&num);
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
Cita de: BatchianoISpyxolo en 26 Octubre 2012, 22:22 PM
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:
#include <iostream>
#include <iomanip>
using namespace std;
int cont=0;
int dibuja (int a);
int main()
{
int a,cont =0;
cout << "Introduce un numero IMPAR: "<<endl;
cin >> a;
dibuja (a);
return 0;
}
int dibuja (int a)
{
if (a==0) return 1;
for (int i=1;i<=a;i++)
cout<<i<<" " ;
cout <<endl << setw(cont) << " ";
if (a<=3 )
{cont ++;dibuja (a-1);}
else
{cont+=2;dibuja (a-2);}
}
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: