Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 分析数字数组的奇怪结果_Arrays_Fortran_Fortran90_Gfortran - Fatal编程技术网

Arrays 分析数字数组的奇怪结果

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,

我编写了以下程序来查找数组中的值:最大值和最小值;+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,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