为什么我的程序不能打印我的语句?
我正在阅读的文件中有3列,我想平均每列,并采取标准。代码现在编译,但没有打印。为什么我的程序不能打印我的语句?
这里是我的代码:
program cardata
implicit none
real, dimension(291) :: x
intEGER I,N
double precision date, odometer, fuel
real :: std=0
real :: xbar=0
open(unit=10, file="car.dat", FOrm="FORMATTED", STATUS="OLD", ACTION="READ")
read(10,*) N
do I=1,N
read(10,*) x(I)
xbar= xbar +x(I)
enddo
xbar = xbar/N
DO I =1,N
std =std +((x(I) -xbar))**2
enddo
std = SQRT((std/(N - 1)))
print*,'mean:',xbar
print*, 'std deviation:',std
close(unit=10)
end program cardata
我是相当新的这一点,任何输入将不胜感激。
的car.dat
例子:
date odometer fuel
19930114 298 22.4
19930118 566 18.1
19930118 800 18.9
19930121 960 15.8
19930125 1247 19.8
19930128 1521 17.1
19930128 1817 19.8
19930202 2079 18.0
19930202 2342 10.0
19930209 2511 16.4
19930212 2780 16.7
19930214 3024 19.0
19930215 3320 17.7
19930302 3560 16.4
19930312 3853 18.8
19930313 4105 18.5
从您的评论给了car.dat
,这是令人惊讶的是,程序不显示任何东西。当我运行它时,它显示一个非常明确的运行时错误:
$ gfortran -o cardata cardata.f90
$ ./cardata
At line 12 of file cardata.f90 (unit = 10, file = 'car.dat')
Fortran runtime error: Bad integer for item 1 in list input
您似乎从另一个示例中复制代码而未真正理解它的作用。代码如您所写,预计文件car.dat
采用某种格式:首先是integer
,它对应于文件中的项目数,然后是每行一个real
。因此,像这样:
5
1.2
4.1
2.2
0.4
-5.2
但随着你的榜样,第一行包含文本(也就是不同的列的描述),并且当它试图解析成一个整数(N
)就一定会失败。
我不会给你一个完整的例子,因为我有唠叨的怀疑,这是你应该学习某些东西的某种作业。但这里有一些提示:
您可以轻松地每行读取几个值:即,对不同的程序,date
,odometer
和fuel
是数组
read(10, *) date(I), odometer(I), fuel(I)
我假设在这里。 date
和odometer
可以是integer
,但fuel
必须是real
(或double precision
,但这对于这些值不是必需的)。
在开始之前,您需要跳过第一行。您可以将该行读入虚拟变量character(len=64)
。 (我挑len=64
,但你可以选择,你觉得有信心与任何其他的长度,但它应该是足够长的时间实际上包含整行。)
最棘手的一点是如何让你的N
,因为它没有给出在文件的开头。你可以做的是这样的:
N = 0
readloop : do
read(10, fmt=*, iostat=ios) date(N+1), odometer(N+1), fuel(N+1)
if (ios /= 0) exit readloop
N = N + 1
end do readloop
当然,你需要在你的程序的开始申报INTEGER :: ios
。这将尝试将值读入数组的下一个位置,如果失败(通常是因为它已经到达文件的末尾),它就会结束。
请注意,这再次预计date
,odometer
和fuel
是数组,并且此外还需要是足够大的数组以包含所有值。如果您不能保证,我建议您阅读allocatable arrays以及dynamically increase their size。
该代码看起来没问题,它适用于我。 “没有任何东西正在印刷”是一种模棱两可的陈述。你可以补充:你如何编译它?你如何运行它?当你运行它会发生什么?你能举一个'car.dat'的例子吗? – chw21
所以这里是car.dat的示例: 日期里程表燃料 19930114 298 22.4 19930118 566 18.1 19930118 800 18.9 19930121 960 15.8 19930125 1247 19.8 19930128 1521 17.1 19930128 1817 19.8 19930202 2079 18.0 19930202 2342 10.0 19930209 2511 16.4 19930212 2780 16.7 19930214 3024 19.0 19930215 3320 17.7 19930302 3560 16.4 19930312 3853 18.8 19930313 4105 18.5 –
第一列是日期值19930114第二列是里程表566第三列是18.1。我需要计算每列的标准差和平均值,而不是每行中的每个元素。当我运行该程序时,它不显示任何内容。 –