举个例子, 解设有个数组(1,2,3,,17,18,19,20), 共20个元素, 随机抽取10%即2个, 剩下18个
program testimplicit none
integer :: i,j,array(20),array1(2),array2(18),itemp
real(8) :: rd(20),temp
do i = 1,20
array(i) = i
end do
call random_seed()
call random_number(rd)
do i = 1,20-1
do j = i+1,20
if (rd(i) gt rd(j)) then
itemp = array(i)
array(i) = array(j)
array(j) = itemp
end if
end do
end do
do i=1,2
array1(i) = array(i)
end do
do i = 1,18
array2(i) = array(2+i)
end do
print '(a,2(i3))', 'array1 = ',array1
print '(a,18(i3))', 'array2 = ',array2
stop
end program
结果, 其中array1是选中的元素组成的数组, array2是剩下元素组成的数组
$ /aoutarray1 = 4 18
array2 = 20 3 17 14 12 11 16 10 7 5 1 2 19 6 13 8 9 15
再一次运行
$ /aoutarray1 = 20 17
array2 = 18 12 2 19 9 3 11 5 10 8 6 7 13 1 4 15 14 16
do 10 i=1,25
call pbar(i)
10 continue
end
subroutine pbar(n)
integer n
character1 c
c=''
do 10 i=1,n
write(,100)c
10 continue
write(,)
100 format(A1\)
return
end
program main
integer i, j
integer,parameter :: n = 100
logical(1):: flag(n)
integer :: num = 0
flag = true
do i = 2, sqrt(real(n))
if(notflag(i)) cycle
do j = i, n/i
flag(ij) = false
enddo
enddo
do i = 2, n
if(flag(i)) then
num = num + 1
write(,) i
endif
enddo
end
这种方法也适合求大量质数,比如1到1E8内的质数,是速度最快的方法之一!
去年学的Fortran语言,许多算法都忘了。给你一个去年写的牛顿插值程序,需要改动的地方自己改,貌似循环计算(多层计算)那块处理得不错。
real8 x(0:5),y(0:5),c(0:5),u1,u2,ci
data y/0796,0773,0744,0704,0656,0602/
open(1,file='7-2dat')
write(,)'input u1=,u2='
read(,)u1,u2
do i=0,5
x(i)=(i+1)0125
enddo
c(0)=y(0)
do i=1,5
call chashang(x,5,i,ci)
c(i)=ci
write(,)'c(i)=,i=',c(i),i
write(1,)'c(i)=,i=',c(i),i
enddo
call newchazhi(u1,c,x,5)
call newchazhi(u2,c,x,5)
end
subroutine newchazhi(u,c,x,m)
real8 c(0:m),x(0:m),u,N
S=c(0)
do i=1,5
N=c(i)
do j=0,i-1
N=N(u-x(j))
enddo
S=S+N
enddo
write(,)u,s
write(1,)u,s
end
subroutine chashang(x,m,i,ci)
real8 y(0:5),x(0:m),f(1:i),ci
y(0)=0796
y(1)=0773
y(2)=0744
y(3)=0704
y(4)=0656
y(5)=0602
k=0
10 do j=1,i-k
f(j)=(y(j)-y(j-1))/(x(j+k)-x(j-1))
enddo
if(j==1) then
goto 5
else
do j=1,i-k
y(j-1)=f(j)
enddo
k=k+1
goto 10
endif
5 ci=f(j)
return
end
确实写的一塌糊涂,真不是一两句话就能给你说请的。鉴于你的情况,下面给你一些基本的建议。
1、永远不要想一口吃个胖子。许多初学者都爱犯一个错误,就是想一口气从头写到尾,这是非常错误的编程习惯。再优秀的程序员,写程序也是一步一步写的,因为程序设计遵从的是严格的逻辑,所以你需要确保你第一个模块或者步骤写对了,再去写第二个的,而不是一口气写完,这样再去查报错原因会花费额外的大量的时间。
2、认真看报错,除非你是个女生。不看报错内容这种情况,一般大多发生在女生身上,这个经我多年经历好像确实也没什么办法。但报错其实大多都是英文大白话,如果没有耐心看的话是没法调试程序的。
3、你误解了fortran的子程序和函数。fortran和C语言族不同,fortran的子程序是subroutine,自定义函数是function,二者功能完全不一样。subroutine自身不能返回值,你也不能对它赋值。从你的程序看,你想使用的都是function而不是subroutine,具体用法请查阅资料和例子多看看。
4、你的程序中存在大量的重复定义的变量,这说明你并没有耐心的去查看自己写的程序。切记耐心是最基本的素质。
5、external不是你这种用法,多数情况下也用不到,就不要再用了。
这是一元全区间等距插值子程序,X1和H为实数,分别为等距节点中的第一个节点值和等距节点的步长;N为整数,等距节点的个数;Y(N),存放N个等距节点上的函数值;T是指定插值点的值;Z返回指定插值点T处的函数近似值。
SUBROUTINE EELGR(X1,H,N,Y,T,Z)
DIMENSION Y(N)
DOUBLE PRECISION X1,H,Y,T,Z,S,XX,P,Q
Z=00
IF (NLE0) RETURN
IF (NEQ1) THEN
Z=Y(1)
RETURN
END IF
IF (NEQ2) THEN
Z=(Y(2)(T-X1)-Y(1)(T-X1-H))/H
RETURN
END IF
IF (TGTX1) THEN
P=(T-X1)/H
I=P
Q=10I
I=I+1
IF (PGTQ) I=I+1
ELSE
I=1
END IF
K=I-4
IF (KLT1) K=1
M=I+3
IF (MGTN) M=N
Z=00
DO 30 I=K,M
S=10
XX=X1+(I-1)H
DO 20 J=K,M
IF (JNEI) THEN
XJ=X1+(J-1)H
S=S(T-XJ)/(XX-XJ)
END IF
20 CONTINUE
Z=Z+SY(I)
30 CONTINUE
RETURN
END
这是测试用的主程序代码。函数为F(x) = e^(-x),求x = 063处的函数近似值:
PROGRAM EELGRO
DIMENSION Y(10)
DOUBLE PRECISION Y,H,X1,T,Z
DATA Y/0904837,0818731,0740818,0670320,0606531,
0548812,0496585,0449329,0406570,0367879/
H=01
N=10
X1=01
T=063
CALL EELGR(X1,H,N,Y,T,Z)
WRITE(,20) T,Z
20 FORMAT(1X,'T=',F63,10X,'Z=',D156)
END
rand()不大好用,用这个:
0-1之间类似于
program
test
implicit
none
real
::
x
call
random_seed()!
系统根据日期和时间随机地提供种子"
call
random_number(x)
,x
end
program
另外,在一个程序中,
"call
random_seed
()
这一句是不能重复的,只能用一次。
所以它不能放到循环里面去,另外,如果一个子程序会被调用多次的话,也不能放到子程序里面。
==============
如果你非得用rand()的话,看看这个帖子吧:
>
以上就是关于如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素全部的内容,包括:如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素、用Fortran程序编写 写一个子程序来画长条图,并设计主程序调 用该子程序、有fortran90编写程序,,,列出从1到100的所有质数。对的追分...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)