Fortran '*';和'/';在read语句输入时无法识别

Fortran '*';和'/';在read语句输入时无法识别,fortran,Fortran,我开始学习Fortran,我正在做一个小的案例测试程序,用户输入两个实数并选择一个算术运算符(从+-*/)。当用户选择“*”时,出现以下错误 节目如下 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

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

节目如下

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

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

  READ (10,"(2I10)") m,n
第一个参数是文件描述符。这里是
10
。第二个参数
“(2I10)
是格式说明符。如果使用星号(
*
)作为格式说明符,则会打开列表导向格式模式

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

1.为什么星号(
*
)在列表定向输入模式中是特殊的? 输入列表被拆分为一个或多个输入记录。每个输入记录的格式为
c
k*c
k*
,其中
c
为文字常量,
k
为整数文字常量。比如说,

  5*1.01
作为
k*c
方案的一个实例,该方案被解释为5份编号
1.01

   5*
被解释为5份空输入记录

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

2.斜杠(
/
)怎么了? 逗号(
)、斜杠(
/
)和一个或多个空格的序列(
)在列表定向输入模式下被视为记录分隔符

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

3.可能的解决方案:明确指定格式 要使运行时接受单斜杠或星号,您可以通过明确指定格式来离开列表定向输入模式:

read (*,"(A1)") oper

应该允许您输入任何单个字符。

确定,然后输入正确的源代码

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 (*,"(A1)") 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

这可能是由于您使用了列表定向输入。这里,
*
/
在输入方面意味着特殊的东西。您可以使用显式格式阅读。恐怕我没有时间在这里寻找一个好问题。#Dmitri Chubarov我能做些什么来解决编译器没有识别的*和/和x-->编译错误的这些错误?但是为什么编译器没有识别*和/作为字符,并正常执行+和-的程序,而且它们也是charactersOk,在使用read(*,“(A1)”操作程序后,表示感谢。程序正在运行。你能给我解释一下*和/案件的原因吗errors@imadeddine您不必在评论中感谢,您不必输入固定代码作为答案,但如果它解决了您的问题,您可能应该接受答案。我建议您学习如何正确设置代码格式。实际上,你不必在这里给出另一个答案,你只需要接受帮助你的解释。不要使用类似的东西!!!!!!或其他聊天功能。
read (*,"(A1)") oper
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 (*,"(A1)") 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