使用Fortran将算术运算符存储在数组中

时间:2013-05-16 15:51:40

标签: variables fortran operator-keyword

我想用Fortran解决以下类型的给定方程式:

1 ? 2 ? 3 = 7

在这个等式中,只有算术运算符丢失,第一个问号的解决方案为“+”,第二个问号的解决方案为“*”。我想写一个简短的脚本,通过暴力找到正确的操作符。所以在这种情况下,必须检查四次四个案例。为了做到这一点,我想将运算符存储在一个数组中,并在嵌套的do循环中使用它们:

    value1=1
    value2=2
    value3=3
    result=7

    op(1)=+
    op(2)=-
    op(3)=/
    op(4)=*

    do i=1,4
       do j=1,4
          if(value1 op(i) value2 op(j) value3 .eq. result) then
             write(*,*)'Found solution: ' ,op(i), op(j)
          else
             j=j+1
          endif
       enddo
    i=i+1
    enddo

显然,由于if语句的错误解释,这不起作用。任何想法如何使这项工作?

2 个答案:

答案 0 :(得分:4)

作为Vladimir pointed out,你不能在Fortran中直接这样做,除非你使用函数指针。下面你会找到一个例子。

我通过仅使用整数运算使其变得简单。还要注意,我假设表达式中的操作是从左到右执行的(没有优先级规则),否则算法会复杂得多。如果优先级很重要,那么你应该考虑为任务使用解释语言(除非执行速度很小)。

这是定义操作的模块和包含过程指针的类型:

module myfuncs
  implicit none

  abstract interface
    function binary(i1, i2)
      integer, intent(in) :: i1, i2
      integer :: binary
    end function binary
  end interface

  type :: procptr
    procedure(binary), pointer, nopass :: ptr
  end type procptr

contains

  function add(i1, i2) result(res)
    integer, intent(in) :: i1, i2
    integer :: res
    res = i1 + i2
  end function add

  function mul(i1, i2) result(res)
    integer, intent(in) :: i1, i2
    integer :: res
    res = i1 * i2
  end function mul

  function sub(i1, i2) result(res)
    integer, intent(in) :: i1, i2
    integer :: res
    res = i1 - i2
  end function sub

  function div(i1, i2) result(res)
    integer, intent(in) :: i1, i2
    integer :: res
    res = i1 / i2
  end function div

end module myfuncs

以下是强力搜索的主程序:

program bruteforce
  use myfuncs

  type(procptr) :: ops(4)
  character :: opnames(4)
  integer :: val1, val2, val3, res, myres

  val1 = 1
  val2 = 2
  val3 = 3
  res = 7

  ops(1)%ptr => add
  ops(2)%ptr => sub
  ops(3)%ptr => mul
  ops(4)%ptr => div
  opnames = [ "+", "-", "*", "/" ]

  lpi: do ii = 1, 4
    lpj: do jj = 1, 4
      myres = ops(jj)%ptr(ops(ii)%ptr(val1, val2), val3)
      write(*,"(3(I0,1X,A,1X),I0)") val1, opnames(ii), val2, &
          &opnames(jj), val3, " = ", myres
      if (myres == res) then
        write(*,*) "Solution found."
        exit lpi
      end if
    end do lpj
  end do lpi

end program bruteforce

答案 1 :(得分:1)

这不能在Fortran中完成。您为op声明了哪种类型?没有任何合适的东西。你可以做的一件事是定义一些函数并存储函数指针。