fortran程序30个.doc_第1页
fortran程序30个.doc_第2页
fortran程序30个.doc_第3页
fortran程序30个.doc_第4页
fortran程序30个.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序1PROGRAM chaper1272INTEGER : A(10)=(/5,7,4,8,12,2,10,3,9,11/)INTEGER : sum=0,ave!打开一数据文件,设置一个有格式直接存取文件,将10个数分2个记录写入文件。!数据文件生成2个记录,每个记录行长度相同,记录长度为25OPEN(1,FILE=input21.dat,FORM=FORMATTED,ACCESS=DIRECT,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)ENDDOave=sum/10!打开一个最大记录长度为22的有格式顺序存取文件OPEN(2,FILE=input22.dat,FORM=FORMATTED,ACCESS=DIRECT,RECL=22) WRITE(2,(10个数之和为:,I5),REC=1) sum !输出1记录行,记录长度为22WRITE(2,(10个数平均值为:,I5),REC=2)ave !输出1记录行,记录长度为22WRITE(2,(A),REC=3) 程序运行正常结束。 !输出一个记录行,记录长度为22 END程序2PROGRAM 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 ENDDO100 ave=sum/nWRITE(*,(平均成绩为:,F5.2) ave PRINT*,平均成绩统计完毕。END程序3本章文件与设备的例题 ex1009一、本程序是一个写入文件的程序,可以用来记录全班同学的考试成绩。二、源程序 。module typedeftype studentinteger chinese,english,mathend typeend moduleprogram exam1009use typedefimplicit noneinteger studentstype(student),allocatable:s(:)character(len=80):filename=data.txtinteger,parameter:fileid=10integer:iwrite(*,*) 班上有多少学生?read(*,*) studentsallocate(s(students),stat=i)if(i/=0) then write(*,*) allocate buffer fail.stopend ifopen(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 doclose(fileid)stopend程序4本章文件与设备的例题 ex1008一、MODUL 可以用来封装程序模块,通常用来把程序具有相关功能的函数及变量封装在一起。二、源程序 使用MODULE使用这些变量的子程序和函数只要USE这个MODULE就可以使用它们。module globalimplicit noneinteger a,bcommon a,bend moduleprogram exam1008use globalimplicit nonea=1b=2call sub()end programsubroutine sub()use globalimplicit nonewrite(*,*) a,breturnend subroutine程序5本章文件与设备的例题 ex1007一、请调试源程序。二、源程序 显示文件内容program exam1007implicit nonecharacter(len=79):filenamecharacter(len=79):bufferinteger,parameter:fileid=10integer:status=0logical alivewrite(*,*) 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 doelsewrite(*,*) trim(filename), doesnt exist.endifstopend说明:1、程序先要求用户输入所要阅读的文件 2、使用inquire查询文件是否存在 3、若存在则打开该文件,否则显示 ?doesnt exist. 4、对打开的文件逐行读取文件内容 5、显示改行在屏幕上其中:因为DOS及WINDOWS窗口下,一行只能显示80个字符,所以设定每次读入79个字符。 6、循环终止条件是STATUS不为0时。程序6本章文件与设备的例题 ex1006一、请调试源程序。二、源程序 文件删除program exam1005implicit noneinteger,parameter:fileid=10logical alivecharacter(len=20):filenamewrite(*,*) filename:read (*,(A20) filename inquire(file=filename,exist=alive)if(alive) then open(unit=fileid,file=filename) close(fileid,status=DELETE) elsewrite(*,*) trim(filename), doesnt exist.endifstopend用close命令关闭某文件时,可用参数DELETE删除该文件TRIM函数用来删除字符串后面的多余空格程序7本章文件与设备的例题 ex1005一、请调试源程序。二、源程序 查询文件的状态program exam1005implicit nonecharacter (len=20):filename=rr.f90logical aliveinquire (file=filename, exist=alive)if(alive) then write (*,*) filename ,exist.else write(*,*)filename,doesnt exist.endifstopend说明:inquire 命令可以查询字符串filename中的文件是否存在。文件存在时ALIVE会被设成 .TRUE.,不存在则会被设成.FALSE.程序8本章文件与设备的例题 ex1004一、请调试源程序,仔细阅读注释语句。二、源程序 有格式顺序文件的存取PROGRAM exam1004INTEGER :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)ENDDOave=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, 122,103, 9,11输出数据文件内容:10个数之和为: 7110个数平均值为: 7显示器输出信息:“程序运行正常结束。”四、有格式顺序存取文件读写操作的方法?有格式顺序存取文件读写操作与键盘、显示器的读写操作类似,不同的是需要用OPEN语句打开文件,指定设备号,在READ和WRITE语句中指定设备号,而不是星号“*”。对于有格式顺序存取文件,OPEN中的RECL选项可指定文件的最大记录长度,但RECL选项对输入没有影响,按实际记录长度输入数据,RECL选项对输出有影响,如果输出数据是字符串,则超过最大记录长度将换行输出(下一个记录),如果输出数据不是字符串,则按表控格式域宽或格式编辑符指定域宽输出,允许超出最大记录长度,保证输出数据的完整性,超出最大记录长度后,下一个输出数据项换行输出。程序9本章文件与设备的例题 ex1003一、请调试源程序,仔细阅读注释语句。二、源程序 设备号与文件的关系PROGRAM exam1003INTEGER fac!输出数据至显示器,设备号可以是*或6WRITE(*,(输入一个整数N:)!WRITE(6,*) 输入一整数N:!从键盘输入数据,设备号可以是*或5READ(*,*) N !或者READ(5,*) N!使用OPEN语句打开一个外部文件,设备号为1OPEN(UNIT=1,FILE=c:factor1.dat,STATUS=NEW)fac=1DO I=1,N fac=fac*I !向设备号为1的外部文件输出数据,有格式输出 WRITE(1,(I3,!=,I7) I,facENDDO!关闭设备号为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,aveOPEN(1,FILE=exam2.in) !注释:OPEN(2,FILE=c:exam2.out) !注释:READ(*,*) nIF (n100) new_scores=100; WHERE(new_scores0) new_scores=0sum=0.0DO i=1,n sum=sum+new_scores(i) IF (new_scores(i)60) THEN grades(i)=不及格 ELSEIF (new_scores(i)70) THEN grades(i)=及格 ELSEIF (new_scores(i)80) THEN grades(i)=中 ELSEIF (new_scores(i)90) THEN grades(i)=良 ELSE grades(i)=优 ENDIF ENDDO new_av=sum/n!输出数据WRITE(*,(1X,学生姓名,2X,调整前成绩,2X,调整后成绩,2X,成绩等级)WRITE(*,(1X,44A1) (-,i=1,44)DO i=1,n WRITE(*,100) names(i),old_scores(i),new_scores(i),grades(i)ENDDOWRITE(*,(1X,44A1) (-,i=1,44)WRITE(*,(1X,调整前平均成绩:,F7.2) old_avWRITE(*,(1X,调整后平均成绩:,F7.2) new_av100 FORMAT(1X,A10,2X,I10,2X,I10,2X,A6)END程序22例8.9计算N个测试数据的平均值和标准偏差。测试数据个数不定。测试数据用一个一维数组X表示,平均值用变量Xa表示,标准偏差用变量Xs表示。测试数据个数不确定,假设最大个数max为50,实际个数为N。从键盘输入数据,数据以非数值字符为结束标志。程序如下: PROGRAM array881!说明变量和数组PARAMETER(max=50)INTEGER : N=0REAL : X(max),Xa,Xs,sum=0.0,data!从键盘输入数据并求和 。DO WHILE (.TRUE.) READ(*,*,IOSTAT=io) dataIF (io/=0) EXIT N=N+1 X(N)=data sum=sum+dataENDDOXa=sum/Nsum=0.0DO i=1,N sum=sum+(X(i)-Xa)*2ENDDOXs=SQRT(sum/(N-1)WRITE(*,(1X,测试数据:,F10.2) (X(i),i=1,N)WRITE(*,(1X,平均值:,F10.2) XaWRITE(*,(1X,标准偏差:,F10.2) XsEND 输入数据:25.32,18.35,44.78,57.39,85.2,A输出结果:测试数据: 25.32 18.35 44.78 57.39 85.20 平均值 :46.21标准偏差:26.74程序23使用数组构造器按存储结构次序给数组赋初值。数组构造器是由若干数据或隐含DO循环组成的一个线性表。数组构造器一般给一维数组赋初值,对于多维数组需使用标准函数RESHAPE将数组构造器转换为与多维数组逻辑结构一致的形式,给数组赋初值。一般格式:(/) , 例8.8:已知矩阵A,内部赋初值并按逻辑结构输出该矩阵。 2 8 14 20 4 10 16 22 6 12 18 24PROGRAM ex808PARAMETER(M=3,N=4)REAL A(M,N)A=RESHAPE(/2,4,6,8,10,12,14,16,18,20,22,24/),(/3,4/)!A=RESHAPE(/(I,I=2,24,2)/),(/3,4/)PRINT*,输出数组A:WRITE(*,(,f4.1,) (A(I,J),J=1,N),I=1,M)END!输出结果同例题中矩阵。程序23使用隐含DO循环语句输入输出部分或全部数组元素。 例8.7:已知矩阵A,输入矩阵数据并转置输出该矩阵。 12.5 23.8 54.2 78.9 92.4 45.3 0.0 24.4 84.2 32.8 72.8 43.2PROGRAM ex807PARAMETER(M=3,N=4)REAL A(M,N)WRITE(*,(按逻辑结构输入,I3, 个矩阵数据:) M*NREAD *,(A(i,j),j=1,N),i=1,M)PRINT *,输出转置后数组:WRITE(*,( ,F4.1, ) (A(i,j),i=1,M),j=1,N)END输入数据:以行为主输入 12 个矩阵数据,每行输入一个数据:12.5 23.8 54.2 78.992.4 45.3 0 24.484.2 32.8 72.8 43.2输出结果:输出转置后数组: 12.5 92.4 84.2 23.8 45.3 32.8 54.2 0.0 72.8 78.9 24.4 43.2程序24使用隐含DO循环语句输入输出部分或全部数组元素。 例8.6:已知5个学生成绩:85,94,78,51,35。按序输入,统计平均成绩,然后修改第1,3,5个学生成绩,再统计平均成绩,输出5个学生最新成绩及修改前后平均成绩。程序如下:PROGRAM ex806PARAMETER(N=5)REAL : sum=0,av1,av2,score(N)WRITE(*,( 输入,I2, 名学生的成绩,每行输入多个成绩:) ) NREAD *,(score(i),i=1,N)DO i=1,N sum=sum+score(i)ENDDOav1=sum/NPRINT*, 输入第奇数个学生新成绩:READ *,(score(i),i=1,N,2)sum=0DO i=1,N sum=sum+score(i)ENDDOav2=sum/NPRINT *,N,名学生的最新成绩是:WRITE(*,(F5.1,) )(score(i),i=1,N-1)WRITE(*,(F5.1)score(N)WRITE(*,( 更新前平均成绩是:,F7.2) av1WRITE(*,( 更新后平均成绩是:,F7.2) av2END 输入数据:输入 5 名学生的成绩,每行输入多个成绩: 85,94,78,51,35 输入第奇数个学生新成绩: 11,33,55输出结果: 5名学生的最新成绩是: 11.0, 94.0, 33.0, 51.0, 55.0 更新前平均成绩是: 68.60 更新后平均成绩是: 48.80程序25使用DO循环语句输入输出部分或全部数组元素。 例8.5:已知矩阵A,输入矩阵数据并转置输出该矩阵。 1 2 3 4 5 6 7 8 9 10 11 12PROGRAM ex805PARAMETER(M=3,N=4)REAL A(m,n),B(N,M)WRITE(*,( 按存储结构输入,I3, 个矩阵数据:) M*N!注意按列输入数据READ *,ADO I=1,M DO J=1,N B(J,I)=A(I,J) ENDDOENDDOPRINT *,输出转置前数组:do i=1,mwrite(*,(1x,4f4.1),a(i,1),a(i,2),a(i,3),a(i,4)enddo PRINT *,输出转置后数组:do j=1,nwrite(*,(1x,3f4.1),b(j,1),b(j,2),b(j,3)enddoEND程序26使用DO循环语句输入输出部分或全部数组元素。 例8.4:已知5个学生成绩:85,94,78,51,35。按序输入,统计平均成绩,然后修改第1,3,5个学生成绩,再统计平均成绩,输出5个学生最新成绩及修改前后平均成绩。PARAMETER(N=5)REAL : sum=0,av1,av2,score(N)WRITE(*,( 输入,I2, 名学生的成绩,每行输入一个成绩:) ) NDO i=1,N READ *,score(i);sum=sum+score(i)ENDDOav1=sum/NDO i=1,N,2 WRITE(*,( 输入第,I1, 个学生新成绩:) i READ *,score(i)ENDDOsum=0DO i=1,N sum=sum+score(i)ENDDOav2=sum/NPRINT *,N,名学生的最新成绩是:DO i=1,N-1 WRITE(*,( ,F5.1,) )score(i)ENDDOWRITE(*,( ,F5.1))score(N)WRITE(*,( 更新前平均成绩是:,F7.2) av1WRITE(*,( 更新后平均成绩是:,F7.2) av2END 程序26PROGRAM change_pay !数组赋初值 REAL : teacher(1001:1005)=(/1200,1500,3500,2000,2400/) !下标为教师工号 PRINT *,输入教师工号和加减工资额: READ *,i,a IF (iUBOUND(teacher,1) .OR. iav) num=num+1ENDDO PRINT *,平均值为:,avPRINT *,大于平均值的数据个数为:,numEND程序28例7.5 某位职员的体重是个秘密,看看需要几次可以猜中。这个程序是个很典型必须使用DO WHILE循环来解决的程序 解:程序执行后会不断要求用户猜一个数字,直到猜到答案为止。程序中声明了三个变量,WEIGHT用来存储答案,E用来作为浮点数的误差值,GUESS用来读取用户猜测的数值。PROGRAM ex707Implicit noneReal,parameter:weight=45.0 !答案Real,parameter:E=0.001 !误差Real:g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论