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

  1. Definición de Requisitos
  2. Diseño del Programa
  3. Implementación de Funciones Matemáticas
  4. Manejo de Entrada y Salida
  5. Integración y Pruebas

  1. 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.

  1. 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:

  1. Mostrar menú de opciones.
  2. Leer la opción seleccionada por el usuario.
  3. Solicitar los datos necesarios para la operación.
  4. Llamar a la función correspondiente.
  5. Mostrar el resultado.
  6. Repetir hasta que el usuario decida salir.

  1. 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

  1. 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

  1. 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.

© Copyright 2024. Todos los derechos reservados