Fortran模拟试卷1-8 联系客服

发布时间 : 星期日 文章Fortran模拟试卷1-8更新完毕开始阅读689aef09844769eae009ed4a

ELSEWHERE log=.TRUE. END WHERE

WRITE(*,'(1X,4I6)')a,b WRITE(*,'(1X,4L6)') log END PROGRAM example

5. 下列程序执行后,输出的第一行是_____(10)______,第二行是_____(11)_______。 PROGRAM pointer INTEGER,POINTER::arrow(:) INTEGER,ALLOCATABLE,TARGET::bullseye(:,:) ALLOCATE(arrow(1:4)) Arrow=5 WRITE(*,‘(1x,414)’)arrow ALLOCATE(bullseye(1:5,3)) bullseye=1

bullseye(1:5:2,2)=8 arrow=bullseye(2:5,2) WRITE(*,‘(1x,414)’) arrow DEALLOCATE(arrow,bullseye) END PROGRAM pointer

6. 下列程序执行后,输出的第一行是____(12)______,第四行是_____(13)______。 PROGRAM character_dummy_actual

CHARACTER(len=3),DIMENSION(1:2,1:4) :: letter

letter=RESHAPE((/'abc','def','ghi','jkl','mno','pqr','stu','vwx'/),(/2,4/)) CALL test(letter)

END program character_dummy_actual SUBROUTINE test(sub_letter)

CHARACTER(len=6),DIMENSION(1:4):: sub_letter INTEGER(1):: i DO i=1,4

WRITE(*,'(1X,\ ENDDO

END SUBROUTINE test

7. 下列程序执行后,输出的第一行是____(14)______,第二行是____(15)_____。 MODULE abc TYPE pair

CHARACTER(len=15) ::name INTEGER::age,phone_number END TYPE pair END MODULE abc PROGRAM main

13

USE abc

TYPE(pair)::point

point=pair(?Micheal Jones?,32,83365620) CALL jones(point)

WRITE(*,?(1X,A,I4,I10)?) point END PROGRAM main SUBROUTINE jones(p) USE abc

TYPE(pair)::p

WRITE(*,?(1X,A,I4,I10)?) p p.name=?Jhon Williams? p.age=35

p.phone_number=83597735 END SUBROUTINE jones

8. 插入排序(在输入过程中完成排序)。以任意次序读入20个数,先将第一个数放入数组a的第

一个元素中,以后读入的数应与已存入数组中的数进行比较,确定它在从小到大的排列中应放置的位置。将该位置及其后面的元素都向后挪一个位置,把新读入的数据填入空出的位置中,这样在数组a中的数始终保持从小到大排列。20个数据处理完后输出数组a。变量num描述第几次插入,pos描述插入数组的第几个元素,num的初值直接影响插入的位置pos。请完善以下程序实现所要求的功能。 PROGRAM main

INTEGER,PARAMETER::n=20 REAL(4),DIMENSION(n)::a REAL(4)::x INTEGER(1)::i,num num= (16)______ D0 i=l,n READ(*,*) x

CALL insert(x,a,num) ENDDO

WRITE(*,?(1X,5F7.2)?) (a(i),i=l,n) CONTAINS

SUBROUTINE insert(x,a,num) IMPLICIT NONE

REAL(4),DIMENSION(:) ::a REAL(4)::x INTEGER(1)::num,i,pos LOGICAL::search pos=l

search=.TRUE.

!下列循环找出该数在数组中应处的位置

14

D0 WHILE( (17) ) IF(x

(18)____ ENDIF ENDDO

!下列循环把该位置及以后的数往后移 D0 i=num,pos,-l (19)_____ ENDDO a(pos)=x

(20)

END SUBROUTINE insert END PROGRAM main

9. 下列程序用来寻找输入字符串string中互不相同的字符,并按升序存放到字符串stringl中。

寻找互不相同字符的方法是:逐个取出string中的字符,用二分法查找该字符在stringl中的插入位置,若该字符在stringl中出现,就不插入,否则插入到stringl中并使stringl始终保持升序。string,stringl的实际长度可能小于80。请完善以下程序以实现所要求的功能。 PROGRAM find_different_character CHARACTER(len=80)::string,stringl CHARACTER(1en=1)::ch INTEGER(1)::n,k,left,right.middle,i WRITE(*,*) ?Enter a string:? READ(*,?(A)?) string n=1

stringl(1:1)=string(1:1) d1:DO k=______(21)________ ch=string(k:k) left=l right=n

d2:D0 WHILE(left<=right) middle=(1eft+right)/2

IF(ch

ELSEIF(ch>stringl(middle:middle))THEN Left=_______(22)_______ ELSE

_______(23)________ ENDIF

15

ENDDO d2

1F(ch>stringl(middle:middle)) middle=middle+l d3:D0 i=_______(24)________

stringl(i+1:i+1):stringl(i:i) ENDDO d3

stringl(middle:middle)=ch ________(25)_________ ENDDO d1

WRITE(*,*) string

WRITE(*,*) (stringl(i:i),i=1,n) END PROGRAM find_different_character

10. 连续函数f(x)若在区间(a,b)两端取异号值则必有实根。寻找f(x)在(a,b)上的实根的二分

法是个很常见的方法:将(a,b)分成长度相等的两小区间,再找到f(x)在两端取异号值的小区间,再将其对分,如此进行到某小区间之长度小于eps时,该小区间左端点加上小区间长度的

x

一半即为近似实根。以下程序采用递归子程序bisect寻找g(x)=x/2+2*COS(x)—e的零点。变量iter_count为允许的最大迭代次数,zero为零点,delta为小区间长度的一半,xleft,xright分别为小区间左、右端点。请完善以下程序实现所要求的功能。

RECURSIVE SUBROUTINE bisect(xleft.xright,iter_count,zero,eps,f) REAL,INTENT(out)::xleft.xright,zero REAL,INTENT(in)::eps REAL,EXTERNAL::f REAL::xmean,delta INTEGER::iter_count

delta=______(26)___________ IF(xright-xleft

iter_count=iter_count-1 IF(iter_count<0)THEN zero=xleft+delta

PRINT *,?It is not a good root.? ELSE

xmean=______(28)______________ IF(f(xleft)*f(xmean)<0.0)THEN

CALL bisect(xleft,xmean,iter_count,zero,eps,f) ELSE

_________(29)_________________ ENDIF ENDIF

END SUBROUTINE bisect

! g(x)是要求得实根的连续函数

16