Fortran课的一次作业

**

FORTRAN课的一次作业

**
老师叫我们写一个计算n的结成的作业,并且能够抵抗各种奇奇怪怪的输入,我绞尽脑汁的想了各种各样的情况,但还是不能确保这个程序的容错率足够高,我快吐了,前后整了三个版本的程序,下面我把第三个版本的jiecheng_plus_plus贴出来,希望大家帮我看看问题,欢迎在评论区指出我有哪些输入不能正确处理呀。

下面展示我的代码 欢迎私信我

program jiecheng_plus_plus
    implicit none
    real,parameter::Error=1e-6
    real(16)::r=1.0
    integer::n=0,i,length=0,pin=0
    !pin用于标记输入是否有效
    !length用于计算输入数据的长度
    !A1-A5用于存储输入的字符变量的ASC值-48
    real(16)::pr16=1q0
    character(5)::initial_input
    integer::A(5)
    print*,"请输入自然数,包括0在内。"
    print*,"请不要输入负数和字符串,以及浮点数"
    print*,"如果你想结束这个计算程序,请输入-100"
    print*,"我们最开始输入的是字符串变量"
    print*,"代码中有很多被注释掉的部分,你可以解除注释以后观察输出,以便更好地理解我的逻辑"
    !print*,"输入里面我们可以允许你在开头或中间有一个空格,但是想“ 2 5”就会被视为非法输入"
    print*,"如果你在开头不小心输入了空格,请勿在中间接着输入空格,会报错的"
    !==============================================================================
    !以上是变量声明区,下面是正式开始的部分
    !首先转化字符型变量
    do
        read(*,'(A5)')initial_input
        !这里用格式化输入减少bug
        do i=1,5,1
           A(i)= ichar(initial_input(i:i))-48
           !print*,A(i)
        enddo
        pr16=1q0
        n=0
        i=0
        r=1.0
        length=0
        pin=0
    !每次循环开始之前,我们先要重置循环条件        
        !我们应该考虑更多的情况,第一就是前面有+的时候
        !+是-5,-是-3算下来,空格是-16,小数点是-2
        if(A(1)==-5) then
            !这是最前面有正号的情况
            !print*,"我们检测到你输入了正号"
            do i=2,5,1
              if( (0<=A(i).and.A(i)<=9).or.A(i)==-16 )        then
                  pin=1
              else
                  exit
              endif                             
            enddo
            i=0
            !print*,"只要立马接着有数字,pin就为1,我们的pin="
            !print*,pin  
            !print*,"接下来我们计算位数"
            length=0
            do i=2,5,1
                if (0<=A(i).and.A(i)<=9 ) then
                    length=length+1
                elseif (A(i)==-16) then 
                    !print*,"我们检测到了非数值,停止计数"
                    exit
                else
                    pin=0
                    exit
                endif                     
            enddo
            !print*,"length="
            !print*,length
            !print*,"接下来我们计算这个输入的真实值"
            do i=2,length+1,1
                n=n+A(i)*10**(length-i+1)                   
            enddo 
            !以上这一行代码是检测debug用的,看你的真实值跟转化值是否符合
            !print*,"n=",n              
        elseif(A(1)==-2) then
        !这是最前面有小数点的情况
            if((A(2)==0.or.A(2)==-16).and.(A(3)==0.or.A(3)==-16).and.(A(4)==0.or.A(4)==-16).and.(A(5)==0.or.A(5)==-16)) then
                !print*,"我们默认你输入了0"
                !.000的情况比较特殊,这是唯一可以允许输入的浮点型
                n=0
                pin=1
            else 
                pin=0
                !print*,"你输入了负数小数或者浮点数,请重新输入"
            endif
        
            if(A(1)==-3.and.A(2)==1.and.A(3)==0.and.A(4)==0) then
                print*,"你输入了-100,现在我们结束程序"
                pin=2
                exit
            !上面的这个我们在最后的do有了以后会取消注释
            endif   
!===========================================================================================    
        elseif(A(1)==-16) then
            !第一个输入的数还有可能是空格呢,我们得考虑这种情况
            !这种情况我只会考虑整数
            if(A(2)==-16) then
            !考虑第二个数======
                if(A(3)==-16) then
                !考虑第三个数=====
                    if(A(4)==-16) then
                    !考虑第四个数====
                        if(A(5)==-16) then
                            !考虑第五个数字===
                            print*,"你什么也没有输入!"
                            pin=0                                
                        else
                            if (0<=A(5).and.A(5)<=9) then
                                n=A(5)
                                pin=1
                            else
                                n=0
                                pin=0
                            endif                            
                        endif!第五个数字考虑完了===                       
                    elseif (0<=A(4).and.A(4)<=9)  then                
                        if (0<=A(5).and.A(5)<=9) then
                            n=A(4)*10+A(5)
                            pin=1
                        elseif (A(5)==-16) then
                            n=A(4)
                            pin=1
                        else                           
                            pin=0
                            n=0
                            !print*,"输入了负数浮点数或者字符串,请重新输入:"
                        endif
                    endif!第四个数字考虑完了====                
                elseif (0<=A(3).and.A(3)<=9)   then
                    if(0<=A(4).and.A(4)<=9.and.0<=A(5).and.A(5)<=9) then
                        n=A(3)*100+A(4)*10+A(5)
                        pin=1
                    elseif((0<=A(4).and.A(4)<=9).and.A(5)==-16) then
                        n=A(3)*10+A(4)
                        pin=1
                    elseif(A(4)==-16.and.A(5)==-16) then
                        n=A(3)
                        pin=1
                    else
                        pin=0
                        n=0
                        !print*,"输入了负数浮点数或者字符串,请重新输入:"
                    endif!第三个数字考虑完了=====
                 endif   
             elseif (0<=A(2).and.A(2)<=9)   then
                if(0<=A(4).and.A(4)<=9 .and.0<=A(5).and.A(5)<=9 .and.0<=A(3).and.A(3)<=9) then
                    n=A(2)*1000+A(3)*100+A(4)*10+A(5)
                    pin=1
                elseif((0<=A(4).and.A(4)<=9) .and.0<=A(3).and.A(3)<=9.and.A(5)==-16) then
                    n=A(2)*100+A(3)*10+A(4)
                    pin=1
                elseif(0<=A(3).and.A(3)<=9.and.A(4)==-16.and.A(5)==-16) then
                    n=A(2)*10+A(3)
                    pin=1
                elseif(A(4)==-16.and.A(5)==-16.and.A(3)==-16) then
                    n=A(2)
                    pin=1
                else
                    n=0
                    pin=0
                    !print*,"输入了负数浮点数或者字符串,请重新输入"
                endif!第二个数字考虑完了======
                !第一个数字本来就是空格,所以我们不用在考虑
             endif   
!==========================================================================           
        else   
!这是前面没有小数点和+情况,
            if( (0<=A(1).and.A(1)<=9).or.A(1)==-16 ) then
                if( (0<=A(2).and.A(2)<=9).or.A(2)==-16 ) then
                    if( (0<=A(3).and.A(3)<=9).or.A(3)==-16 ) then
                        if( (0<=A(4).and.A(4)<=9).or.A(4)==-16 ) then
                            if( (0<=A(5).and.A(5)<=9).or.A(5)==-16 ) then
                                pin=1
                            endif
                        endif
                    endif
                endif
            endif
            !接下来我们统计长度
            n=0
            if(pin==1) then
                do i=1,5,1
                    if (0<=A(i).and.A(i)<=9 ) then
                        length=length+1
                    else 
                        !print*,"检测结束,我们只检测第一个整数"
                        exit
                    endif                     
                enddo            
                do i=1,length,1
                   n=n+A(i)*10**(length-i) 
                enddo
                !print*,"n=",n
            elseif(A(1)==-3.and.A(2)==1.and.A(3)==0.and.A(4)==0) then
                print*,"你输入了-100,现在我们结束程序"
                    pin=2
                exit
            else 
                !print*,"你输入了负数浮点数或者字符串,请重新输入:"
            endif
        endif
    !=======================================================================
    !以上程序用于把输入奇奇怪怪的形式转化为具体的能算的数字
    !如果出现了非法输入,那么我直接pin=0
    !在下面开始计算之前,我们先来做一组测验            
        if(pin==1.and.n>=0) then
            pr16=1q0;
            do i=n,1,-1
                 pr16=pr16*i;
            enddo
            write(*,*)n,"!=",pr16
        elseif(pin==1.and.n==0) then
            pr16=1
            write(*,*)n,"!=",pr16
        elseif(pin==2) then
            exit
        else
            print*,"你输入了负数浮点数或者字符串,请重新输入:"
        endif                     
    enddo    
 
    pause
    end program jiecheng_plus_plus
    
            
            

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值