MST

星途 面试题库

面试题:Fortran函数与子程序的复杂逻辑实现

编写一个Fortran函数,用于计算一个整数的阶乘。然后,编写一个子程序,该子程序调用上述函数来计算一个二维数组中每个元素的阶乘,并将结果存储在另一个相同大小的二维数组中。要求考虑边界情况和错误处理,展示完整代码及说明实现思路。
50.3万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试
! 模块用于包含函数和子程序
module factorial_module
    implicit none
    private
    public :: factorial, calculate_factorial_array

contains
    ! 计算整数阶乘的函数
    function factorial(n) result(fac)
        integer, intent(in) :: n
        integer :: fac
        integer :: i

        ! 边界情况处理:n 为负数时抛出错误
        if (n < 0) then
            write(*,*) '错误: 负数没有阶乘'
            stop 1
        end if

        fac = 1
        do i = 1, n
            fac = fac * i
        end do
    end function factorial

    ! 计算二维数组每个元素阶乘的子程序
    subroutine calculate_factorial_array(input_array, result_array)
        integer, intent(in) :: input_array(:, :)
        integer, intent(out) :: result_array(:, :)
        integer :: i, j

        ! 确保输入数组和结果数组大小相同
        if (size(input_array, 1) /= size(result_array, 1) .or. &
            size(input_array, 2) /= size(result_array, 2)) then
            write(*,*) '错误: 输入数组和结果数组大小必须相同'
            stop 1
        end if

        do i = 1, size(input_array, 1)
            do j = 1, size(input_array, 2)
                result_array(i, j) = factorial(input_array(i, j))
            end do
        end do
    end subroutine calculate_factorial_array
end module factorial_module

! 主程序用于测试函数和子程序
program main
    use factorial_module
    implicit none
    integer, parameter :: rows = 3, cols = 3
    integer :: input_array(rows, cols)
    integer :: result_array(rows, cols)
    integer :: i, j

    ! 初始化输入数组
    do i = 1, rows
        do j = 1, cols
            input_array(i, j) = i + j
        end do
    end do

    ! 调用子程序计算阶乘
    call calculate_factorial_array(input_array, result_array)

    ! 输出结果
    write(*,*) '输入数组:'
    do i = 1, rows
        write(*,*) input_array(i, :)
    end do

    write(*,*) '结果数组:'
    do i = 1, rows
        write(*,*) result_array(i, :)
    end do
end program main

实现思路

  1. 模块定义
    • 创建 factorial_module 模块,用于封装计算阶乘的函数和计算二维数组阶乘的子程序,使代码结构更清晰,同时限制外部对内部过程的直接访问。
  2. 阶乘函数
    • factorial 函数接受一个整数参数 n
    • 首先处理边界情况,如果 n 为负数,输出错误信息并终止程序,因为负数没有阶乘。
    • 使用 do 循环从 1 到 n 累乘,计算阶乘值并返回。
  3. 计算二维数组阶乘的子程序
    • calculate_factorial_array 子程序接受输入的二维数组 input_array 和用于存储结果的二维数组 result_array
    • 首先检查输入数组和结果数组的大小是否相同,如果不同则输出错误信息并终止程序。
    • 通过嵌套的 do 循环遍历输入数组的每个元素,调用 factorial 函数计算每个元素的阶乘,并将结果存储到结果数组的对应位置。
  4. 主程序
    • 定义并初始化一个二维输入数组 input_array
    • 调用 calculate_factorial_array 子程序计算输入数组每个元素的阶乘,并将结果存储在 result_array 中。
    • 输出输入数组和结果数组的值,以验证计算的正确性。