**
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