En aquest tema, construirem una calculadora científica utilitzant Fortran. Aquest projecte ens permetrà aplicar molts dels conceptes apresos al llarg del curs, com ara l'ús de variables, operadors, estructures de control, subrutines i funcions. La calculadora serà capaç de realitzar operacions matemàtiques bàsiques i algunes funcions científiques.

Objectius

  • Aplicar els conceptes bàsics de Fortran en un projecte pràctic.
  • Desenvolupar habilitats en la gestió d'entrada i sortida.
  • Utilitzar subrutines i funcions per modularitzar el codi.
  • Implementar operacions matemàtiques i funcions científiques.

Estructura del Projecte

  1. Introducció i Configuració
  2. Definició de Funcions Matemàtiques
  3. Implementació de l'Entrada i Sortida
  4. Estructura de Control per a la Selecció d'Operacions
  5. Integració i Proves

  1. Introducció i Configuració

1.1. Introducció

Comencem per crear un nou fitxer Fortran per al nostre projecte. Anomenem-lo calculator.f90.

1.2. Configuració

Assegura't de tenir el teu entorn de desenvolupament configurat correctament. Si no ho has fet, revisa el mòdul "Configuració de l'Entorn de Desenvolupament".

  1. Definició de Funcions Matemàtiques

2.1. Operacions Bàsiques

Definim funcions per a les operacions matemàtiques bàsiques: suma, resta, multiplicació i divisió.

! Funció per sumar dos nombres
function add(a, b)
    real :: add
    real, intent(in) :: a, b
    add = a + b
end function add

! Funció per restar dos nombres
function subtract(a, b)
    real :: subtract
    real, intent(in) :: a, b
    subtract = a - b
end function subtract

! Funció per multiplicar dos nombres
function multiply(a, b)
    real :: multiply
    real, intent(in) :: a, b
    multiply = a * b
end function multiply

! Funció per dividir dos nombres
function divide(a, b)
    real :: divide
    real, intent(in) :: a, b
    if (b /= 0.0) then
        divide = a / b
    else
        print *, "Error: Divisió per zero"
        divide = 0.0
    end if
end function divide

2.2. Funcions Científiques

Afegim funcions per a operacions científiques com ara el càlcul de la potència, arrel quadrada i logaritme.

! Funció per calcular la potència
function power(base, exponent)
    real :: power
    real, intent(in) :: base, exponent
    power = base ** exponent
end function power

! Funció per calcular l'arrel quadrada
function square_root(x)
    real :: square_root
    real, intent(in) :: x
    if (x >= 0.0) then
        square_root = sqrt(x)
    else
        print *, "Error: Arrel quadrada de nombre negatiu"
        square_root = 0.0
    end if
end function square_root

! Funció per calcular el logaritme natural
function natural_log(x)
    real :: natural_log
    real, intent(in) :: x
    if (x > 0.0) then
        natural_log = log(x)
    else
        print *, "Error: Logaritme de nombre no positiu"
        natural_log = 0.0
    end if
end function natural_log

  1. Implementació de l'Entrada i Sortida

3.1. Entrada de l'Usuari

Implementem una subrutina per gestionar l'entrada de l'usuari.

subroutine get_user_input(operation, a, b)
    character(len=1) :: operation
    real :: a, b

    print *, "Selecciona una operació (+, -, *, /, ^, r, l):"
    read *, operation
    print *, "Introdueix el primer nombre:"
    read *, a
    if (operation /= 'r' .and. operation /= 'l') then
        print *, "Introdueix el segon nombre:"
        read *, b
    end if
end subroutine get_user_input

3.2. Sortida de Resultats

Implementem una subrutina per mostrar els resultats.

subroutine display_result(result)
    real, intent(in) :: result
    print *, "El resultat és: ", result
end subroutine display_result

  1. Estructura de Control per a la Selecció d'Operacions

4.1. Selecció d'Operació

Utilitzem una estructura de control select case per determinar quina operació realitzar.

program scientific_calculator
    implicit none
    character(len=1) :: operation
    real :: a, b, result

    call get_user_input(operation, a, b)

    select case (operation)
        case ('+')
            result = add(a, b)
        case ('-')
            result = subtract(a, b)
        case ('*')
            result = multiply(a, b)
        case ('/')
            result = divide(a, b)
        case ('^')
            result = power(a, b)
        case ('r')
            result = square_root(a)
        case ('l')
            result = natural_log(a)
        case default
            print *, "Operació no vàlida"
            result = 0.0
    end select

    call display_result(result)
end program scientific_calculator

  1. Integració i Proves

5.1. Integració

Combina totes les funcions i subrutines en un únic fitxer calculator.f90.

5.2. Proves

Executa el programa i prova diferents operacions per assegurar-te que tot funciona correctament.

Conclusió

En aquest tema, hem construït una calculadora científica utilitzant Fortran. Hem aplicat conceptes bàsics i avançats, com ara l'ús de funcions, subrutines, estructures de control i gestió d'entrada i sortida. Aquest projecte ens ha permès veure com es poden combinar diferents elements de Fortran per crear una aplicació útil i funcional.

Exercici Pràctic

Exercici: Afegeix una nova funció a la calculadora per calcular el factorial d'un nombre. Implementa la funció factorial i actualitza el programa principal per incloure aquesta nova operació.

Solució:

! Funció per calcular el factorial
function factorial(n)
    integer :: factorial, n, i
    factorial = 1
    if (n < 0) then
        print *, "Error: Factorial de nombre negatiu"
        factorial = 0
    else
        do i = 1, n
            factorial = factorial * i
        end do
    end if
end function factorial

! Actualització del programa principal
program scientific_calculator
    implicit none
    character(len=1) :: operation
    real :: a, b, result
    integer :: n

    call get_user_input(operation, a, b)

    select case (operation)
        case ('+')
            result = add(a, b)
        case ('-')
            result = subtract(a, b)
        case ('*')
            result = multiply(a, b)
        case ('/')
            result = divide(a, b)
        case ('^')
            result = power(a, b)
        case ('r')
            result = square_root(a)
        case ('l')
            result = natural_log(a)
        case ('!')
            print *, "Introdueix un nombre enter:"
            read *, n
            result = factorial(n)
        case default
            print *, "Operació no vàlida"
            result = 0.0
    end select

    call display_result(result)
end program scientific_calculator

Amb aquesta ampliació, la calculadora ara també pot calcular el factorial d'un nombre enter. Prova aquesta nova funcionalitat per assegurar-te que funciona correctament.

© Copyright 2024. Tots els drets reservats