第六章
课本code
do循环
implicit none
integer counter
integer,parameter::lines=10 !parameter常量符号,不可更改值
!counter<=lines之前会一直重复循环
!每执行一次循环counter+1
do counter=1,lines,1 !!!!逗号,起始,重点,间隔
write(*,*) "Happy Birthday",counter
end do
implicit none
integer::i,sum
sum=0
do i=2,10,2
sum=i+sum
end do
write(*,"('2+4+6+8+10=',I8)")sum
pause
!!或者:
implicit none
integer,parameter::limit=10
integer counter
integer::ans=0
do counter=2,limit,2
ans=ans+counter
end do
write(*,*)ans
pause
用来设置计数器初值、上限及增值的数值可以使用变量来指定,这些变量值只会在进入循环之前就被读取,在循环中改变变量不会影响原来的循环次数。但是作为计数器的变量在循环中不能再使用命令去改变它的值,否则编译时会出现错误。
do while循环
implicit none
integer,parameter::limit=10
integer counter
integer::ans=0
counter=2
do while(counter<=limit)
ans=ans+counter
counter=counter+2 !计数累加
end do
write(*,*)ans
!!猜数字
implicit none
real,parameter::weight=45.0 !答案
real,parameter::e=0.001 !误差
real::guess=0.0 !猜测值
do while(abs(guess-weight)>=e)
write(*,*)"Weight:"
read(*,*)guess
end do
write(*,*)"You'are right."
cycle
cycle在循环中出现时,会跳回循环的开头进行下一次循环。
!共9层,电梯只是不在4楼停
implicit none
integer::dest=9
integer floor
do floor=1,dest,1 !也可以写floor=1,dest 因为默认1
if(floor==4) cycle
write(*,*)floor
end do
pause
!!1 2 3 5 6 7 8 9
exit
exit出现时直接跳出一个正在运行的循环。
implicit none
real,parameter::weight=45.0
real,parameter::e=0.0001
real guess
do while(.true.)
write(*,*)"weight:"
read(*,*)guess
if(abs(weight-guess)<e) exit
end do
write(*,*)"You're right!"
pause
署名的循环
给循环取名字,方便编写循环时明确的知道end do描述的位置是否正确。署名的循环也可以配合cycl、exit使用。
implicit none
integer::i,j
outter:do i=1,3 !外层循环取名为outter,一个冒号:
inner:do j=1,2 !内层循环取名为inner
write(*,"('(',I2,',',I2,')')")i,j
end do inner !结束inner这个循环
end do outter !结束outter这个循环
pause
!!结合cycle、exit使用
implicit none
integer::i,j
loop1:do i=1,3
loop2:do j=1,3
if(i==3) exit loop1 !跳离loop1循环
if(j==2) cycle loop2 !重启loop2循环
write(*,"('(',I2,',',I2,')')")i,j
end do loop2
end do loop1
pause
!!(1,1) (1,3) (2,1) (2,3)
!1+2+3+...+99+100=
!5050
implicit none
integer::i=1
integer::sum=0
do while(i<=100)
sum=sum+i
i=i+1
end do
write(*,*)sum
pause
implicit none
integer::count
integer::ans=0
do count=1,100
ans=ans+count
end do
write(*,*)ans
pause
!!费式数列
!f0=0,f1=1
!f(n)=f(n-1)+f(n-2)
implicit none
integer::f0=0
integer::f1=1
integer::ans=0
integer count
write(*,*)f0,f1
do count=1,8
ans=f0+f1
f0=f1
f1=ans
write(*,*)f1
end do
pause
!! 0 1 1 2 3 5 8 13 21 34
len_trim作用:计算字符串的实际字符数。
!!加密、解密程序
implicit none
integer i
integer strlen
integer,parameter::key=2
character(len=20)::string
integer::project
integer::flag=0
do while(flag==0)
write(*,*)"请问您需要加密or解密?,加密输入1,解密输入2"
read(*,*)project
if(project/=1 .and. project/=2) then
write(*,*)"请输入正确的数字!"
cycle
else if(flag==1) then
exit
else if(project==1) then
!加密
write(*,*)"请输入待加密的字符串:"
read(*,*)string
! len_trim函数的作用是,舍去字符串尾部的空格,并返回剩余部分
strlen=len_trim(string) !取得字符串实际长度
do i=1,strlen
string(i:i)=char(ichar(string(i:i))+key)
end do
write(*,"('加密结果:',A20)")string
flag=1
else
!解密
write(*,*)"请输入待解密的字符串:"
read(*,*)string
! len_trim函数的作用是,舍去字符串尾部的空格,并返回剩余部分
strlen=len_trim(string) !取得字符串实际长度
do i=1,strlen
string(i:i)=char(ichar(string(i:i))-key)
end do
write(*,"('解密结果:',A20)")string
flag=1
end if
end do
pause
运行结果:
简易计算器,可多次运算
implicit none
integer::flag=1
real a,b
real::ans=0
character operation
do while(flag==1)
write(*,*)"请输入待计算的数字1:"
read(*,*)a
write(*,*)"请输入运算符号(若为除号请输入'/':"
read(*,*)operation
write(*,*)"请输入待计算的数字2:"
read(*,*)b
select case(operation)
case('+')
ans=a+b
case('-')
ans=a-b
case('*')
ans=a*b
case('/')
if(b==0) then
write(*,*)"除数不能是0"
cycle
else
ans=a/b
end if
case default
write(*,"('未知运算符',A1)")operation
cycle
end select
write(*,"(f8.4,A1,f8.4,'=',f8.4)")a,operation,b,ans
write(*,*)"是否需要进行下一次计算?是输入1,否输入0"
read(*,*)flag
end do
write(*,*)"结束!"
pause
运行结果:
习题
implicit none
integer,parameter::count=5
integer i,j,temp,k
integer::ans=0
real::sum=0.0
real::guess
integer::num=5
integer,parameter::length=79
character(len=length)::input,output
!1
do i=1,count
write(*,*)"Frotran"
end do
!2
do i=1,99,2
ans=ans+i
end do
write(*,"('1+3+5+7+9+...+99=',I8)")ans
!3
do i=1,count
num=num-1
write(*,*)"请猜一猜这位小姐的体重(kg):"
read(*,*)guess
if(abs(guess-45.0)<0.0001) then
write(*,*)"恭喜您,猜对了!"
exit
else
write(*,"('猜测错误,您还有',I2,'次机会')")num
cycle
end if
end do
if(num==0) then
write(*,*)"很遗憾,5次机会已经用完,您未能猜出这位小姐的体重。"
end if
!4
outter:do i=1,10
temp=1
inner:do j=1,i
temp=temp*j
end do inner
sum=sum+1.0/temp
end do outter
write(*,"('1/1!+1/2!+1/3!+1/4!+...+1/10!=',f18.10)")sum
!5
write(*,*)"请输入一个字符串:"
read(*,"(A79)")input
k=1
do i=1,len_trim(input)
if(input(i:i)/=' ') then
output(k:k)=input(i:i)
k=k+1
end if
end do
write(*,"(A79)")output
pause
运行结果: