fortran程序案例题汇编(14道)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.Fibonacci数列定义如下:F1=1F2=1Fn=F
n-1+F
n-2(n>2)
求Fibonacci数列的前30项。
integer f
(30),if(1)=1f(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)<s(j))a(i)=a(i)+1
enddo
enddo
do i=1,10
print*,s(i),a(i)
enddo
end
3.给定一组数,按照从小到大的顺序输出。
integer a
(10)
integer p
do i=1,10
read *,a(i)
enddo
do j=1,9
p=j
do i=j+1,10
if (a(i)<a(p))p=i
enddo
if (p/=j) then
t=a(p);a(p)=a(j);a(j)=t
endif
enddo
print *,(a(i),i=1,10)
end
4.输入若干名学生的学号和三门课程(语数英)的成绩,要求从键盘输入一个学生的学号,能打印出该学生的三门功课成绩和总分。
character*6,dimension(:
),allocatable:
:xue
integer,dimension(:
,:),allocatable:
:g
integer,dimension(:
),allocatable:
:zong
integer i,j,n
character*6,xh
print *,"请输入学生的个数"
read *,n
allocate(xue(n))
allocate(g(n,3))
allocate(zong(n))
do i=1,n
read *,xue(i),(g(i,j),j=1,3)
enddo
do i=1,n
zong(i)=0
do j=1,3
zong(i)=zong(i)+g(i,j)
enddo
enddo
print *,"请输入你要打印的学生的学号"
read *,xh
do i=1,n
if(xue(i)==xh)then
print *,(g(i,j),j=1,3),zong(i)
exit
endif
enddo
end
5.编写一个函数子程序计算所输入两个整数m、n的最大公约数。
integer function gcd(m,n)
integer r
r=mod(m,n)
do while (r/=0)
m=n
n=r
r=mod(m,n)
enddo
gcd=n
end
integer x,y,gcd
read*,x,y
print*,gcd(x,y)
end
6.用函数子程序的方法设计一个判断某个数是否是素数的程序,统计100~1000内的素数的个数。
logical function prime(n)
logical t
t=.true.
do i=2,n-1
if(mod(n,i)==0)then
t=.false.
exit
enddo
prime=t
end
integer s
logical prime
s=0
do i=100,1000
if(prime(i))then
s=s+1
endif
enddo
print*,s
end
7.设计一个子程序,对于自然数m,n,该函数求m,n的最小公倍数。
integer function gcd(m,n)
integer r,t
t=m*n
r=mod(m,n)
do while (r/=0)
m=n
r=mod(m,n)
enddo
gcd=t/n
end
integer x,y,gcd
print*,"请输入两个数"
read*,x,y
print*,gcd(x,y)
end
8.对任意自然数n,设计一个求n的各位数字的立方和的子程序,并调用该子程序求100~999之间的所有水仙花数。
subroutine shu(n,t)
integer n,i,a,b,c
logical t
a=n/100
b=mod(n/10,10)
c=mod(n,10)
if(a**3+b**3+c**3==n)then
t=.true.
else
t=.false.
end
logical t
do i=100,999
call shu(i,t)
if(t)then
print*,i
endif
enddo
end
9.设计一个子例行程序SORT(A,N,K),其中A是一个一维数组,N是A 的元素个数,SORT的功能是:
当K=1时,将数组A按升序排列;当K=0时,将数组A按降序排列;当K 为其它数值时,数组A保持原序。
调用该子程序根据不同输入得出数组不同的输出方式。
subroutine sort(a,n,k)
integer a(n)
integer k,i
select case(k)
case
(0)
do i=1,n-1
do j=1,n-I
if(a(j)>a(j+1)) then t=a(j)
a(j)=a(j+1)
a(j+1)=t
endif
enddo
enddo
case
(1)
do i=1,n-1
do j=1,n-I
if(a(j)<a(j+1)) then t=a(j)
a(j)=a(j+1)
a(j+1)=t
endif
enddo
enddo
end select
end
real,dimension(:
),allocatable:
:b
integer k,n
print*,"请输入要排序的数据数目"
read*,n
allocate(b(n))
print *,"请输入这n个数据"
read *,(b(i),i=1,n)
print*,"请输入k的值"
read *,k
call sort(b,n,k)
print *,(b(i),i=1,n)
end
10.编写一个判断闰年的程序。
调用该过程输出2011~2050之间所有的闰年。
function s(n)
integer n
logical s
if(mod(n,4)==
0.and.mod(n,100)/=
0.or.mod(n,400)==0)then
s=.true.
else
s=.false.
endif
end
logical s
do i=2011,2050
if(s(i))then
print*,i
endif
enddo
end
11.利用子程序机制实现:
输入若干名学生的学号和三门课程的成绩;计算每个学生的总分;输出每个学生的学号、三门课程的成绩和总分。
integer,dimension(:
,:),allocatable:
:grade
integer,dimension(:
),allocatable:
:zong
integer,dimension(:
),allocatable:
:mingci
integer m,n
read *,m,n
allocate (grade(m,n))
allocate(zong(m))
allocate(mingci(m))
call input(grade,m,n)
call sum1(grade,m,n,zong)
call qiuming(zong,m,mingci)
call output(grade,m,n,zong,mingci) end
subroutine input(grade,m,n) integer grade(m,n)
print *,"请输入成绩"
do i=1,m
read *,(grade(i,j),j=1,n)
enddo
end
subroutine sum1(grade,m,n,zong) integer grade(m,n)
zong=0
do i=1,m
do j=1,n
zong(i)=zong(i)+grade(i,j)
enddo
enddo
end
subroutine qiuming(zong,m,mingci) integer zong(m)
integer mingci(m)
mingci=1
do i=1,m
do j=1,m
if(zong(i)<zong(j))then
mingci(i)=mingci(i)+1endif
enddo
enddo
end
subroutine output(grade,m,n,zong,mingci) integer grade(m,n)
integer mingci(m)
do i=1,m
print *,(grade(i,j),j=1,n),zong(i),mingci(i) enddo
end
12.利用递归函数方法实现:
求n!;然后调用该函数求
x2x4x6
cos(x)1
2!
4!
6!...
直到最后一项10
6.
integer recursive function fac(n) result(f) if(n==1) then
f=1
else
f=n*fac(n-1)
endif
end
parameter(pi=
3.)
real x,s
integer n,f
s=1
print*,"请输入角度值"
read*,x
x=x*pi/180
f=-1
n=2
do while(abs(f*x**n/fac(n)>1e-6)
s=s+f*x**n/fac(n)
n=n+2
f=-f
enddo
print*,s
end
13.输入10名学生的学号、姓名、性别和一门课程的成绩,要求打印出不及格学生的所有信息。
type s
character*11 num
logical sex
real grade
end type
type(s) g
(10)
integer i,j
print*,"请输入学生的基本信息"
do i=1,10
read*,g(i).num,g(i).name,g(i).sex,g(i).grade
enddo
do i=1,10
if(g(i).grade<60)then
j=i
endif
enddo
print*,g(j).num,g(j).name,g(j).sex,g(j).grade
end
14.已知职工工资表记录包括:
职工号,姓名,年龄、职称、工资,建立一个10个职工组成的记录表,打印输出职工中工资最高者和最低者所有信息,以及工资总额和平均工资。
type emp
character*8 name
integer age
character*16 zhichen
real wage
endtype
type(emp) s
(10)
integer i
real max,min,sum,avg
print*,"请输入职工的基本信息"
do i=1,10
read *,s(i).num,s(i).name,s(i).age,s(i).zhichen,s(i).wage enddo
max=s
(1).wage;j=1
do i=2,10
if(max<s(i).wage)then
max=s(i).wage
j=i
endif
enddo
max=s
(1).wage;k=1
do i=2,10
if(min>s(i).wage)then
min=s(i).wage
k=i
endif
enddo
sum=0
do i=1,10
sum=sum+s(i).wage
enddo
avg=sum/10
print *,"输出最高工资的职工信息"
print *,s(j).num,s(j).name,s(j).age,s(j).zhichen,s(j).wage print *,"输出最低工资的职工信息"
print *,s(k).num,s(k).name,s(k).age,s(k).zhichen,s(k).wage print *,"输出工资总额和平均值"
print *,sum,avg
end。