如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素

如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素,第1张

举个例子, 解设有个数组(1,2,3,,17,18,19,20), 共20个元素, 随机抽取10%即2个, 剩下18个

program test

implicit 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是剩下元素组成的数组

$ /aout

array1 = 4 18

array2 = 20 3 17 14 12 11 16 10 7 5 1 2 19 6 13 8 9 15

再一次运行

$ /aout

array1 = 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)

print

,x

end

program

另外,在一个程序中,

"call

random_seed

()

这一句是不能重复的,只能用一次。

所以它不能放到循环里面去,另外,如果一个子程序会被调用多次的话,也不能放到子程序里面。

==============

如果你非得用rand()的话,看看这个帖子吧:

>

以上就是关于如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素全部的内容,包括:如何用fortran编程实现从一个集合中随机抽出10%的元素,并显示出来抽出来的元素和剩下的元素、用Fortran程序编写 写一个子程序来画长条图,并设计主程序调 用该子程序、有fortran90编写程序,,,列出从1到100的所有质数。对的追分...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9422890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存