主题:请教高手!
ahaoxiaowan
[专家分:0] 发布于 2010-05-16 22:53:00
module mianji
implicit none
contains
function fun(filename) result(total)
implicit none
character(len=79)::filename
integer,parameter::fileid=10
real,dimension(1:23)::a,b
real::s
integer::i
real::area=0
real::total
logical::alive
inquire(file=filename,exist=alive)
if(alive)then
open(fileid,file=filename,status='old')
do i=1,23
read(fileid,*)a(i),b(i)
end do
write(*,'(23f6.3)')(a(i),i=1,23)
write(*,'(23f8.4)')(b(i),i=1,23)
else
write(*,*)'文件不存在'
end if
do i=1,22
s=((b(i+1)+b(i))/2)*(a(i+1)-a(i))
area=area+s
end do
total=area
write(*,*)'area=',total
end function fun
end module
program jian
use mianji
implicit none
character(len=79)::filename1,filename2
real::afilename1,afilename2,atotal
write(*,*)'filename1'
read(*,'(A79)')filename1
write(*,*)'filename2'
read(*,'(A79)')filename2
afilename1=fun(filename1)
afilename2=fun(filename2)
atotal=afilename2-afilename1
print*,afilename1
print*,afilename2
write(*,*)'cl=',atotal
end program jian
分开计算时afilename1=-0.7092733,afilename2=-2.587754E-02。用上面程序计算得到的afilename1=-0.7092733,afilename2=-0.7351311,afilename2是错的。为什么afilename2差这么多,是不是格式设置的问题?
望您指教!
回复列表 (共15个回复)
沙发
yeg001 [专家分:14390] 发布于 2010-05-16 23:37:00
你是不是open了文件没有关, 所以第二次进去(也是同一个文件)就会继续往下读? 没那个文件, 无法测.
板凳
asymptotic [专家分:16630] 发布于 2010-05-17 08:13:00
输入文件呢?
3 楼
ahaoxiaowan [专家分:0] 发布于 2010-05-17 11:34:00
第一个文件
0.00 0.6308
0.01 -0.6977
0.03 -1.1507
0.05 -1.2798
0.1 -1.3953
0.15 -1.4337
0.2 -1.4473
0.25 -1.3991
0.3 -1.2524
0.35 -1.0661
0.4 -0.8109
0.45 -0.6327
0.5 -0.5741
0.55 -0.5287
0.6 -0.4833
0.65 -0.4348
0.7 -0.3612
0.75 -0.2985
0.8 -0.2212
0.85 -0.1747
0.9 -0.1153
0.95 -0.0557
1.0 0.00381
第二个文件
0.000 0.6308
0.005 1.1488
0.02 0.7474
0.04 0.4783
0.075 0.2379
0.125 0.0760
0.175 -0.0347
0.225 -0.0835
0.275 -0.1214
0.325 -0.1275
0.375 -0.1319
0.425 -0.1410
0.475 -0.1421
0.525 -0.1311
0.575 -0.1162
0.625 -0.1163
0.675 -0.1027
0.725 -0.0941
0.775 -0.0800
0.825 -0.0578
0.875 -0.0383
0.925 -0.0314
1.0 -0.0313
4 楼
ahaoxiaowan [专家分:0] 发布于 2010-05-17 11:36:00
应该不是吧。如果是那样的话计算的afilename1和afilename2应该相等啊。
5 楼
asymptotic [专家分:16630] 发布于 2010-05-17 12:11:00
想想 这一句
real::area=0
问题就出在这里。
6 楼
asymptotic [专家分:16630] 发布于 2010-05-17 12:17:00
module mianji
implicit none
contains
function fun(filename) result(total)
implicit none
character(len=79):: filename
integer, parameter:: fileid = 10
integer, parameter:: ND = 23
real:: a(1 : ND), b(1 : ND)
real:: s
integer:: i
real:: area
real:: total
logical:: alive
inquire(file = filename, exist = alive)
if( alive ) then
open(fileid, file=filename, status='old')
do i = 1, 23, 1
read(fileid, *) a(i), b(i)
end do
!write(*,'(23f6.3)') (a(i),i=1, ND)
!write(*,'(23f8.4)') (b(i),i=1, ND)
else
write(*, *) "File does not exist"
end if
close(fileid)
area = 0.0
do i = 1, 22, 1
s=((b(i+1)+b(i))/2)*(a(i+1)-a(i))
area = area + s
end do
total = area
write(*, *) 'area=', total
return
end function fun
end module
7 楼
doctorlive [专家分:800] 发布于 2010-05-17 16:04:00
鉴于楼主对这么多的热心同志不给分,个人认为大家不应再给予帮助
8 楼
asymptotic [专家分:16630] 发布于 2010-05-17 20:47:00
个人认为,用 菜鸟 给我 老鸟 加分,置信度 还是很低的。
就我个人而言,有空就给 菜鸟 看看,并不是为了得到分数,这些分数,对我而言,毫无意义。
9 楼
yeg001 [专家分:14390] 发布于 2010-05-17 22:21:00
加分 其实是对帮助人的感谢而已, 我觉得是一个比较礼貌的行为. 具体也是看发帖人, 个人也是无所谓.
不过这里我想问asymptotic一个问题, 子程序反复调用过程中临时变量确实是会有可能继承上次的值.
但是real::area=0 这样不是定义+初始化吗, 不会每次进入都过一遍?
10 楼
asymptotic [专家分:16630] 发布于 2010-05-17 22:39:00
yeg001 网友: 在某些 Compiler 中 real:: area = 0.0 <==> real, save:: area = 0.0。
Fortran 编程的理念与 C 不一样,这一点对 从 C 过来的同志,比较不舒服。
我来回复