一个程序中循环是非常重要的,他会控制变量进行多次相同运算,在数组操作中有着不可替代的地位,今天就走进Fortran的循环,感受一下循环的乐趣。
哦,对了,Fortran程序在stop之前,可以加一个pause,这样.exe文件运行时就不会跳窗一而过了,这就相当于c++的system(pause)。
1、Do循环:
结构是这样的:
do counter = 1, UpperBound, step
!counter是计数器,
!UpperBound是上界,只要counter<=UpperBound,循环就继续进行
!step就是迭代步数,每执行一次,count=count+step
......
end do
上面用来做计数器的counter变量,脱离了循环语句之后就不能再用任何其他命令去改变器数值,不然编译就会出错。
随遍写个Do循环试一试:
program main
integer number
number=1
do counter = 1, 100, 1
number=number+counter
write(*,*)number
end do
pause
stop
end
结果:
太长了,就展示一小部分
do循环结束之后,要去思考一个很有意思的问题:如果退出循环的条件是对逻辑成立的判断,那我们应该怎么做呢?
答案就是:DO while循环:
do while(!逻辑判断)
...
end do
其实,在后面的新兴语言中,while循环时非常常用的一个,但我个人更喜欢c++的while循环,更简洁也更明了:
while(逻辑判断){}
简单的写写书上的例题:输出:2+4+6+8+10的结果:
program main
implicit none
integer number
integer sum
number=2
sum=0
do while(number<=10)
sum=sum+number
number=number+2
end do
write(*,*)"2+4+6+8+10=",sum
pause
stop
end
!注意,这个pause,如果你时直接在vscode等ide的集成终端上操作时,可以在代码最后不用pause,但如果你要使用.exe文件运行的时候,代码中加个pause时一个不错的选择,不要害怕出现的warning,那个在这里压根就没啥大用。
再玩一个,猜年龄(书上时猜蔡小姐的体重,但我觉得这样太冒犯蔡小姐了,还是猜年龄吧)
program main
implicit none
integer error
parameter(error=1)
integer:: age=26
integer input_age
do while(abs(age-input_age)>=error)
write(*,*)"input Mis Cai'age"
read(*,*)input_age
end do
write(*,*)"great!,you are right",input_age
! pause
stop
end program main
cycle命令,一旦出现器所对应的条件,那就跳过,直接进行下一次循环:这里举一个等差数列相加的例子1+3+5+7+9+...+41,但其中如果下一个数时3x的话,就跳过:
program main
implicit none
integer ::sum=0
integer counter
!注意,前面的那个2+4+6+8的代码,没有声明counter是什么类型,但也可以运行的原因是只是用的
!加法,他不会报错,但是这里我使用了mod函数求余,所以必须要什么counter的类型,
!否则就会因为没有什么counter的类型报错:
!Error: Symbol 'counter' at (1) has no IMPLICIT type
do counter = 1, 41, 2
if(mod(counter,3)==0)cycle
sum=sum+counter
end do
write(*,*)"sum:",sum
stop
end program main
exit:它满足条件的时候就跳出循环了,do 循环和exit的配合就相当于do while循环,改写一下猜蔡小姐年龄的代码:
program main
implicit none
integer error
parameter(error=1)
integer:: age=26
integer input_age
do
write(*,*)"input Mis Cai'age"
read(*,*)input_age
if(abs(age-input_age)<error)exit
end do
write(*,*)"great!,you are right",input_age
! pause
stop
end program main
我还是第一次见到给循环命名的,感觉没这个必要嘛,实在是记不住循环是干啥的,直接写个注释他不香吗?,但既然Fortran有这个,那就稍微写写吧,感觉没啥大用,反正后面编程我肯定不会给循环命名,有点太傻乎乎的感觉了
就还是给上面的猜蔡小姐年龄的循环,直接改一下就行:
a_cycle: do
write(*,*)"input Mis Cai'age"
read(*,*)input_age
if(abs(age-input_age)<error)exit
end do a_cycle
简单练练手吧:
1:等比数列求和:
program main
implicit none
integer ::a1=2
integer:: sum=0
do while(a1<=100)
sum=sum+a1
a1=a1*2
end do
write(*,*)"sum=",sum
stop
end program main
2:输出斐波那契数列:
program fibonacci
implicit none
integer fn,fn_1
integer fn_2,counter
fn=0
fn_1=1
fn_2=0
write(*,*)fn_2
write(*,*)fn_1
do counter=1,20,1
fn=fn_1+fn_2
fn_2=fn_1
fn_1=fn
write(*,*)fn
end do
stop
end
3、输入判断运算
program main
implicit none
real a,b
character ::Key='Y'
character symbol
integer:: answer=0
real ::ans=0
do while((Key=='y').or.(key=='Y'))
write(*,*)"input a:"
read(*,*)a
write(*,*)"input b:"
read(*,*)b
write(*,*)"input Symbol :"
read(*,*)symbol
select case(symbol)
case('+')
ans=a+b
write(*,*)ans
case('-')
ans=a-b
write(*,*)ans
case('*')
ans=a*b
write(*,*)ans
case('/')
ans=a/b
write(*,*)ans
case default
write(*,*)"error symbol"
end select
write(*,*)"keep going?"
read(*,*)Key
end do
stop
end program main
可以把我的代码复制后自己运行一下。
4、加密、解密:
ascii码值加3:
program main
implicit none
character(len=30):: string
integer i, StringLength
integer key
parameter(key=3)
write(*,*)"input string"
read(*,*)string
StringLength=len-trim(string)
do i=1,StringLength
string(i:i)=char(ichar(string(i:i))+key)
end do
write(*,*)string
stop
end
书上写的不太对劲,总是报错,说是len没有隐式声明,百思不得其解...
行了,再把书上的题做一做:
1、输出五次fortran:这个就算了,太简单了,真没啥意思
2、循环计算等差数列1+3+5+7+...+99:参考前面的2+4+6+8+...+
3、对蔡小姐的体重猜五次,少于五次猜中,跳出循环,猜测次数多于五次,也要跳出循环:
这个很简单,用控制流加上exit修改修改上面的程序就ok:
program main
implicit none
integer error
parameter(error=1)
integer:: age=26
integer input_age,counter
integer UpperBound
parameter(UpperBound=5)
counter=1
do while(counter<=UpperBound)
write(*,*)"input Mis Cai'age"
read(*,*)input_age
if(abs(age-input_age)<error)exit
counter=counter+1
end do
if((counter>UpperBound).and.(abs(age-input_age)>=error))then
write(*,*)"you wrong"
else
write(*,*)"great!,you are right",input_age
end if
! pause
stop
end program main
结果:左边是超过五次就停止程序,右边是猜对之后。
4、计算1/1!+1/2!+...+1/10!:
function pro(input) result(output)
integer product
product=1
do counter=1,input
product=product*counter
end do
end function pro
program main
! 其实这里使用函数会更简单一些,所以我设置了函数pro
real ::sum=0
do i=1,10
sum=sum+1/pro(i)
end do
write(*,*)sum
stop
end
结果(我没有理会warning):
5、除去字符串里的空格:
program blank
implicit none
character(len=30)::string
write(*,*)"input a string"
read(*,*)string
integer stringlen
stringlen=len-trim(string)
do i=1,stringlen
integer j=i+1
if(string(i)==" ")then
string(i)=string(j)
end if
end do
stop
end program blank
!还是会出现len没有定义的问题查了很多,也没有查到为什么
!emm...就放着吧,反正我以后用Fortran大致要做的是地震道数据的处理,
!对字符串的操作可能并不是很多,就放着吧
hhh,到这里Fortran的所有基础语法就已经差不多了,已经可以向着数组迈进了,数组我会分两天进行学习,第一天是固定数组,第二天是可变数组,这两个都是非常重要的数据结构,可以说,没有数组的支撑,一个程序是很难完成设计者所要完成的功能的。
ok,控制流就到这里了,byebye!