读取语句在输入时无法识别'*'和'/'

ima*_*ine 2 fortran

我开始学习Fortran,我正在做一个小案例测试程序,用户输入两个实数并选择算术运算符(来自+ - */).用户选择"*"时出现以下错误

F6502 : read <con> - positive integer expected in repeat field
Run Code Online (Sandbox Code Playgroud)

如果用户选择"/",编译器将执行默认情况,并显示此消息

invalid operator, thanks
the result is 0.000000E+00
Run Code Online (Sandbox Code Playgroud)

该计划如下.

program operateur
implicit none

   CHARACTER(LEN=1) :: oper 
   real::a,b,res
   print*,'Give the first number a :'
   read*,a
   print*,'Give the second number b :'
   read*,b
   print*,'which operation ?'
   read*,oper
   !print*,'donnez a,b,oper :'
  ! read(*,*)a,b,oper

               select case (oper)

                  case ('+')      
                  res=a+b

                  case ('-')       
                  res=a-b

                  case ('*')       
                  res=a*b


                  case ('/')       
                  res=a/b           

                  case default
                  print*, "Invalid Operator, thanks" 

               end select

   print*,'the result is ',res 

end program operateur
Run Code Online (Sandbox Code Playgroud)

Dmi*_*rov 7

FORTRAN输入和输出格式规则是相当复杂的.每个输入和ouptut语句都有两个具有特殊含义的参数.例如

  READ (10,"(2I10)") m,n
Run Code Online (Sandbox Code Playgroud)

第一个参数是文件描述符.在这里10.第二个参数"(2I10)"格式说明符.如果您将asterisk(*)作为格式说明符,则可以打开列表定向格式模式.

列表定向输入顾名思义由输入运算符的参数列表控制.

1.为什么asterisk(*)在列表导向输入模式中是特殊的?

输入列表被分成一个或多个输入记录.每个输入记录的形式为c,k*ck*其中c是一个常量,并且k是整数常量.例如,

  5*1.01
Run Code Online (Sandbox Code Playgroud)

作为k*c计划的实例被解释为5个数字副本1.01

   5*
Run Code Online (Sandbox Code Playgroud)

被解释为空输入记录的5个副本.

符号星号(*)在列表导向输入模式中具有特殊含义.某些编译器运行时会在列表导向输入中遇到没有整数常量的星号时报告运行时错误,其他编译器会读取星号.例如,GNU Fortran编译器因标准符合性而闻名,因此其运行时可以接受*.其他编译器运行时可能会失败.

2.怎么了斜线(/)?

逗号(,),斜杠(/)和一个或多个空格()的序列在列表导向输入模式中被视为记录分隔符.

在这种模式下,没有简单的方法可以自己输入斜杠.

3.可能的解决方案:明确指定格式

如何使运行时接受单斜杠或星号是通过明确指定格式来离开列表导向的输入模式:

read (*,"(A1)") oper
Run Code Online (Sandbox Code Playgroud)

应该让你输入任何一个字符.