Fortran.docx

上传人:b****5 文档编号:8202933 上传时间:2023-01-29 格式:DOCX 页数:31 大小:164.22KB
下载 相关 举报
Fortran.docx_第1页
第1页 / 共31页
Fortran.docx_第2页
第2页 / 共31页
Fortran.docx_第3页
第3页 / 共31页
Fortran.docx_第4页
第4页 / 共31页
Fortran.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

Fortran.docx

《Fortran.docx》由会员分享,可在线阅读,更多相关《Fortran.docx(31页珍藏版)》请在冰豆网上搜索。

Fortran.docx

Fortran

 

专业软件与模块化

程序设计报告书

课程名称专业软件与模块化程序设计

课题名称模块化程序设计

专业信息与计算科学

班级0801班

学号200810010134

姓名王新国

指导教师聂存云

 

2009年12月6日

一、设计内容与设计要求

1.设计内容:

2.设计要求:

●课程设计报告正文内容

a.问题的描述及算法设计;

b.算法的流程图(要求画出模块图);

c.附件(所有程序的原代码,要求对程序写出必要的注释)。

●书写格式

a.要求用A4纸打印成册

b.正文格式:

一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

c.正文的内容:

正文总字数要求在3000字左右(不含程序原代码)。

d.封面格式如下页。

●考核方式

指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。

具体考核标准包含以下几个部分:

a.平时出勤(占20%)

b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)

c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)

d.设计报告(占20%)

注意:

不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。

e.独立完成情况(占10%)。

●课程验收要求

a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。

b.回答有关问题。

c.提交报告。

d.依内容的创新程度,完善程序情况及对程序讲解情况打分。

 

理学院课程设计评分表

 

课程名称:

专业软件与模块化程序设计

项目

评价

设计方案的合理性与创造性

设计与调试结果

设计说明书的质量

答辩陈述与回答问题情况

课程设计周表现情况

综合成绩

 

教师签名:

日期:

 

目录

任务一……………………………………………………………

任务二……………………………………………………………

任务三……………………………………………………………

任务四……………………………………………………………

任务五……………………………………………………………

任务六……………………………………………………………

任务七……………………………………………………………

任务八……………………………………………………………

流程图……………………………………………………………

实习体会……………………………………………………………

算法附件……………………………………………………………

 

一、调用子程序,实现算法

1.问题描述:

1.函数子程序的结构及调用

函数子程序是用户根据需要编写的一个程序段,是独立的FORTRAN的程序单位,函数子程序的第一个语句必须是function.最后一个语句必须是end语句.函数子程序的一般结构为:

[类型说明]function函数子程序名(虚参1,虚参……..)

函数名=表达式

return

end

例如:

求N!

的函数子程序可以写成如下:

realfunctionfac(N)

fac=1,0

do10i=1,N

fac=fac*1

10continue

2.子程序调用是以subroutine开头,以end结尾的程序单元。

其定义的一般格式为:

subroutineF(X1,X2,……Xn)

子程序体

end

其中:

F为子例程序名,它的命名规则与变量名相同,但它不具有值,也无类型;X1,X2,X3…….Xn为虚参表,可以是变量名,数组名或过程名,若无参表,则括号可有可无。

Return以上就是子程序的说明,本课题中的任务1就是在模块中完成对子程序的调用,即子程序sub1(nx,ny),以下是对函数子程序的调用应注意的问题.

(1)序是独立的程序块,它可以被主程序或其他子程序调用,但不能被自己调用.程序总是从主程序开始执行,所以没有主程序,函数子程序就无法执行.正如聂老师上课所讲的那样.

(2)return语句是只允许出现在子程序中,在子程序中return语句与end语句区别是return语句可以多次出现,也可以省略.它不一定是子程序的最后一个语句.当执行到某一个)return时,立即返回调用单位.而end语句只能是有一条,它是必不可少的.而且必须放在程序最后,当执行该语句时也即返回调用单位.

(3)函数体中的执行语句用来完成函数的运算.所以在返回调用单位之前,必须把所求得的函数值赋给函数名.

(4)在函数子程序中,虚参可以是变量名,数组名和子程序名.当函数具有多个虚参时,它们之间用逗号隔开,没有虚参时,一对括号也必不可少.

(5)函数子程序是一个独立的编译单位,所以函数体内的变量语句标号等的作用范围只局限于子程序块内,除了函数名和虚参以外与其它序单位没有任何联系.

以上便是一个函数子程序的有关内容.如果实现对它的调用,直接在主模块中用call函数名(参数1,参数2…….)来实现.所以任务一就是在write(*,*)'任务1:

调用子程序1,实现算法1(自己设计)后面加callsub1(nx,ny).此时函数值将会被调出.详见附表程序.

2.算法设计:

subroutinesub1(nx,ny)

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

integerA(10),p

dataA/1,2,3,4,5,6,7,8,9,0/

write(*,*)(A(i),I=1,10)

write(*,*)'输入P的值:

'

read(*,*)P

do10,I=P,9

A(I)=A(I+1)

10continue

write(*,*)(A(I),I=1,9)

return

end

3.设计思想:

此程序是写出一个数列,然后做运算,即输入任意一个数p,将对应数列中的数值的下一位赋值与此对应的位置p.即通过A(I)=A(I+1)来实现,此语句也是一循环句,通过do10,I=P,9来运行,随后将运行结果写出。

其主要是实现对它的调用,其语句分析已经在上面说明了。

二、调用子程序2(独立生成1个文件,并加入(insert)workspace),实现算法

1.问题描述:

其实任务2与任务1相差不多,只是在所调用的子程序中加入以下语句:

open(1,file='wang.dat',status='unknown').意思是打开一个dat文件,然后将运行结果写入该文件中,即write(1,*)函数名.最后再加上close

(1).此时任务2的子程序已经完成.只要在write(*,*)'任务2:

调用子程序2(独立生成1个文件,并加入(insert)workspace),实现算法2调用callsub2(nx,ny),任务2变完成了.

2.算法设计

subroutinesub2()

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

write(*,*)'输入3个不同的数,并进行排序(从大到小)输入要比较的三个数'

open(1,file='wang.dat',status='unknown')read(*,*)i,j,k

if(j.GT.i)then

m=i

i=j

j=m

else

endif

if(k.gt.i)then

m=i

i=k

k=m

endif

if(k.le.j)then

else

m=j

j=k

k=m

write(1,*)i,j,k

endif

write(*,*)i,j,k

close

(1)

return

endsubroutinesub2

3.设计思想

此程序是运用if循环语句实现比较三个数的大小,先将其中的两个数比较大小,将大的数始终放在最前面,依次类推完成其他数字之间的比较。

然后用write(1,*)i,j,k来实现对运算结果写入对应的dat文件,即程序中的wang.dat文件.当运算结束后,里面就会出现三个数且按从大到小排列.而要完成此过程还需要open语句来实现。

即:

open(1,file='wang.dat',status='unknown')。

三、设计子程序,实现module-模块化程序设计,在子程序3(sub3)中用module,并调用其中的2个子程序

1.问题描述:

这个任务其实也是子程序的调用,只不过是使用了moudle.与上面几个任务的区别就是,要使用moudle就必须在主程序开始时用use函数名来实现.然后用call函数名将moudle中的子程序的内容调到相应位置.子程序的算法结构以及各种注意问题与任务1中的都一样.即对应于本任务中的subsub1subsub2.

2.算法设计

modulebase

!

implicitnone

contains

subroutinesubsub1(nx,ny)

integer*4nx,ny,sum,i

write(*,*)'第1题:

计算1+2+....+100的值'

sum=0

doi=1,100

sum=sum+i

enddo

write(*,*)'sum=',sum

endsubroutinesubsub1

subroutinesubsub2()

integer*4nx,ny,factor,i

!

integer*4nx,ny,m

write(*,*)'判断一个数能否被3整除,输入数值'

read(*,*)m

write(*,*)'m=',m

if(mod(m,3).eq.0)then

write(*,*)'能被3整除'

else

write(*,*)'不能被3整除'

endif

endsubroutinesubsub2

调用模块

subroutinesub3()

usebase

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

callsubsub1(nx,ny)

callsubsub2()

return

end

3.设计思想:

算法subsub

(1)是运用do循环实现1加到100的运算,算法其实很简单在语句sum=sum+i中就可以实现类加。

而subsub

(2)是运用if循环语句实现判断一个数是否被3整除,只要满足mod(m,3).eq.0即表明次数字是三的整数倍,然后输出结果是“能被3整除”。

反之亦然。

然后加入调用子程序模块中,本任务中还运用sub(3)实现对两个子程序的再一次调用。

与上面几个任务相差不多。

四、动态数组开设,并使用该动态数组,输出数组中的值,最后释放该数组的空间

1.问题描述:

(1)ALLOCATE语句

ALLOCATE语句动态创建可分配数组,使内存和对象相联系。

分配的对象可以被命名为任何有ALLOCATABLE属性的变量。

它的一般形式为:

ALLOCATE(数组名[维界符][,数组名[(维界符[,维界符...])]]...[,STAT=状态值])。

例:

REALA(:

),B(:

:

:

ALLOCATABLEA,B

ALLOCATE(A(-2:

40),B(3,3,3))

当数组被分配时,内存分配给指定大小的数组。

ALLOCATE语句中的秩必须和可分配数组的秩相同。

在分配的同时,ALLOCATE语句中的上下界决定了数组的大小和形状。

边界的值可以是正数、负数或零,缺省的下界为1。

如果维上界比下界小,则该维的长度为零,并且数组的大小为零。

大小为零的数组不能被赋值。

当前被分配的数组不能被再分配,否则会引起运行错误。

错误状态可以由ALLOCATE语句中的STAT值获得。

如果指定STAT选项,语句的成功执行时将返回0,否则返回正值。

若未指定STAT选项且出现错误时,程序将中止执行。

例:

INTEGER,ALLOCATABLE:

:

A(:

),B(:

INTEGERERR_MESSAGE

ALLOCATE(A(10:

25),B(SIZE(A)),STAT=ERR_MESSAGE)

IF(ERR_MESSAGE.NE.0)PRINT*,'ALLOCATIONERROR'

可以用内在函数ALLOCATED来判断一个数组是否已被分配。

它的形式为:

ALLOCATED(数组名)。

返回值是逻辑标量,已被分配时为真,现在还未被分配时为假,当数组的分配状态未定义时它也是未定义的。

例:

REAL,ALLOCATABLE:

:

A(:

...

IF(.NOT.ALLOCATED(A))ALLOCATE(A(5))

(2)DEALLOCATE语句

DEALLOCATE语句用来释放已分配数组的内存。

它的一般形式为:

DEALLOCATE(数组名[,数组名]...[,STAT=状态值])。

例:

INTEGER,ALLOCATABLE:

:

A(:

),B(:

INTEGERERR_MESSAGE

ALLOCATE(A(10:

25),B(SIZE(A)))

DEALLOCATE(A,B,STAT=ERR_MESSAGE)

IF(ERR_MESSAGE.NE.0)PRINT*,'DEALLOCATIONERROR'

例:

INTEGER,DIMENSION(:

),ALLOCATABLE:

:

freq

READ*,limit

ALLOCATE(freq(1:

limit))

DEALLOCATE(freq)

只有被ALLOCATE语句分配的内存空间才可以被DEALLOCATE语句释放,否则产生运行错误。

可以使用ALLOCATED语句判断数组是否被分配,错误状态可以由ALLOCATE语句中的STAT值获得。

当过程的执行被RETURN或END语句中止时,除非可分配数组是有SAVE属性的,否则它的分配状态变成未定义的。

但是,RETURN和END语句并不释放数组分配的内存,所以应该在退出子程序前主动释放数组分配的内存。

可分配数组的联合状态可以是已分配的(该数组被ALLOCATE语句分配,可以被引用、定义或释放)或是目前未联合(该数组从未分配或上一个操作是释放,数组不能被引用或定义)。

当可分配数组赋值时就被定义。

例:

INTEGER,ALLOCATABLE:

:

A(:

ALLOCATE(A(100))!

A被分配但未定义,A的分配状态是己分配

A(1:

100)=1!

A被定义

DEALLOCATE(A)!

A被释放,A的分配状态是未分配

2.算法设计:

subroutinesub4(nx,ny)

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

integer*4,dimension(:

),allocatable:

:

nd

integer*4:

:

i

allocate(nd(100))

doi=1,100

nd(i)=i

enddo

write(*,*)nd

deallocate(nd)

return

end

3.设计思想:

此算法就是实现了开设一个动态数组,即allocate(nd(100)).开设数组后即要对数组释放,deallocate(nd)即实现了对此数组的释放.此时,任务便完成.要严格按照上面所述的要求。

五、从当前文件夹中的input2中,动态读取其中数据,并将读出的数据保存在2个数值中

1.问题描述:

此任务其实就是前面几个任务的进一步深化,在某种算法的基础上要在指定的文件夹中读取数据,也就是任务中input2的有关数据,将读出的数据做一定的运算。

在此任务中还用到了调用子函数的语句,将任务一中的有关内容也结合起来了。

在此一定要注意区分与任务2中将结果写入dat文件中区别,但语句相差不多。

关键任务2中是将结果写入,而此处刚好相反。

2.算法设计:

subroutinesub5(nx,ny)

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

write(*,*)'计算input2/hunan.dat文件中数值的平方'

open(2,file='./input2/hunan.dat',status='unknown')

read(2,*)a

b=a**2

write(*,*)b

close

(2)

eturn

end

3.设计思想:

我在这里做的算法很简单,就是运算一个数的平方。

在程序语句开始定义了有关类型后,打开指定文件夹input2,我在此文件夹中建立了一个文件名为hunan的dat文件,并在里面写入了一个数字保存。

然后用open语句打开指定的文件夹,动态读取dat文件中的内容,赋值给a,此时将a做平方运算后将结果赋值与b,最后write语句写出运算结果。

六、使用if---then-----else----endif语句实现某一算法

1.问题描述:

If结构的一般格式:

Ifthen

程序块1

else

程序块2

Endif

执行过程如下:

(1)首先执行块if语句,对逻辑表达式求值,如果为真,则将流程转向执行程序块1的各个语句执行,执行完以后跳过else语句和程序块2,直接转到endif语句.

(2)如果块if语句的逻辑表达式值为假,则跳过程序块1转到else语句,else语句不执行任何操作,然后执行程序块2的各个语句,再转到endif语句.

2.算法设计

write(*,*)'任务6,使用if---then-----else----endif语句实现某一算法

write(*,*)'判断一个人考试是否通过,60分以上即可通过'

write(*,*)'输入考试成绩'

read(*,*)grade

if(grade.ge.60.0)then

write(*,*)'通过考试'

else

write(*,*)'未通过考试'

endif

pause

3.设计思想:

如上面的if语句,当输入的数值大于60时就执行书处语句”通过考试”否则执行输出”未通过考试”此时运算结束.任务也就结束了.其中,pause是表示暂停的意思.在设计类似的算法时,关键就是弄清楚if条件语句的判断与执行语句,只要逻辑上设计正确,则便可以实现所期望的算法。

七、使用do---enddo语句实现某一算法

1.问题描述:

一个do循环语句称为一个do循环,由三个部分组成:

do语句,循环体和enddo语句。

Do语句是do循环体执行的有关参数,决定是否执行循环体。

Enddo是终端语句,表明do循环语结束。

2.算法设计

write(*,*)'计算1-10的阶乘'

factor=1

doi=1,10

factor=factor*i

write(*,*)i,factor

enddo

3.设计思想:

此算法是利用do——enddo语句计算1到10的阶乘,先将factor赋初始值1,然后做连乘运算,即factor=factor*i,其中i的值就是doi=1,10,然后将结果写出来,用write语句就可以实现。

八、生成网格,并用Fa画图

1.问题描述:

此算法是实现生成网格,然后再用fa画图,其中dx=20.0/nx_Li;dy=10.0/ny_Li表示生成网格的行数和列数。

nod_Li(ne_1,1)=nl_1-1,nod_Li(ne_1,2)=nl_1nod_Li(ne_1,3)=nl_1+(nx_Li+1),nod_Li(ne_1,4)=nl_1+(nx_Li+1)-1表示网格中各格的颜色,调整算法中的数字就可以实现对颜色和格数的改变。

(算法中用到了do循环语句以及前面提到的读取文件中的数值等算法)

2.算法设计

subroutinegetmesh(nx_Li,ny_Li,nnm_li,nem_li)

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

real*8:

:

x_Li(nnm_Li),y_Li(nnm_Li)

integer:

:

nod_Li(nem_Li,4),mater_Li(nem_Li)

real*8:

:

yn(nnm_Li)

dx=20.0/nx_Li;dy=10.0/ny_Li

doj=1,ny_Li+1

doi=1,nx_Li+1

nn=(j-1)*(nx_Li+1)+i

x_Li(nn)=(i-1)*dx

y_Li(nn)=(j-1)*dy

enddo

enddo

write(*,*)'选择Aok1'

doj=1,ny_Li

doi=1,nx_Li

dok=1.,10

ne_1=(j-1)*nx_Li+i

nl_1=(j-1)*(nx_Li+1)+i+1

nod_Li(ne_1,1)=nl_1-1

nod_Li(ne_1,2)=nl_1

nod_Li(ne_1,3)=nl_1+(nx_Li+1)

nod_Li(ne_1,4)=nl_1+(nx_Li+1)-1

if(i.le.nx_Li/4)then

mater_Li(ne_1)=1

elseif((i.le.nx_Li/2).and.(i.gt.nx_Li/4))then

mater_Li(ne_1)=2

else

mater_Li(ne_1)=3

endif

enddo

enddo

enddo

callpostproc_quad(x_Li,y_Li,nnm_Li,nem_Li,nod_Li,mater_Li,yn)

write(*,*)'ok'

open(1,file='./output/col1.dat',status='unknown')

doi=1,nnm_Li

write(1,1)x_Li(i)

enddo

close

(1)

1format(1x,e23.15e4)

doi=1,nnm_Li

yns=gf(x_Li(i),y_Li(i))

yn(i)=yns

enddo

return

end

functiongf(x,y)

implicitreal*8(a-h,o-z)

implicitinteger*4(i-n)

gf=x+y+1.0

return

end

integer:

:

nnm,nem,i

real*8x(nnm),y(nnm),yn(nnm)

integer*4nod_s(nem,4),mater(nem)

write(*,*)'Inpostproc-quadrilateralgrids...'

open(1,file='Para_quadrilateral.prj',form='formatted',status='unknown')

open(2,file='Para_quadrilateral.cor',form='formatted',status='unknown')

open(3,file='Para_quadrilateral.elm',form='formatted',status='unknow

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1