Ayuda programación C

Tengo que hacer un programa (sin usar funciones) en C que me saque la secuencia de Fibonacci hasta X número que yo introduzca por teclado y no tengo ni idea [buuuaaaa]

La secuencia de Fibonacci es esta

1 1 2 3 5 8 13 21 .... (se van sumando los dos ultimos)
Lo tienes mamado, o utilizas una variable para guardar la ultima cifra empleada y el último resultado o directamente usas punteros.

A tu gusto.


PD:

variable 1 = ultima cifra empleada
variable 2 = resultado de la operación de la suma

la suma de variable 1 + variable 2 = resultado

todo eso lo englobas en un bucle hasta el número que le indiques por pantalla y a tomar por saco.


PD2: (aqui te hago hasta el programa yo, eso si en pseudocódigo)

Sabes siempre que todo empieza en 1 más si mismo. Asi que haces siempre el 1+1 y guardas la última cifra en la variable 1 que te he dicho y el resultado de la suma en la variable 2.

Ahi haces variable 1 (=1) + variable 2 (=2) y te dará el resultado (=3). Repites el proceso en un FOR hasta el número que introduzcas en pantalla y tracatá pim pum pam.

Son 10.000 que estoy pillado economicamente. Y en serio el problema era muy sencillo estoy seguro que comiendote el coco 2 minutos lo hubieras hecho con la minga-dominga


#studio.h


var1 = 1
var2 = 1
var3 = 0 (inicializarla aunque sea)

for hasta el numero indicado en pantalla
{
var3 = var1+var2
mostrar var 3
var1=var2
var2=var3
}


PD3: si quieres te lo explico también con punteros usando direcciones de memoria, está divertido aunque ahora no tengo tiempo ^^* y a parte que si no los has dado poco sentido tiene.
Ya veo que te han respondido a tus dudas pero la siguiente vez que tengas dudas de C o C++ tienes AQUI el hilo sobre programacion en C/C++
Juas, ese exactamente ese mismo ejercicio tuve que hacer yo hace como un mes y pico. Anda echale ganas, que no es tan dificil.

Salu2!
La función de Fibonacci en programación se usa para explicar la recursividad. Puedes resolverlo iterativamente, como te han explicado aqui, pero sin duda no es la mejor solución.

En pseudocódigo:

fib(n) = 1 ----------------------------> Si n = 1 Ó n = 2
fib(n) = fib(n-1) + fib(n-2)------------> Si n > 2


Intenta pensalo, sino aqui tienes la solución:

int fib(int n){

if ((n==1)||(n==2))
return 1;
else
return (fib(n-1)+fib(n-2));
}



Éste es el típico ejemplo de cuando se debe usar un algoritmo recursivo y cuando no.

Un saludo
Bronx escribió:Éste es el típico ejemplo de cuando se debe usar un algoritmo recursivo y cuando no.

Un saludo


Ha especificado que no debe utilizar funciones.
jorcoval escribió:Ha especificado que no debe utilizar funciones.


Anda, no me acordaba de esa parte...entonces no hay más cojones que hacerlo iterativo.

Bueno, pues para cuando te toque hacerlo recursivo ya lo tienes xD

Un saludo
Ahi no está usando funciones, es que está cantado que es para enseñar recursividad. Ese programa lo he hecho hasta en Lisp y siempre es para usar recursividad.

Aún así, si tus profesores son malos profesores XD debes aplicar un bucle e ir guardando los valores de fibonnaci anteriores como te han comentado teniendo cuidado de acordarte que fibonacci de 1 y de 2 es igual a 1.

(Pasando de hacer las comprobaciones de error miradme si hay algun fallo que me acabo de levantar XD)
Por supuesto mejor que esta versión es la recursiva 10000 veces


int main (int argc, char *argv)
{
int fibonacci1= 1, fibonacci2= 1, aux;
int resultado =0;
int n,i;

n= atoi (argv[1])

if (( n == 1) || ( n == 2))
return 1;

for ( i = 2;i{
aux = resultado; //Guardamos el anterio fibonacci
resultado = fibonacci 1 + fibonacci 2; //actualizamos el resultado
fibonacci1= fibonacci 2; //actualizamos el fibonacci1
fibonacci2= aux; //actualizamos el fibonacci2
}

return resultado;
}


P.D. Si no lo intentas nunca vas a aprender....
Aracem escribió:Ahi no está usando funciones, es que está cantado que es para enseñar recursividad. Ese programa lo he hecho hasta en Lisp y siempre es para usar recursividad.


Yo llevo varios años dando clases de programación en una academia, y la verdad es que siempre es el típico ejemplo que uso para explicar la diferencia entre recursividad e iteración, bueno éste, el de la potencia, el del factorial y de las torres de hanoi.

Por la propia definición de la serie, éste algoritmo se debe resolver recursivamente, pero si no le dejan usar funciónes, sino sólo variables pues hay q hacerlo iterativo por narices.

Saludos
Bronx escribió:

Yo llevo varios años dando clases de programación en una academia, y la verdad es que siempre es el típico ejemplo que uso para explicar la diferencia entre recursividad e iteración, bueno éste, el de la potencia, el del factorial y de las torres de hanoi.


Si, esos 4 ejemplos son típicos de la recursividad. Son como el "hola mundo" de la recursividad [plas]
Bronx escribió:Éste es el típico ejemplo de cuando se debe usar un algoritmo recursivo y cuando no.

Es el ejemplo del no, ¿no?, porque lo que se dice en términos de eficiencia... xD. Vamos, es el típico ejemplo para explicar la recursividad y más adelante para explicar por qué no siempre es bueno usarla (por si no ha quedado claro).
A ver, esto es lo unico que se me ocurre sin usar funciones

#include
#include
main()
{
int fib1,fib2,fib3,cont,n;
printf("Introduce el numero de elementos a mostrar:\n");
scanf("%d",&n);
fib1=1;
fib2=1;
fib3=0;
for(cont=0;cont<=n;cont++)
{
fib3=fib1+fib2;
printf("%d",fib3);
fib1=fib2;
fib2=fib3;
}
system("PAUSE");
}

Sobra decir que el programa no sale bien, sale un tocho de numeros sin sentido.

No os asusteis el que se me de tan mal programación, estoy haciendo peritos (mecánica)
BiOhAzArD-Zero escribió:A ver, esto es lo unico que se me ocurre sin usar funciones

#include
#include
main()
{
int fib1,fib2,fib3,cont,n;
printf("Introduce el numero de elementos a mostrar:\n");
scanf("%d",&n);
fib1=1;
fib2=1;
fib3=0;
for(cont=0;cont<=n;cont++)
{
fib3=fib1+fib2;
printf("%d",&fib3);
fib1=fib2;
fib2=fib3;
}
system("PAUSE");
}

Sobra decir que el programa no sale bien, sale un tocho de numeros sin sentido.

No os asusteis el que se me de tan mal programación, estoy haciendo peritos (mecánica)


Yo le veo dos fallitos:

El primero que el programa el primer numero que te va a sacar por pantalla es el 2, con lo que te saltas los dos unos del principio. Inicializa fib1=1 y fib2=0(fib3 no hace falta que lo inicialices). Asi te saldra bien toda la serie.

Otro fallito es que has puesto printf("%d",&fib3); y seria printf("%d ",fib3); (deja espacio como yo entre la d y " para que te salgan los numero separados)

Espero haberte podido ayudar.

Un saludo
kNo escribió:Es el ejemplo del no, ¿no?, porque lo que se dice en términos de eficiencia... xD. Vamos, es el típico ejemplo para explicar la recursividad y más adelante para explicar por qué no siempre es bueno usarla (por si no ha quedado claro).


En éste caso, la solución recursiva sería la mejor, ya que la serie de Fibonacci es, por definición, recursiva.

Pero efectivamente como tu dices, el algoritmo iterativo en éste caso sería más eficiente que el recursivo, ya que la recursión tira a complejidades exponenciales.

Además, programando con recursividad dejamos el número de recursiones que en manos de la pila recursiva del sistema (de tamaño limitado). En definitiva, la recursividad sólo se usa en paradigmas basados en la recursión, es decir, que sólo se pueden resolver de ésta forma.

Pero en éste caso, es mejor el método recursivo más que nada por la definición de la serie y por la limpieza y legibilidad de código que te queda resolviéndolo de ésta manera.

a mi me queda algo asi (aunque no lo he probado):

int n1 = 1;
int n2 = 1;
int cont = 2;
int fib;
do
{
cont++;
fib = n2 + n1;
n2 = n1;
n1 = fib;
} while (n != cont);

Nota: tienes que mostrar fib en cada iteración

Salu2
El fallo que comentais de que por pantalla se va a comer los dos unos también lo veo yo, pero es que no se arreglarlo [plas]
BiOhAzArD-Zero escribió:El fallo que comentais de que por pantalla se va a comer los dos unos también lo veo yo, pero es que no se arreglarlo


A ver, se come los dos primeros unos porque la primera vez que escribes fib3 en pantalla su valor es dos, con lo cual escribe fib1 y fib2 en pantalla antes de entrar en el bucle for y ya lo tienes, además si el número que te meten es menor o igual a dos no entraría en el bucle luego funcionaría bien.

Un saludo
No había caído en eso Bronx. Bueno entonces al final solo le tengo que hacer un par de arreglillos sin importancia pero lo principal me salió bien [rtfm]

(que chungo lo veo en el examen sin poder compilar XD)
Sólo de pensar en el coste del algoritmo recursivo comparado con el iterativo me entran temblores [mad][mad]
Aunque como dice algún compañero más arriba, es un muy buen ejemplo de algoritmo recursivo (o donde no usar recursividad si queremos eficiencia XD)
Bueno, creo quel programa queda así (no le he encontrado ningún fallo):

#include
#include
main()
{
int fib1,fib2,fib3,cont,n;
printf("Introduce el numero de elementos a mostrar:\n");
scanf("%d",&n);
fib1=1;
fib2=1;
fib3=0;
if(n==1)
printf("%d\n",fib1);
if(n==2)
printf("%d %d ",fib1,fib2);
if(n!=1 && n!=2)
{
printf("%d %d ",fib1,fib2);
for(cont=2;cont{
fib3=fib1+fib2;
printf("%d ",fib3);
fib1=fib2;
fib2=fib3;
}
}
system("PAUSE");
}


Quizás se podría simplificar algo pero al menos me aseguro de que no me da numeros raros.
Bueno...ahora lo has dejado un poquito peor, los tres primeros ifs antes del bucle sobran totalmente, esos debes quitarlos, y el programa te va a funcionar exactamente igual.

El "if..else" es una sentencia selectiva, y solo se pone cuando en el diagrama de flujo del algoritmo en cuestión existe una bifurcación.

Es decir, te quedaría:

#include
#include
main()
{
int fib1,fib2,fib3,cont,n;
printf("Introduce el numero de elementos a mostrar:\n");
scanf("%d",&n);
fib1=1;
fib2=1;
fib3=0;
printf("%d %d ",fib1,fib2);
for(cont=2;cont{
fib3=fib1+fib2;
printf("%d ",fib3);
fib1=fib2;
fib2=fib3;
}
}
system("PAUSE");
}

Como éstas empezando a programar, te recomiendo que abordes los problemas en el siguiente orden:

1º Diseño en pseudocódigo
2º Diagrama modular
3º Codificación
4º Traza

Es un coñazo hacerlo así, pero con el tiempo irás saltandote pasos y lograrás codificar directamente. Es mejor corregir fallos sobre el pseudocódigo, y una vez que tienes el problema 100% claro ponerte a codificar.


Un saludo
Bronx lo que pasa es que en el tuyo al quitarle los if si le introduces "1" te muestras los dos primeros elementos de Fibonacci "1 1"
Bronx lo que pasa es que en el tuyo al quitarle los if si le introduces "1" te muestras los dos primeros elementos de Fibonacci "1 1"


efectivamente, si la entrada es n>2 entonces dejalo como tú lo tienes y está bien.

Salu2
Porque no lo haces como te dije yo una hoja ams atras, te puse lo que debias de correjir.
nobi porque no me acuerdo que problema tenía, creo que también salian "1 1" cuando le introducias 1 como n
#include
#include
main()
{
int fib1,fib2,fib3,cont,n;
printf("Introduce el numero de elementos a mostrar:\n");
scanf("%d",&n);
fib1=1;
fib2=0;
for(cont=0;cont<=n;cont++)
{
fib3=fib1+fib2;
printf("%d ",fib3);
fib1=fib2;
fib2=fib3;
}

Si no me equioco seria asi.

Saludos
24 respuestas