Arrays 分析数字数组的奇怪结果
我编写了以下程序来查找数组中的值:最大值和最小值;+ve和-ve值的数量;素数和完全数的个数;平方和、平均值、方差和标准差(了解统计学的人熟悉后两项) 我的问题是,从平方和开始的输出是不正确的。你能告诉我为什么吗?我写的程序是:Arrays 分析数字数组的奇怪结果,arrays,fortran,fortran90,gfortran,Arrays,Fortran,Fortran90,Gfortran,我编写了以下程序来查找数组中的值:最大值和最小值;+ve和-ve值的数量;素数和完全数的个数;平方和、平均值、方差和标准差(了解统计学的人熟悉后两项) 我的问题是,从平方和开始的输出是不正确的。你能告诉我为什么吗?我写的程序是: integer,dimension(10)::num open(10,file='in.txt') open(100,file='in-n.txt') read(100,*)n do i=1,n read(10,*)num(i) end do l=1 do i=1,
integer,dimension(10)::num
open(10,file='in.txt')
open(100,file='in-n.txt')
read(100,*)n
do i=1,n
read(10,*)num(i)
end do
l=1
do i=1,n
if(num(i)<=num(l))cycle
l=i
end do
lar=num(l)
l=1
do i=1,n
if(num(i)>=num(l))cycle
l=i
end do
sml=num(l)
k=0
do i=1,n
if(num(i)<0)cycle
k=k+1
end do
n_pos=k
k=0
do i=1,n
if(num(i)>0)cycle
k=k+1
end do
n_neg=k
j=0
do n=1,n
if(num(n)<=1)cycle
m=2
30 if(mod(num(n),m)==0)goto 60
m=m+1
if(m<=sqrt(real(num(n))))goto 30
j=j+1
60 end do
n_prm=j
j=0
do n=1,n
k=0
do i=1,num(n)
if(mod(num(n),i)==0)k=k+i
end do
if(k==2*num(n))j=j+1
end do
n_per=j
sumsq=0.
do i=1,n
sumsq=sumsq+num(i)**2
end do
sum1=0.
do i=1,n
sum1=sum1+real(num(i))
end do
ave=sum1/float(n)
sum2=0.
do i=1,n
sum2=sum2+(num(i)-ave)**2
end do
var=sum2/float(n-1)
sd=sqrt(var)
write(*,80)lar,nint(sml),n_pos,n_neg,n_prm,n_per,sumsq,ave,var,sd
80 format(1x,'Largest value: ',t30,i2//&
1x,'Smallest value: ',t30,i2//&
1x,'# of positive numbers: ',t30,i2//&
1x,'# of negative numbers: ',t30,i2//&
1x,'# of primes: ',t30,i2//&
1x,'# of perfects: ',t30,i2//&
1x,'Sum of squares: ',t30,f10.5//&
1x,'Average: ',t30,f10.5//&
1x,'Variance: ',t30,f10.5//&
1x,'Standard deviation: ',t30,f10.5)
end
当我在不同的程序中分别编写程序中有问题的部分时,它可以完美地工作:
integer,dimension(10)::num
open(10,file='in.txt')
open(100,file='in-n.txt')
read(100,*)n
do i=1,n
read(10,*)num(i)
end do
sumsq=0.
do i=1,n
sumsq=sumsq+num(i)**2
end do
sum1=0.
do i=1,n
sum1=sum1+num(i)
end do
ave=sum1/float(n)
sum2=0.
do i=1,n
sum2=sum2+(num(i)-ave)**2
end do
var=sum2/float(n-1)
sd=sqrt(var)
print*,sumsq,ave,var,sd
end
输出:
2606.00000, 16.0000000, 5.11111116, 2.26077676
数组num
的元素是:20,13,17,17,13,18,14,17,16,15。循环
do n=1,n
...
end do
也许它不会做你认为它会做的事。是的,但它做的更多
在循环结束时,n
有一个比循环之前大一的值(因为没有提前退出构造)。你可以找到关于这个的讨论。[我几乎把这个问题称为重复的问题,但需要一点解释才能达到目的。]
在该循环之后,您的n
不再指num
中的元素数:您稍后的循环希望n
是这一点,这依赖于一个不正确的假设
在您的固定版本中不使用此n
循环思想。你需要用这个错误重写前面的部分
因为在本例中,您分析的元素数等于数组的大小,所以使用编译器标志进行边界检查将有助于您识别此问题。但是,如果n
最初不是10
,而是8
(或更小),您只会引用num
的未定义部分:这可能是一个更难找到的问题
do n=1,n
...
end do