'''
Objetivo del programa (descripción del problema que resuelve):
Se solicita al usuario un número de término de la sucesión de Fibonacci, y se muestra su valor, calculado con el número de oro.

Autor/es: Prof. Servetto

Versión: 1

Análisis de Casos (número de caso, estado inicial, transformación, estado final -se consideran casos base para la prueba del programa):
12: int(nroOro**12 / 5**0.5 + 0.5), nroOro=(1 + 5**0.5) / 2 <-- 5**0.5 equivale a la raíz cuadrada de 5

Síntesis de Casos (composición de casos para la generalización):
leer nTérmino
nroOro=(1.0 + 5.0**0.5) / 2.0
imprimir int(nroOro**nTérmino / 5.0**0.5 + 0.5) <-- para evitar conversiones automáticas y mejorar la eficiencia, se expresan todos
                                                    los números de la fórmula para que se representen en punto flotante

Recursos (variables y funciones del programa -nombre y propósito)

    Datos a solicitar al usuario (sea en el prólogo o sea durante la resolución):
    nTérmino, número de término
    
    Auxiliares (necesarios para transformaciones intermedias):
    nroOro, número áureo o de oro
    
    Resultados (a informar sea durante el desarrollo o en el epílogo):

    Funciones propias (necesarias para la descomposición del problema en subproblemas):

'''
# DEFINICIÓN DE FUNCIONES (si se requieren para descomponer la solución del problema)
#def nom_función():
'''
    Recibe (descripción de parámetros de la función -tipo de valores-, si es que tiene):

    Objetivo (descripción de lo que hace o devuelve):

    Análisis de Casos (número de caso, estado inicial, transformación, estado final -se consideran casos base para la prueba
    de la función):

    Síntesis de Casos (composición de casos para la generalización):

    Recursos (variables o funciones internas -nombre y propósito)

    Auxiliares (necesarios para transformaciones intermedias):

    Resultados (si la función devuelve):

    Funciones internas (necesarias para la descomposición del problema en subproblemas):

    '''
    #1 PRÓLOGO
    # Establecimiento de valores iniciales para datos auxiliares o que se transformarán en resultados (opcional)

    #2 RESOLUCIÓN
    # Descomposición del problema en subproblemas 2.x que a su vez pueden requerir inicialización de datos o mostrar resultados

    #3 EPÍLOGO
    # Devolución de valor o valores o muestra de resultados

# PROGRAMA    
#1 PRÓLOGO
#1.1 Presentación
#1.1.1 Impresión del título del programa en pantalla
print('CÁLCULO DE UN TÉRMINO DE LA SUCESIÓN DE FIBONACCI\n')

#1.1.2 Descripción o aclaraciones al usuario (opcional)

#1.2 Datos iniciales 
#1.2.1 Solicitud e ingreso de datos desde teclado (opcional, si los datos se piden durante la resolución)
# conversión a número de entero de la cadena que ingresa por teclado:
nTérmino = int(input('Ingrese el número de término que desea obtener: '))

#1.2.2 Establecimiento de valores iniciales para datos auxiliares o que se transformarán en resultados (opcional)
nroOro = (1.0 + 5.0**0.5) / 2.0

#2 RESOLUCIÓN
# Descomposición del problema en subproblemas 2.x que a su vez pueden requerir ingreso o inicialización de datos o mostrar resultados

#3 EPÍLOGO
#3.1 Muestra de la solución del problema por pantalla (opcional, si sólo se muestran resultados durante la resolución)
print(f'\nEl término {nTérmino} es {int(nroOro**nTérmino / 5.0**0.5 + 0.5)}') # impresión con cadena de formato f'...'

#3.2 Pausa para ver resultados en pantalla que se puede obviar, si los resultados se van mostrando durante la resolución
print() # salto de línea
input('Pulse tecla Enter para terminar el programa...') # pausa forzada
