主题:[讨论]为什么没有结果,太奇怪了
zhuizhui
[专家分:0] 发布于 2010-11-12 20:55:00
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 楼
zhuizhui [专家分:0] 发布于 2010-11-13 10:45:00
那我应该如何写啊,我定义想,x,y是实型啊,如何写?你就帮帮我吗
12 楼
dongyuanxun [专家分:7180] 发布于 2010-11-13 12:16:00
[quote]
那我应该如何写啊,我定义想,x,y是实型啊,如何写?你就帮帮我吗[/quote]
F5.2的形式
要输入成 03.00
13 楼
yeg001 [专家分:14390] 发布于 2010-11-13 15:19:00
我觉得读入字符串再处理也可以. 代码处理稍微复杂一些.
14 楼
dongyuanxun [专家分:7180] 发布于 2010-11-13 15:23:00
[quote]我觉得读入字符串再处理也可以. 代码处理稍微复杂一些.[/quote]
符合人机工程
15 楼
zhuizhui [专家分:0] 发布于 2010-11-13 18:58:00
搞成字符串如何处理啊,要适合这样程序啊,不然这里对了,别的地方就不能运行了
16 楼
zhuizhui [专家分:0] 发布于 2010-11-13 19:07:00
你说定义一个字符串p,然后那个符号+-*/如何判断啊,输入的字符串长度又不知道,不知道符号是该字符串的第几个字符啊
17 楼
zhuizhui [专家分:0] 发布于 2010-11-13 23:34:00
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 楼
asymptotic [专家分:16630] 发布于 2010-11-14 00:45:00
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 楼
dongyuanxun [专家分:7180] 发布于 2010-11-14 01:36:00
恩,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 楼
asymptotic [专家分:16630] 发布于 2010-11-14 08:26:00
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.
我来回复