回 帖 发 新 帖 刷新版面

主题:[讨论]为什么没有结果,太奇怪了

character::op,p 
real::x,y
do
read *,x,op,y
select case(op)
case('+')
print *,x+y
case('-')
print *,x-y
case('*')
print *,x*y
case('/')
if(y==0) then
print *,"chu shu wei 0!"
else
print *,x/y
endif
case default
print *,"shu ru cuo wu"
end select
print *,"if you want to contineu,press y"
print *,"if you not,press n"
read*,p
if(p=='n') then
exit
else
cycle
endif
enddo
end
这个程序是一个计算器程序,输入如:3+5
2-6 6*2 9/6然后问你是否继续,如果继续就按y,结束就按n
这个程序编译没有错误,关键是没有结果,一执行就没得反应啊
哪个高手帮帮我啊,


回复列表 (共29个回复)

11 楼


那我应该如何写啊,我定义想,x,y是实型啊,如何写?你就帮帮我吗

12 楼

[quote]
那我应该如何写啊,我定义想,x,y是实型啊,如何写?你就帮帮我吗[/quote]

F5.2的形式
要输入成 03.00

13 楼

我觉得读入字符串再处理也可以. 代码处理稍微复杂一些.

14 楼

[quote]我觉得读入字符串再处理也可以. 代码处理稍微复杂一些.[/quote]
符合人机工程

15 楼


搞成字符串如何处理啊,要适合这样程序啊,不然这里对了,别的地方就不能运行了

16 楼


你说定义一个字符串p,然后那个符号+-*/如何判断啊,输入的字符串长度又不知道,不知道符号是该字符串的第几个字符啊

17 楼

program main
  implicit none

  character(len = 1):: op, p 
  real:: x, y
  do while ( .true. )
    write(*, *) "input x, op, y, separate by blank or Enter: "
    read(*, *) x, op, y
    select case (op)
    case ('+')
      write(*, *) x + y
    case ('-')
      write(*, *) x - y
    case ('*')
      write(*, *) x * y
    case('/')
      if ( y == 0.0 ) then
        write(*, *) "The divisor can't be -- 0!"
      else
        write(*, *) x / y
      endif
    case default
      write(*, *) "The input is error."
    end select
    
    write(*, *) "if you want to contineu, press y, otherwise, press n"
    read(*, *) p
    if( p == 'n' ) then
      exit
    endif
  end do
  
  stop
end program

你这个加减都可以运行,为什么乘除就不得行了啊,我自己写的程序也是??

18 楼

17 楼: 乘号 是可以的,除号 / 确实不行,因为 / 在 Fortran 的 List-Directed I/O 中是 Slash Editing,改为: "/" 即可。
下面的程序有同样的问题,但我更喜欢之:

program main
  implicit none
  logical:: TF
  character(len = 1):: op   ! operator
  real:: x, y
    
  TF = .true.  
  do while ( TF )
    write(*, *) "input x, op, y, separate by blank or Enter: "    
    read(unit = *, fmt = *, err = 100) x, op, y
 
    select case ( op )
    case ('+')
      write(*, *) x + y
    case ('-')
      write(*, *) x - y
    case ('*')
      write(*, *) x * y
    case('/')
      write(*, *) x / y   ! x = 0, y = 0 --> Not a Number
                          ! x /= 0, y = 0 --> Infinity
    case default
      write(*, *) "x .op. y = ", x, op, y
    end select

100 TF = .false.
    If ( TF ) Then
      write(*, *) "Input format error."  
    End If   
    write(*, *) "Try again? stop press character: n, other any &
                 character(s) - continue."
    read(*, *) op
    if( op == 'n' ) then
      exit
    else 
      TF = .true.
    endif    
  end do

  stop
end program

19 楼

恩,fortran的/号在无格式输入的时候为重载输入缓冲,如果为格式输入,即为/。

这个题目lz完全就可以变通一下

下面给出直接输入字符串的简单分析代码例子

program main

  implicit none
  integer, parameter :: LenString = 50
  character(len=LenString) :: MyString
  real :: x, y
  character :: op
  integer :: i, mylen
  logical :: flag

  flag = .false.   !op flag

  read(*,"(a50)") MyString

  do i=1,LenString
        if(MyString(i:i) == "+" .or. MyString(i:i) == "-" .or. MyString(i:i) == "*" .or. MyString(i:i) == "/") then
            flag = .true.        !found op
            mylen = i
            exit
        endif
  enddo
  
  if(flag) then
     read(MyString(1:(mylen-1)),*) x     ! x <- MyString(1:op-1)
     op = MyString(mylen:mylen)
     read(MyString((mylen+1):LenString),*) y    !  y <- MyString(op+1:end)
  endif
  
  print *, x
  print *, op
  print *, y

  stop
end program

当然你还可以考虑是不是字符串中还有其他的非法字符或者逻辑上的问题,这里我就不写了。

这样从字符串解析出x、op和y后,再进行select case的判断

20 楼

19 楼: 若是 MyString = "3.1415_4 / 4.2D-3    ",则程序异常。


修改: 我发现,真正的问题源于

Input Error:real constant with a kind-parameter

--------------------------------------------------------------------------------

real(kind = 8):: x
read(*, *) x

when I input -- 1.0_8, List-Directed I/O syntax error (Intel Fortran 12.0 Compiler).
I don't know why real constant with kind-parameter as a input, the compiler message 
a error? The Fortran 2003 Standard mention this situation?

Thanks a lot.

我来回复

您尚未登录,请登录后再回复。点此登录或注册