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