Fortran学习:chapter6

第六章

课本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

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值