一个程序中循环是非常重要的,他会控制变量进行多次相同运算,在数组操作中有着不可替代的地位,今天就走进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

结果:

fortran system_Fortran

太长了,就展示一小部分

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

fortran system_while循环_02

!注意,这个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

fortran system_学习_03

 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

fortran system_while循环_04

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 system_Fortran_05

我还是第一次见到给循环命名的,感觉没这个必要嘛,实在是记不住循环是干啥的,直接写个注释他不香吗?,但既然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

fortran system_while循环_06

 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

fortran system_学习_07

 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

结果:左边是超过五次就停止程序,右边是猜对之后。

fortran system_学习_08

fortran system_学习_09

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): 

fortran system_ci_10

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!