Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JOSE23 en 22 Febrero 2011, 18:52 pm



Título: FIBONACCI
Publicado por: JOSE23 en 22 Febrero 2011, 18:52 pm
Tengo que hacer el siguiente ejercicio pero no se realizarlo, alguien podria hecharme una mano.

Introducir un número entero positivo. A continuación, mostrar los números de Fibonacci comprendidos entre 1 y el número introducido. Cuando alcancemos el límite (sin sobrepasarlo), el programa mostrará cuántos números de Fibonacci existen entre 0 y el límite señalado.

Se que en Fibonacci --> el primer elemento es 0, el segundo es 1, y cada digito siguiente es la suma de los dos anteriores: 0,1,1,2,3,5,8,13,21...

anterior = actual
actual = anterior + actual

El problema aquí es que ambas variables dependen una de la otra. Cuando cambiamos el valor de una, el valor previo (que es el que nos interesa) se pierde para siempre.

La solución es introducir una variable adicional, para guardar uno de los valores mientras actualizamos las variables. Lo que haremos será guardar el resultado de la suma en una variable nueva.

Las asignaciones correctas son:

suma = anterior + actual
anterior = actual
actual = suma

La cuenta la actualizaremos sumándole 1 en cada paso:

cuenta = cuenta + 1


Título: Re: FIBONACCI
Publicado por: RyogiShiki en 22 Febrero 2011, 19:00 pm
Lo siento no se hacen tareas, a menos que muestres algo de código de tus intentos y dudas específicas nadie podrá ayudarte.

Saludos


Título: Re: FIBONACCI
Publicado por: satu en 22 Febrero 2011, 19:02 pm
Hola

Has explicado el algoritmo perfectamente, ahora pásalo a lenguaje C o C++, piensa un poco antes de pedir ayuda.

Postea lo que lleves hasta ahora

Saludos


Título: Re: FIBONACCI
Publicado por: JOSE23 en 22 Febrero 2011, 19:19 pm
Código:


#include <stdio.h>                   //Librerias que utilizara
#include<conio.h>                          //Librerias que utilizara

main(){                       //Inicio el cuerpo del programa
int num1, num2, suma, numero,cuenta;   //Declaro variables del tipo entero
cuenta=0;
num1=0; num2=1;                   //Inicializo mis variables con valor 1

printf("Ingresa el Numero a calcular por Fibonacci: ");        //Imprimo mensaje solicitando numero limite
scanf("%i",&numero);              //Guardo en una variable el numero limite

printf("\nEl primer numero de Fibonacci es %i", num1);                  //Imprimo el primer numero fibonacci 1

printf("\nEl segundo numero de Fibonacci es %i", num2);               //Imprimo el segundo numero fibonacci 1

 printf ("\nExisten %i numeros de Fibonacci entre 0 y %i",cuenta,numero);
 
do {                                       //Inicializa ciclo do while
   suma=num1+num2;          //se suma num1 y num2 y se guarda en suma
   printf("\nEl valor de la suma es %i", suma);             //se imprime el valor de suma
   num1=num2;                    //se asigan el valor de num2 a num1
   num2=suma;
   cuenta=cuenta+1;                   //se asigna el valor de suma a num2
 
   }  while(suma<=numero);          //se lee la conficion del ciclo suma sea menor o igual al limite, el ciclo seguira realizandose
fflush(stdin);
getchar();  //da una pausa para que se pueda visualizar el resultado

}                   //fin del programa
 

Tengo este codigo, pero no me sale fino


Título: Re: FIBONACCI
Publicado por: satu en 22 Febrero 2011, 19:33 pm
Hola

¿Para que muestras "cuenta" antes del bucle? Lo lógico es mostrarla después, ¿no?

Además tienes que cambiar el bucle que utilizas do-while por un bucle while (acuérdate de inicializar la variable "suma" antes del bucle)

Y léete lo que te dije ayer
- No utilices conio
- main debe devolver un entero
- etc

Saludos

EDITO: utiliza la etiqueta GeSHi para poner el código para que se lea mejor (la tienes al lado del botón de cambio de fuente)


Título: Re: FIBONACCI
Publicado por: RyogiShiki en 22 Febrero 2011, 19:36 pm
Bueno el código claramente tiene varios errores.

En primer lugar te sugiero que no uses Conio, después que comiences el programa con:
Código
  1. int main()
Y que lo termines  con un:
Código
  1. return 0;

Ahora también que inicialices todas tus variables a la hora de declararlas... ahh no te sigo diciendo porque me irrita >.<..... más bien! porfaor antes de que sigas cometiendo errores lee esto: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Ahora estás haciendo mal algunas cosas:
Código
  1. while(suma<=numero);
Esto no realizara el ciclo el número de veces que el usuario quiere, ya que lo estás comparando es con el resultado de la secuencia en el ciclo, debería ser más bien:
Código
  1. while(cuenta<=numero);

También te sugiero que muestres estas lineas después de quepidas e Límite:

Código
  1. printf("\nEl primer numero de Fibonacci es %i", num1);
  2. printf("\nEl segundo numero de Fibonacci es %i", num2);    

Solamente tienes un límite superior más no uno inferior así que no veo el porque de esta linea:
Código
  1. printf ("\nExisten %i numeros de Fibonacci entre 0 y %i",cuenta,numero);
Yade por sí sabes que van a existir "límite" números de la secuencia de Fibonacci

y esto no es un error de programación es un error de entendimiento y redacción:
Código
  1. printf("Ingresa el Numero a calcular por Fibonacci: ");  
debería ser mejor algo parecido a esto:
Código
  1. printf("Ingresa la cantidad de numeros de la secuencia de Fibonacci a calcular: ");  

El resto es cuestión de malos hábitos de programación....


Título: Re: FIBONACCI
Publicado por: JOSE23 en 22 Febrero 2011, 19:43 pm
Gracias por las respuestas, pero NO ENTIENDO!!!


Título: Re: FIBONACCI
Publicado por: satu en 22 Febrero 2011, 19:45 pm
Di qué es lo que no entiendes porque no te vamos a hacer el ejercicio


Título: Re: FIBONACCI
Publicado por: BlackZeroX en 22 Febrero 2011, 19:55 pm
.
En este hilo hay varios codigos de varios usuarios de vb6 realizando el codigo de la maneras mas prolija y tambien mas rapida.

Puedes ver los codigos fuente para darte una idea de como hacerlo.

http://foro.elhacker.net/programacion_visual_basic/reto_isfibonaccinumbern_as_long_as_boolean-t319480.0.html;msg1580947#msg1580947

Temibles Lunas!¡.


Título: Re: FIBONACCI
Publicado por: pajaras en 23 Febrero 2011, 00:38 am
una alternativa es con recursividad, pruebalo, distingue los casos base y aplica el caso recursivo donde la función se llama a sí misma. Una variante interesante, en breves cuelgo el algoritmo, NO en C.

un saludo, pajaras


Título: Re: FIBONACCI
Publicado por: farresito en 23 Febrero 2011, 14:54 pm
Hace unos días la hice también en C++:

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main (void)
  6. {
  7. int a, b, sum;
  8. a = 0;
  9. b = 1;
  10. for (int i = 0; i < 20; i++)
  11. {
  12. sum = a + b;
  13. cout << sum << endl;
  14. a = b;
  15. b = sum;
  16. }
  17. }

SI te fijas, hay un apartado donde hago el bucle; en el ejemplo he puesto hasta 20 carácteres:

Código
  1. for (int i = 0; i < 20; i++)

Solo hace falta que hagas un cin para pedir al usuario un número que se guardará por ejemplo en NUM, y hacer

Código
  1. for (int i = 0; i < NUM; i++)

Donde NUM será la variable que guardará cuantos numeros se mostrarán (los que pida el usuario.

Así que queda:

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main (void)
  6. {
  7. int a, b, sum, num;
  8. a = 0;
  9. b = 1;
  10.  
  11. cout << "Introduce la cantidad de numeros a mostrar: ";
  12. cin >> num;
  13.  
  14. for (int i = 0; i < num; i++)
  15. {
  16. sum = a + b;
  17. cout << sum << endl;
  18. a = b;
  19. b = sum;
  20. }
  21. }

Espero lo hayas entendido y que no haya perdido minutos de mi vida en explicártelo ;)

Un abrazo


Título: Re: FIBONACCI
Publicado por: pajaras en 23 Febrero 2011, 20:48 pm
Funció FibonacciRecursiu (ent n:enter) retorna enter
Var

f:enter
fvar
Si
n=0 o n=1 ----> f:=1
n>1 ----> f:= FibonacciRecursiu(n-1)+FibonacciRecursiu(n-2)
fsi
Retorna f
ffunció

ventajas, es como un while pero la función se llama a sí misma hasta llegar al caso base n=0 o n=1, reduces longitud de codigo considerable.

PD: como te dije, aqui tienes el algorisme de la sucesión de fibonacci, està en catalan mi lengua (si no lo entiendes traductor ;) ) cualquier otra duda, pregunta, espero haberte ayudado.


Título: Re: FIBONACCI
Publicado por: RyogiShiki en 24 Febrero 2011, 00:09 am
Funció FibonacciRecursiu (ent n:enter) retorna enter
Var

f:enter
fvar
Si
n=0 o n=1 ----> f:=1
n>1 ----> f:= FibonacciRecursiu(n-1)+FibonacciRecursiu(n-2)
fsi
Retorna f
ffunció

ventajas, es como un while pero la función se llama a sí misma hasta llegar al caso base n=0 o n=1, reduces longitud de codigo considerable.

PD: como te dije, aqui tienes el algorisme de la sucesión de fibonacci, està en catalan mi lengua (si no lo entiendes traductor ;) ) cualquier otra duda, pregunta, espero haberte ayudado.

No soy muy partidario de la Recursión, la verdad nunca me gustó, me gusta más la iteración, pero bueno, siempre hay muchas buenas y diferentes soluciones a un problema no?

Código
  1. Programa: Secuencia de Fibonacci
  2. Inicio Programa:
  3. Entero CasoInicial = 0
  4. Entero CasoInicial2 = 1
  5. Mostrar CasoInIcial ", " CasoInicial2
  6. Para i = 0 Hasta 13 ConIncremento = 1 Hacer:
  7. Entero j = 0
  8. j = CasoInicial + CasoInicial2
  9. Mostrar ", " j
  10. CasoInicial = CasoInicial2
  11. CasoInicial = j
  12. Fin_Para
  13. Fin_Programa