fortran程序30个
程序1
PROGRAM chaper1272
INTEGER :: A(10)=(/5,7,4,8,12,2,10,3,9,11/)
INTEGER :: sum=0,ave
!打开一数据文件,设置一个有格式直接存取文件,将10个数分2个记录写入文件。
!数据文件生成2个记录,每个记录行长度相同,记录长度为25 OPEN(1,FILE='input21.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=25)
WRITE(1,"(5I5)",REC=1)(A(I)+10,I=1,5) !按格式说明将头5个数写入第1个记录
WRITE(1,"(5I5)",REC=2)(A(I)+10,I=6,10)!按格式说明将后5个数写入第2个记录
READ(1,"(5I5)",REC=2)(A(I),I=6,10) !按格式说明从第2个记录中读取后5个数
READ(1,"(5I5)",REC=1)(A(I),I=1,5) !按格式说明从第1个记录中读取头5个数
DO I=1,10
sum=sum+A(I)
ENDDO
ave=sum/10
!打开一个最大记录长度为22的有格式顺序存取文件
OPEN(2,FILE='input22.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=22)
WRITE(2,"('10个数之和为:',I5)",REC=1) sum !输出1记录行,记录长度为22
WRITE(2,"('10个数平均值为:',I5)",REC=2)ave !输出1记录行,记录长度为22
WRITE(2,"(A)",REC=3) '程序运行正常结束。' !输出一个记录行,记录长度为22
END
程序2
PROGRAM average
REAL sum,ave
INTEGER n
OPEN(1,file='score.dat')
PRINT*,'正在统计平均成绩,请等待。'
sum=0.0;n=0
DO
READ(1,*,END=100) S
sum=sum+s
n=n+1
ENDDO
100 ave=sum/n
WRITE(*,"('平均成绩为:',F5.2)") ave
PRINT*,'平均成绩统计完毕。'
END
程序3
本章《文件与设备》的例题ex1009
一、本程序是一个写入文件的程序,可以用来记录全班同学的考试成绩。
二、源程序。
module typedef
type student
integer chinese,english,math
end type
end module
program exam1009
use typedef
implicit none
integer students
type(student),allocatable::s(:)
character(len=80)::filename="data.txt"
integer,parameter::fileid=10
integer::i
write(*,*) "班上有多少学生?"
read(*,*) students
allocate(s(students),stat=i)
if(i/=0) then
write(*,*) "allocate buffer fail."
stop
end if
open(fileid,file=filename)
do i=1,students
write(*,"('请输入'I2'号同学的中文、英文、及数学成绩')")i
read(*,*)s(i).chinese,s(i).english,s(i).math
write(fileid,"('座号:' I2/ '中文:'I3 ' 英文:' I3 ' 数学:'I3)")i,s(i) end do
close(fileid)
stop
end
程序4
本章《文件与设备》的例题ex1008
一、MODUL 可以用来封装程序模块,通常用来把程序具有
相关功能的函数及变量封装在一起。
二、源程序《使用MODULE》
使用这些变量的子程序和函数只要USE这个MODULE就可以使用它们。
module global
implicit none
integer a,b
common a,b
end module
program exam1008
use global
implicit none
a=1
b=2
call sub()
end program
subroutine sub()
use global
implicit none
write(*,*) a,b
return
end subroutine
程序5
本章《文件与设备》的例题ex1007
一、请调试源程序。
二、源程序《显示文件内容》
program exam1007
implicit none
character(len=79)::filename
character(len=79)::buffer
integer,parameter::fileid=10
integer::status=0
logical alive
write(*,*) "filename:"
read (*,"(A79)") filename
inquire(file=filename,exist=alive)
if(alive) then
open(unit=fileid,file=filename,access="sequential",status= "old")
do while(.true.)
read (unit=fileid,fmt="(A79)",iostat=status) buffer
if (status/=0) exit
write(*,"(A79)") buffer
end do
else
write(*,*) trim(filename)," doesn't exist."
endif
stop
end
说明:1、程序先要求用户输入所要阅读的文件
2、使用inquire查询文件是否存在
3、若存在则打开该文件,否则显示???doesn't exist.
4、对打开的文件逐行读取文件内容
5、显示改行在屏幕上
其中:因为DOS及WINDOWS窗口下,一行只能显示80个字符,所以设定
每次读入79个字符。
6、循环终止条件是STATUS不为0时。
程序6
本章《文件与设备》的例题ex1006
一、请调试源程序。
二、源程序《文件删除》
program exam1005
implicit none
integer,parameter::fileid=10
logical alive
character(len=20)::filename
write(*,*) "filename:"
read (*,"(A20)") filename
inquire(file=filename,exist=alive)
if(alive) then
open(unit=fileid,file=filename)
close(fileid,status="DELETE")
else
write(*,*) trim(filename)," doesn't exist."
endif
stop
end
用close命令关闭某文件时,可用参数DELETE删除该文件TRIM函数用来删除字符串后面的多余空格
程序7
本章《文件与设备》的例题ex1005
一、请调试源程序。
二、源程序《查询文件的状态》
program exam1005
implicit none
character (len=20)::filename="rr.f90"
logical alive
inquire (file=filename, exist=alive)
if(alive) then
write (*,*) filename ,"exist."
else
write(*,*)filename,"doesn't exist."
endif
stop
end
说明:inquire 命令可以查询字符串filename中的文件是否存在。文件存在时
ALIVE会被设成 .TRUE.,不存在则会被设成.FALSE.
程序8
本章《文件与设备》的例题ex1004
一、请调试源程序,仔细阅读注释语句。
二、源程序《有格式顺序文件的存取》
PROGRAM exam1004
INTEGER ::A(10),sum=0,ave
OPEN(1,FILE='input1.dat')
READ(1,*)(A(I),I=1,10) !按表控格式从数据文件中输入10个数!READ(1,*) A(1),A(2),A(3),A(4),A(5) !可用3个READ语句分3个行输入
!READ(1,*) A(6),A(7)
!READ(1,*) A(8),A(9),A(10)
CLOSE(1)
DO I=1,10
sum=sum+A(I)
ENDDO
ave=sum/10
!打开一个最大记录长度为25的有格式顺序存取文件
OPEN(2,FILE='c:\input2.dat',RECL=25)
WRITE(2,"('10个数之和为:',I5)") sum !输出一个记录行WRITE(2,"('10个数平均值为:',I5)") ave !输出一记录行WRITE(*,*) '程序运行正常结束。'
END
三、创建数据文件input1.dat
使用文本编辑器创建
数据文件中有10个整数,第1行5个,第2行2个,第3行3个数据文件有3个记录行,每个记录行长度不同
输入数据文件内容:
5, 7, 4, 8, 12
2,10
3, 9,11
输出数据文件内容:
10个数之和为:71
10个数平均值为:7
显示器输出信息:“程序运行正常结束。”
四、有格式顺序存取文件读写操作的方法?
有格式顺序存取文件读写操作与键盘、显示器的读写操作类似,不
同的是需要用OPEN语句打开文件,指定设备号,在READ和WRITE语句
中指定设备号,而不是星号“*”。
对于有格式顺序存取文件,OPEN中的RECL选项可指定文件的最大记录长度,但RECL选项对输入没有影响,按实际记录长度输入数据, RECL选项对输出有影响,如果输出数据是字符串,则超过最大记录长度将换行输出(下一个记录),如果输出数据不是字符串,则按表控格
式域宽或格式编辑符指定域宽输出,允许超出最大记录长度,保证输
出数据的完整性,超出最大记录长度后,下一个输出数据项换行输出。程序9
本章《文件与设备》的例题ex1003
一、请调试源程序,仔细阅读注释语句。
二、源程序《设备号与文件的关系》
PROGRAM exam1003
INTEGER fac
!输出数据至显示器,设备号可以是*或6
WRITE(*,"('输入一个整数N:'\)")!WRITE(6,*) '输入一整数N:' !从键盘输入数据,设备号可以是*或5
READ(*,*) N !或者READ(5,*) N
!使用OPEN语句打开一个外部文件,设备号为1
OPEN(UNIT=1,FILE='c:\factor1.dat',STATUS='NEW')
fac=1
DO I=1,N
fac=fac*I
!向设备号为1的外部文件输出数据,有格式输出
WRITE(1,"(I3,'!=',I7)") I,fac
ENDDO
!关闭设备号为1的逻辑设备
CLOSE(1)
!向显示器输出数据
WRITE(6,*) '程序运行结束。'
END
三、运行程序
输入数据为:
输入一个整数N:5↙
程序运行结束后,从显示器输出数据为:“程序运行结束。”,外部文件“factor.dat”中输出数据为:
1!= 1
2!= 2
3!= 6
程序10
本章《文件与设备》的例题ex1002
一、请调试源程序,并注释相关语句。
二、源程序《使用文件形式组织数据》
PARAMETER(max=100)
REAL::score(max),n,sum=0.0,ave
OPEN(1,FILE='exam2.in') !注释:
OPEN(2,FILE='c:\exam2.out') !注释:
READ(*,*) n
IF (n READ(1,*) (score(I),I=1,n) DO I=1,n sum=sum+score(I) ENDDO ave=sum/n WRITE(2,*) '学生成绩有:' !注释: WRITE(2,100) (score(I),I=1,n-1)!注释: WRITE(2,"(1X,F5.1)") score(N) WRITE(2,200) ave 100 FORMAT(1X,F5.1,','\) 200 FORMAT(1X,'平均分数:',F5.1) ELSE PRINT*,'数据太多,超出空间要求。' ENDIF close(1) CLOSE(2) END 三、数据文件 输入数据文件exam2.in 5 78.5,55.0,85.5,90.0,68.5 输出数据文件exam2.out 学生成绩有: 78.5, 55.0, 85.5, 90.0, 68.5 平均分数:75.5 四、问题:使用文件来组织数据的步骤,它的好处是什么? 上述程序使用数据文件“exam2.in”(称为输入数据文件)来组织待输入的 有关数据,如:有n个成绩数据。使用数据文件“exam2.out”(称为输出数 据文件)来存放输出数据,如:提示信息“学生成绩有:”;n个成绩数据; 平均分数ave等。对于输入数据文件(文本文件)需要在程序运行前通过Devaloper Studio开发环境建立,并编辑输入有关输入数据。对于输出数 据文件无需事先建立,程序运行过程中自动创建,并将数据输出到程序新创 建的输出数据文件中,其后可随时打开输出数据文件,浏览输出数据,也可被 其它程序使用。 在程序中使用数据文件,需要通过OPEN语句打开这些文件,指定逻辑设备和 外部文件名,建立两者间的相互关系。在输入输出语句中,直接使用相关的 逻辑设备号(如:1、2)从文件中输入数据,或将数据输出至文件。改变数 据文件中数据不影响程序代码,程序不需重新编译和构建,直接运行即可。 程序11 本章《文件与设备》的例题ex1001 一、请调试源程序,并注释相关语句。 二、源程序《使用键盘、屏幕组织数据》 PROGRAM ex1001 PARAMETER(n=5) ! 注释 REAL::score(n),sum=0.0,ave ! READ(*,*) (score(I),I=1,n)! 注释 score=(/78.5,55.0,85.5,90.0,68.5/)! 注释 DO I=1,n sum=sum+score(I) ENDDO ave=sum/n WRITE(*,*)'学生成绩有:' WRITE(*,100) (score(I),I=1,n) WRITE(*,200) ave 100 FORMAT(1X,F5.1,','\) ! 注释 200 FORMAT(1X,'平均分数:',F5.1) END 本程序组织数据的方法会带来什么后果? 本程序所处理的数据比较少(5个数据),数据通过赋值语句在内部生成(也可通过READ语句从键盘输入),数据通过WRITE语句从显示器上输出。 数据的这种组织方式在数据量比较少的情况下是可行的,并没有什么 不足之处。问题是如果程序处理的数据量比较大(如:20个、30个、50个、100个、…), 数据的这种组织方式将给程序的设计、编写和使用带来诸多不便。如果程序处理的数据个数达到100个,则在程序中 就要写100个数据。如果这些数据有所变化,则需要在程序中直接修改数据,每次修改后,都需要重新编译、构建和运行。 这种在程序中直接修改数据的做法是非常危险的,容易产生错误,将严重影响程序的可靠性。 程序12 PROGRAM exam4 CHARACTER*40 str1,str2 str1='125,250,375' READ(str1,*) i,j,k WRITE(str2,100) i,j,k,i+j+k 100 FORMAT('i=',I3,' j=',I3,' k=',I3,' i+j+k=',I3) PRINT*,i,j,k PRINT*,str2 END 程序13 !用COMMON语句建立全局变量 !使用GROUP参数将公共区分组使用, 目的是把变量分类,并放在彼此独 立的公共区内。 program ex0909 implicit none integer:: a,b common /GROUP1/a !定义公共区1 common /GROUP2/b !定义公共区2 a=1 b=2 call showGROUP1() call showGROUP2() stop end subroutine showGROUP1() implicit none integer :: num1 common /GROUP1/num1 write(*,*) num1 return end subroutine showGROUP2() implicit none integer :: num1 common /GROUP2/num1 write(*,*) num1 return end 程序14 !用COMMON语句建立全局变量 !函数和程序间,可以使用COMMON语句将各自的变量共享同一存储区域,来实现数据传递的作用。program ex0908 implicit none integer:: a,b common a,b !定义公共区 a=1 b=2 call showcommon() stop end subroutine showcommon() implicit none integer :: num1,num2 common num1,num2 !定义公共区 write(*,*) num1,num2 return end 程序15 !自定义函数(FUNCTION)的使用 !函数如果很简短又只在同一程序或函数中使用,可以这样来写。program ex0907 implicit none real :: a=1 real :: b real add !此处声明一个函数 add(a,b)=a+b !直接把函数写出,省略了定义。 write(*,*) add(a,3.0) !此处调用一个函数 stop end 程序16 !自定义函数(FUNCTION)的使用 !我们可以创建FORTRAN库里没有的函数,注意函数的定义、调用和声明语句。 program ex0906 implicit none real :: a=1 real :: b=2 real,external ::add !此处声明一个函数 write(*,*) add(a,b) !此处调用一个函数 stop end FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。 1 FORTRAN77四则运算符 + - * / ** (其中**表示乘方) 在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→() 2 FORTRAN77变量类型 2.1 隐含约定:I-N规则 凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。 如IMPLICIT REAL (I,J) 三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。 2.4 数组的说明与使用 使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例: DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3) REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2) 10FORMAT(1X,5(A2,I2,1X,A2,I4)) 2.5 使用DATA语句给数组赋初值 变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如 DATA A,B,C/-1.0,-1.0,-1.0/ DATA A/-1.0/,B/-1.0/,C/-1.0/ DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10) DATA CHN/10*' '/INTEGER NUM(1000) DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/ 3 FORTRAN77程序书写规则 程序中的变量名,不分大小写; 变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前6位有效; 一行只能写一个语句; 程序的第一个语句固定为PROGRAM 程序名称字符串 某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内容; 某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内容; 某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句最多可有19个续行; 某行的第7至72字符位为语句区,语句区内可以任加空格以求美观; 某行的第73至80字符位为注释区,80字符位以后不能有内容。 4 FORTRAN77关系运算符 .GT. 大于 .GE. 天于或等于 .LT. 小于 .LE. 小于或等于 .EQ. 等于 .NE. 不等于 .AND. 逻辑与 .OR. 逻辑或 .NOT. 逻辑非 .EQV. 逻辑等 .NEQV. 逻辑不等 运算符优先级由高到低顺序为:()→**→*或/→+或-→.GT.或.GE.或.LT. 或.LE.或.EQ.或.NE.→.NOT.→.AND.→.OR.→.EQV.或.NEQV 5 FORTRAN77语句 1.Fibonacci数列定义如下: F1=1 F2=1 F n=F n-1+F n-2 (n>2) 求Fibonacci数列的前30项。 integer f(30),i f(1)=1 f(2)=2 do i=3,30 f(i)=f(i-1)+f(i-2) enddo print*,f end 2.输入10个学生的总分,求每个学生的名次integer s(10),a(10),i,j do i=1,10 read*,s(i) enddo do i=1,10 a(i)=1 do j=1,10 if(s(i)FORTRAN 90 程序编程规范
fortran语法手册
fortran程序案例题汇编(14道)