OPEN(2,File="wave1dat")
OPEN(3,File="wave2dat")
OPEN(4,File="wave3dat")
DO id=1, nobig
READ(2,,ERR=25,END=25)rdepth(id),(rwave(1,it,id),it=1,notime)
READ(3,)rdepth(id),(rwave(2,it,id),it=1,notime)
READ(4,)rdepth(id),(rwave(3,it,id),it=1,notime)
ENDDO
25 nsamp=id-1
CLOSE(2)
CLOSE(3)
CLOSE(4)
READ(2,,ERR=25,END=25)rdepth(id),(rwave(1,it,id),it=1,notime) //这句的意思是:从文件通道2按自由格式读入数据,当出错或读到文件尾部时跳转的行号25的语句执行。读的顺序是:
rdepth(id),rwave(1,1,id),rwave(1,2,id),rwave(1,3,id),,rwave(1,notime,id)
(也就是先读入一个数,紧接着相当于读入一个一维数组)
是编译没通过还是编译通过但程序不能执行还是能执行但输出结果不对?
大概看了,貌似没啥问题啊,除了最后两个输出语句中没用逗号分隔输出量。
write(,)"the classroom you want to find is:" , p
write(,)"and its populatiy level is:" , hbcd(p,day)
double randomz (int ia, int ib)
{
double x; //返回值
static int initial[15]={0};
static double iz,iy[15]={00};
//使用static类型,为下次调用保留值,不然每次都要从头开始
switch(ia)
{
case 1: //ia参数为1,从键盘输入种子初始化随机数生成器
iz=1000000010
read(5,'(5i8)') initial 这句话直接翻成C很难,
//意思就是从键盘(5号设备)连续读入5个整数(难道不是15?
// 我怀疑源码写错了,应该是15i8),存入整型数组 initial ;
//而且Fortran的格式描述符i8强制每个整数都是8位(千万位),
//如果输入不足8位就切换到下一个数进行输入,则Fortran会
//自动在不足8位的数的右侧补上足够的0,以放大到千万位
iy=dble(initial) 这句话直接翻成C很难,
//本句用到Fortran90/95特色的数组整体 *** 作,C/C++要用循环;
//是把整型数组initial逐项复制给double数组iy,转换成double型
x = iy[ib]10E-8 ;
case 2: //ia参数为2,继续使用已经初始化好了的生成器
iy[ib] = 3290 iy[ib] % iz ;
x = iy[ib]10E-8 ;
case 3: //ia参数为3,重新初始化,但还使用原先的种子
iy=dble(initial) 这句话直接翻成C很难,用循环完成。
}
//switch结束
return x;
}
=================================
算法的主要思想就是“线性同余法”,
linear-congruential method
其基本迭代公式为
X[n+1] = ( A X[n] + B )% C
X的初始值随便取
在你给的源代码里:
A= 3290
B= 0
C= 1000000010
源代码中的关键是 iy[ib] = 3290 iy[ib] % iz
另外 x = iy[ib]10E-8 是为了将结果归一化到0~1之间再返回
你可以自己手工算几个数,就能看出这个算法的奥妙了。
另外需要指出的是——源代码里用static就是为了每次case 2时候的调用,都是在对上一次的结果进行迭代。而ib参数的用处就是保持有几组不同的独立迭代序列可用,防止不同用途的几处“生成伪随机数”调用互相干扰。
以上就是关于求讲解一段fortran程序全部的内容,包括:求讲解一段fortran程序、fortran程序编写、fortran程序解读等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)