fortran 编程练习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.编写程序输出杨辉三角。
program main implicit none integer i,j,n integer a(1:50,1:50)
write(*,*) " 请输入杨辉三角的阶数" read(*,*) n do i = 1, n
a(i,1) = 1 a(i,i) = 1 end do
do i= 2,n-1 do j = 1,i-1 a(i+1,j+1)=a(i,j)+a(i,j+1) end do end do
write(*,*) "杨辉三角的展开式为:" do i =1,n write(*,"(1x,100i6)") (a(i,j),j=1,i) end do
write(*,*)"调整后输出展开式为:" write(*,"(28x,100i6)") a(1,1) write(*,"(25x,100i6)") (a(2,i),i=1,2) write(*,"(22x,100i6)") (a(3,i),i=1,3) write(*,"(19x,100i6)") (a(4,i),i=1,4) write(*,"(16x,100i6)") (a(5,i),i=1,5) write(*,"(13x,100i6)") (a(6,i),i=1,6) write(*,"(10x,100i6)") (a(7,i),i=1,7) write(*,"(7x,100i6)") (a(8,i),i=1,8) write(*,"(4x,100i6)") (a(9,i),i=1,9) write(*,"(1x,100i6)") (a(10,i),i=1,10) end
2.把一个数列中的所有相同的数删到只剩一个。
program main implicit none
integer n,i,j,k real a(50) write(*,*)"输入数字个数n=" read(*,*)n write(*,*)"输入数字" read(*,*)(a(i),i=1,n)
do i=1,n do j=i+1,n if(a(i)==a(j))then do k=j,n-1 a(k)=a(k+1) end do n=n-1
3.输出所有水仙花数(水仙花数是指一个三位正整数,其各位数字的 立方和等于该数本身)。
program main implicit none integer a,b,c,d do 5 d=100,999 a=mod(d/100,10) b=mod(d/10,10)
c=mod(d,10) if (d==a**3+b**3+c**3) then write(*,15) 15 format(1x,i3,"为a水仙花数" ) else write(*,25) 25 format(1x,i3,"不为水仙花数" ) endif 5 d=d+1 stop end
一.循环篇
Fortran 程序设计
1.编程找出并输出 100-150 之间和 400-450 之间能被 9 整除的数。
program main implicit none integer a,b a=100 do 10 while(a<=150)
if(mod(a,9)==0) write(*,*)a 10 a=a+1
j=0 do 40 while(j.le.4-2*i) write(*,4) 4 format(1x,"*") 40 j=j+1 15 i=i+1 end
二.循环篇
1.输入 n 个数,找出所有大于 n 个数的平均值的那些数及最小数。
program main implicit none real a(50),min,d,c integer n,i write(*,*)"输入数字个数n=" read(*,*) n write(*,*) "输入数字:" read(*,*)(a(i),i=1,n) c=0 do i=1,n
write(*,*)"您输入的十六进制数为",c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5/="0")then write(*,*)"您输入的十六进制数为",c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6/="0")then write(*,*)"您输入的十六进制数为",c6//c7//c8 else
subroutine x(m,n,y2) integer r,m,n,y2 r=mod(m,n) do 20,while(r.ne.0) m=n n=r 20 r=mod(m,n) y2=n end !求两个数的最大公约数 program main implicit none integer m,n,y1,y2 write(*,*)"输入两个数:" read(*,*)m,n call d(m,n,y1) call x(m,n,y2) write(*,30)y2 30 format(1x,'这两个数的最大公约数是',i5) write(*,40)y1 40 format(1x,'这两个数的最小公倍数是',i5) end
4 .编程输出如下图形。
* *** ***** ******* ***
*
program main implicit none integer i,j i=0 do 5 while(i.le.3) j=0 do 10 while (j.le.2-i) write(*,1) 1 format(1x," ") 10 j=j+1 j=0 do 20 while(j.le.2*i) write(*,2) 2 format(1x,"*") 20 j=j+1 5 i=i+1 i=0 do 15 while(i.ne.2) j=0 do 30 while(j.le.i) write(*,3) 3 format(1x," ") 30 j=j+1
if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6=="0".and.c7/="0")then write(*,*)"您输入的十六进制数为",c7//c8 else
if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6=="0".and.c7=="0")then write(*,*)"您输入的十六进制数为",c8 else write(*,*)"您输入的十六进制数为",c1//c2//c3//c4//c5//c6//c7//c8 end if end if end if end if end if end if end if
v1=iachar(c1) v2=iachar(c2) v3=iachar(c3) v4=iachar(c4) v5=iachar(c5) v6=iachar(c6) v7=iachar(c7) v8=iachar(c8)
!将输入字符型变量转换为数簓值
x=name(v1)*16**7+name(v2)*16**6+name(v3)**16*5+name(v4)**16*4+name(v5)*16**3+name(v6)*1 6**2+name(v7)**16+name(v8)
c=c+a(i) end do
d=c/n do i=1,n if(a(i).ge.d)then write(*,*)"大于平均数的数为:" write(*,"(1x,50f10.4)")a(i) end if end do min=a(1) do i=1,n if (a(i).le.min) then min=a(i) end if end do write(*,*)"最小数为a" write(*,"(1x,f10.4)")min end
program main implicit none real a(1:25),b(1:25),c(1:50) integer i,s,k,m,n write(*,*)"输入数组a元素个数m=" read(*,*)m write(*,*)"输入数组a各元素:" read(*,*)(a(i),i=1,m) write(*,*)"输入数组b元素个数n=" read(*,*)n write(*,*)"输入数组b各元素:" read(*,*)(b(i),i=1,n) s=1 k=1 do i=1,m+n
do m=1,5 do n=1,5 if(m.eq.n.or.m+n==6)then a(m,n)="i" else a(m,n)="j" end if end do
end do do m=1,5 write(wenku.baidu.com,"(1x,10i5)")a(m,1:5) end do end
4.设有序(值从小到大)的两组数据,将这两组数据有序合并(合并 过程数据始终保持有序)。
2.编写一个子程序,将一个十六进制数转换为十进制数。并编写主程 序调用该子程序,输出结果。
program main implicit none integer x,n,v1,v2,v3,v4,v5,v6,v7,v8,name character c1,c2,c3,c4,c5,c6,c7,c8 write (*,*) ' 请输入十六进制数各位字(高位用零补齐):' read(*,*) c1,c2,c3,c4,c5,c6,c7,c8 if(c1=="0".and.c2/="0")then !将输入各位数字串联输出,最高位以前的舍去。 write(*,*)"您输入的十六进制数为",c2//c3//c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3/="0")then write(*,*)"您输入的十六进制数为",c3//c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4/="0")then
b=400 do 20 while(b<=450)
if(mod(b,9)==0) write(*,*)b 20 b=b+1
end
2.回文数是指正读和反读都一样的数。如:232,编程求 100 到 999 之间的回文数。
program main implicit none integer a,b,c,n do 5 n=100,999 a=mod(n,10) b=n/100 5 n=n+1 If(a==b)then write(*,10)n 10 format(1x,"100-999之间的回文数:",i3) end if stop end
end if end do end do write(*,*)"删除后的数列为:" write(*,"(1x,50f10.4)") (a(i),i=1,n) end
3.形成一个 5 行 5 列矩阵,要求两条对角线元素均为 i,其余元素均 为 j。
program main implicit none integer a(5,5),m,n
if(a(s)<=b(k).and.s<=m)then c(i)=a(s) s=s+1 else if(a(s)>b(k).and.k<=n)then c(i)=b(k) k=k+1 else if(s>m)then c(i)=b(k) k=k+1 else if(k>n)then c(i)=a(s) s=s+1 end if end if end if end if end do write(*,*)"排列整合后的数列为:" write(*,"(1x,7f10.4)")(c(i),i=1,m+n) end
三.子程序篇
1.编写两个子程序,分别求两个整数的最大公约数和最小公倍数,并 编写主程序调用这两个子程序,输出结果。
subroutine d(m,n,y1) integer r,a,b,c,m,n,y1 a=m b=n r=mod(m,n) do 10,while(r.ne.0) m=n n=r
10 r=mod(m,n) c=a*b/n y1=c end !求两个数的最小公倍数
program main implicit none integer i,j,n integer a(1:50,1:50)
write(*,*) " 请输入杨辉三角的阶数" read(*,*) n do i = 1, n
a(i,1) = 1 a(i,i) = 1 end do
do i= 2,n-1 do j = 1,i-1 a(i+1,j+1)=a(i,j)+a(i,j+1) end do end do
write(*,*) "杨辉三角的展开式为:" do i =1,n write(*,"(1x,100i6)") (a(i,j),j=1,i) end do
write(*,*)"调整后输出展开式为:" write(*,"(28x,100i6)") a(1,1) write(*,"(25x,100i6)") (a(2,i),i=1,2) write(*,"(22x,100i6)") (a(3,i),i=1,3) write(*,"(19x,100i6)") (a(4,i),i=1,4) write(*,"(16x,100i6)") (a(5,i),i=1,5) write(*,"(13x,100i6)") (a(6,i),i=1,6) write(*,"(10x,100i6)") (a(7,i),i=1,7) write(*,"(7x,100i6)") (a(8,i),i=1,8) write(*,"(4x,100i6)") (a(9,i),i=1,9) write(*,"(1x,100i6)") (a(10,i),i=1,10) end
2.把一个数列中的所有相同的数删到只剩一个。
program main implicit none
integer n,i,j,k real a(50) write(*,*)"输入数字个数n=" read(*,*)n write(*,*)"输入数字" read(*,*)(a(i),i=1,n)
do i=1,n do j=i+1,n if(a(i)==a(j))then do k=j,n-1 a(k)=a(k+1) end do n=n-1
3.输出所有水仙花数(水仙花数是指一个三位正整数,其各位数字的 立方和等于该数本身)。
program main implicit none integer a,b,c,d do 5 d=100,999 a=mod(d/100,10) b=mod(d/10,10)
c=mod(d,10) if (d==a**3+b**3+c**3) then write(*,15) 15 format(1x,i3,"为a水仙花数" ) else write(*,25) 25 format(1x,i3,"不为水仙花数" ) endif 5 d=d+1 stop end
一.循环篇
Fortran 程序设计
1.编程找出并输出 100-150 之间和 400-450 之间能被 9 整除的数。
program main implicit none integer a,b a=100 do 10 while(a<=150)
if(mod(a,9)==0) write(*,*)a 10 a=a+1
j=0 do 40 while(j.le.4-2*i) write(*,4) 4 format(1x,"*") 40 j=j+1 15 i=i+1 end
二.循环篇
1.输入 n 个数,找出所有大于 n 个数的平均值的那些数及最小数。
program main implicit none real a(50),min,d,c integer n,i write(*,*)"输入数字个数n=" read(*,*) n write(*,*) "输入数字:" read(*,*)(a(i),i=1,n) c=0 do i=1,n
write(*,*)"您输入的十六进制数为",c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5/="0")then write(*,*)"您输入的十六进制数为",c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6/="0")then write(*,*)"您输入的十六进制数为",c6//c7//c8 else
subroutine x(m,n,y2) integer r,m,n,y2 r=mod(m,n) do 20,while(r.ne.0) m=n n=r 20 r=mod(m,n) y2=n end !求两个数的最大公约数 program main implicit none integer m,n,y1,y2 write(*,*)"输入两个数:" read(*,*)m,n call d(m,n,y1) call x(m,n,y2) write(*,30)y2 30 format(1x,'这两个数的最大公约数是',i5) write(*,40)y1 40 format(1x,'这两个数的最小公倍数是',i5) end
4 .编程输出如下图形。
* *** ***** ******* ***
*
program main implicit none integer i,j i=0 do 5 while(i.le.3) j=0 do 10 while (j.le.2-i) write(*,1) 1 format(1x," ") 10 j=j+1 j=0 do 20 while(j.le.2*i) write(*,2) 2 format(1x,"*") 20 j=j+1 5 i=i+1 i=0 do 15 while(i.ne.2) j=0 do 30 while(j.le.i) write(*,3) 3 format(1x," ") 30 j=j+1
if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6=="0".and.c7/="0")then write(*,*)"您输入的十六进制数为",c7//c8 else
if(c1=="0".and.c2=="0".and.c3=="0".and.c4=="0".and.c5=="0".and.c6=="0".and.c7=="0")then write(*,*)"您输入的十六进制数为",c8 else write(*,*)"您输入的十六进制数为",c1//c2//c3//c4//c5//c6//c7//c8 end if end if end if end if end if end if end if
v1=iachar(c1) v2=iachar(c2) v3=iachar(c3) v4=iachar(c4) v5=iachar(c5) v6=iachar(c6) v7=iachar(c7) v8=iachar(c8)
!将输入字符型变量转换为数簓值
x=name(v1)*16**7+name(v2)*16**6+name(v3)**16*5+name(v4)**16*4+name(v5)*16**3+name(v6)*1 6**2+name(v7)**16+name(v8)
c=c+a(i) end do
d=c/n do i=1,n if(a(i).ge.d)then write(*,*)"大于平均数的数为:" write(*,"(1x,50f10.4)")a(i) end if end do min=a(1) do i=1,n if (a(i).le.min) then min=a(i) end if end do write(*,*)"最小数为a" write(*,"(1x,f10.4)")min end
program main implicit none real a(1:25),b(1:25),c(1:50) integer i,s,k,m,n write(*,*)"输入数组a元素个数m=" read(*,*)m write(*,*)"输入数组a各元素:" read(*,*)(a(i),i=1,m) write(*,*)"输入数组b元素个数n=" read(*,*)n write(*,*)"输入数组b各元素:" read(*,*)(b(i),i=1,n) s=1 k=1 do i=1,m+n
do m=1,5 do n=1,5 if(m.eq.n.or.m+n==6)then a(m,n)="i" else a(m,n)="j" end if end do
end do do m=1,5 write(wenku.baidu.com,"(1x,10i5)")a(m,1:5) end do end
4.设有序(值从小到大)的两组数据,将这两组数据有序合并(合并 过程数据始终保持有序)。
2.编写一个子程序,将一个十六进制数转换为十进制数。并编写主程 序调用该子程序,输出结果。
program main implicit none integer x,n,v1,v2,v3,v4,v5,v6,v7,v8,name character c1,c2,c3,c4,c5,c6,c7,c8 write (*,*) ' 请输入十六进制数各位字(高位用零补齐):' read(*,*) c1,c2,c3,c4,c5,c6,c7,c8 if(c1=="0".and.c2/="0")then !将输入各位数字串联输出,最高位以前的舍去。 write(*,*)"您输入的十六进制数为",c2//c3//c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3/="0")then write(*,*)"您输入的十六进制数为",c3//c4//c5//c6//c7//c8 else if(c1=="0".and.c2=="0".and.c3=="0".and.c4/="0")then
b=400 do 20 while(b<=450)
if(mod(b,9)==0) write(*,*)b 20 b=b+1
end
2.回文数是指正读和反读都一样的数。如:232,编程求 100 到 999 之间的回文数。
program main implicit none integer a,b,c,n do 5 n=100,999 a=mod(n,10) b=n/100 5 n=n+1 If(a==b)then write(*,10)n 10 format(1x,"100-999之间的回文数:",i3) end if stop end
end if end do end do write(*,*)"删除后的数列为:" write(*,"(1x,50f10.4)") (a(i),i=1,n) end
3.形成一个 5 行 5 列矩阵,要求两条对角线元素均为 i,其余元素均 为 j。
program main implicit none integer a(5,5),m,n
if(a(s)<=b(k).and.s<=m)then c(i)=a(s) s=s+1 else if(a(s)>b(k).and.k<=n)then c(i)=b(k) k=k+1 else if(s>m)then c(i)=b(k) k=k+1 else if(k>n)then c(i)=a(s) s=s+1 end if end if end if end if end do write(*,*)"排列整合后的数列为:" write(*,"(1x,7f10.4)")(c(i),i=1,m+n) end
三.子程序篇
1.编写两个子程序,分别求两个整数的最大公约数和最小公倍数,并 编写主程序调用这两个子程序,输出结果。
subroutine d(m,n,y1) integer r,a,b,c,m,n,y1 a=m b=n r=mod(m,n) do 10,while(r.ne.0) m=n n=r
10 r=mod(m,n) c=a*b/n y1=c end !求两个数的最小公倍数