En este módulo, vamos a aplicar los conocimientos adquiridos a lo largo del curso para construir una calculadora científica en Fortran. Este proyecto integrará varios conceptos fundamentales y avanzados, como el manejo de variables, estructuras de control, funciones y subrutinas, y manejo de entrada y salida.
Objetivos del Módulo
- Aplicar conceptos básicos y avanzados de Fortran en un proyecto práctico.
- Desarrollar habilidades en la estructuración y organización de código.
- Implementar funciones matemáticas comunes en una calculadora científica.
- Manejar la entrada y salida de datos de manera eficiente.
Estructura del Proyecto
- Definición de Requisitos
- Diseño del Programa
- Implementación de Funciones Matemáticas
- Manejo de Entrada y Salida
- Integración y Pruebas
- Definición de Requisitos
La calculadora científica debe ser capaz de realizar las siguientes operaciones:
- Suma, resta, multiplicación y división.
- Potenciación y radicación.
- Funciones trigonométricas (seno, coseno, tangente).
- Logaritmos y exponenciales.
- Diseño del Programa
El programa se estructurará en varias subrutinas y funciones para mantener el código organizado y modular. A continuación, se presenta un diagrama de flujo básico del programa:
- Mostrar menú de opciones.
- Leer la opción seleccionada por el usuario.
- Solicitar los datos necesarios para la operación.
- Llamar a la función correspondiente.
- Mostrar el resultado.
- Repetir hasta que el usuario decida salir.
- Implementación de Funciones Matemáticas
Funciones Básicas
function add(a, b) real :: add real, intent(in) :: a, b add = a + b end function add function subtract(a, b) real :: subtract real, intent(in) :: a, b subtract = a - b end function subtract function multiply(a, b) real :: multiply real, intent(in) :: a, b multiply = a * b end function multiply function divide(a, b) real :: divide real, intent(in) :: a, b if (b /= 0.0) then divide = a / b else print *, "Error: División por cero" divide = 0.0 end if end function divide
Funciones Avanzadas
function power(base, exponent) real :: power real, intent(in) :: base, exponent power = base ** exponent end function power function sqrt(value) real :: sqrt real, intent(in) :: value if (value >= 0.0) then sqrt = sqrt(value) else print *, "Error: Raíz cuadrada de un número negativo" sqrt = 0.0 end if end function sqrt function sine(angle) real :: sine real, intent(in) :: angle sine = sin(angle) end function sine function cosine(angle) real :: cosine real, intent(in) :: angle cosine = cos(angle) end function cosine function tangent(angle) real :: tangent real, intent(in) :: angle tangent = tan(angle) end function tangent function logarithm(value) real :: logarithm real, intent(in) :: value if (value > 0.0) then logarithm = log(value) else print *, "Error: Logaritmo de un número no positivo" logarithm = 0.0 end if end function logarithm function exponential(value) real :: exponential real, intent(in) :: value exponential = exp(value) end function exponential
- Manejo de Entrada y Salida
Menú de Opciones
subroutine show_menu() print *, "Calculadora Científica" print *, "1. Suma" print *, "2. Resta" print *, "3. Multiplicación" print *, "4. División" print *, "5. Potenciación" print *, "6. Raíz Cuadrada" print *, "7. Seno" print *, "8. Coseno" print *, "9. Tangente" print *, "10. Logaritmo" print *, "11. Exponencial" print *, "0. Salir" end subroutine show_menu
Lectura de Opción y Datos
subroutine read_option(option) integer, intent(out) :: option print *, "Seleccione una opción: " read *, option end subroutine read_option subroutine read_two_numbers(a, b) real, intent(out) :: a, b print *, "Ingrese dos números: " read *, a, b end subroutine read_two_numbers subroutine read_one_number(a) real, intent(out) :: a print *, "Ingrese un número: " read *, a end subroutine read_one_number
- Integración y Pruebas
Programa Principal
program scientific_calculator implicit none integer :: option real :: a, b, result do call show_menu() call read_option(option) select case (option) case (1) call read_two_numbers(a, b) result = add(a, b) print *, "Resultado: ", result case (2) call read_two_numbers(a, b) result = subtract(a, b) print *, "Resultado: ", result case (3) call read_two_numbers(a, b) result = multiply(a, b) print *, "Resultado: ", result case (4) call read_two_numbers(a, b) result = divide(a, b) print *, "Resultado: ", result case (5) call read_two_numbers(a, b) result = power(a, b) print *, "Resultado: ", result case (6) call read_one_number(a) result = sqrt(a) print *, "Resultado: ", result case (7) call read_one_number(a) result = sine(a) print *, "Resultado: ", result case (8) call read_one_number(a) result = cosine(a) print *, "Resultado: ", result case (9) call read_one_number(a) result = tangent(a) print *, "Resultado: ", result case (10) call read_one_number(a) result = logarithm(a) print *, "Resultado: ", result case (11) call read_one_number(a) result = exponential(a) print *, "Resultado: ", result case (0) exit case default print *, "Opción no válida. Intente de nuevo." end select end do end program scientific_calculator
Conclusión
En este módulo, hemos construido una calculadora científica en Fortran, integrando varios conceptos fundamentales y avanzados del lenguaje. Este proyecto no solo refuerza el conocimiento adquirido, sino que también proporciona una base sólida para abordar problemas más complejos en el futuro. Asegúrate de probar y depurar tu programa para garantizar su correcto funcionamiento y mejorar tus habilidades de programación en Fortran.
Curso de Programación en Fortran
Módulo 1: Introducción a Fortran
- Introducción a Fortran
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Escribiendo tu Primer Programa en Fortran
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Entrada y Salida
- Estructuras de Control: Sentencias If
- Estructuras de Control: Bucles
Módulo 3: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Manejo de Cadenas
- Operaciones con Arreglos y Cadenas
Módulo 4: Procedimientos y Funciones
Módulo 5: Estructuras de Datos Avanzadas
Módulo 6: Manejo de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Posicionamiento de Archivos
- Operaciones con Archivos Binarios
Módulo 7: Temas Avanzados
Módulo 8: Mejores Prácticas y Optimización
- Técnicas de Optimización de Código
- Depuración y Perfilado
- Escribiendo Código Mantenible
- Estándares y Portabilidad de Fortran