Fortran Coder

标题: 关于翻译密码程序的输入输出问题 [打印本页]

作者: PTVenn    时间: 2016-9-6 10:20
标题: 关于翻译密码程序的输入输出问题
程序先按照约定的规律将一个字符转换为对应的ASCⅡ码,ASCⅡ码加5后再转换得到原来的字符。当ASCⅡ码加5超过Z,要使之转换为A。对字母之外的字符维持原样。程序如下:
[Fortran] 纯文本查看 复制代码
! 翻译密码。
program char_4
implicit none
integer::i,j,k
character*80::line1,line2
character*1::l1,l2
read *,line1
do k=1,80
    l1=line1(k:k)
    if ((lge(l1,'A').and.lle(l1,'Z')).or.(lge(l1,'a').and.lle(l1,'z'))) then
        i=iachar(l1)
        j=i+5
    else  
        if(j>iachar('z').or.(j>iachar('Z').and.j<iachar('Z')+6)) then
            j=j-26
            l2=achar(j)
            line2(k:k)=l2
        else
            line2(k:k)=l1
        end if
    end if
end do
print *,line2
end program char_4
调试程序没错,但是例如输入 "HE IS IN BEIJING" 程序没反应,求解~


作者: fcode    时间: 2016-9-6 11:56
1.如果你用表控格式读取 Line1,则只会读取 HE,后面的 IS IN BEIJING 读取不到。因为表控格式认为空格是间隔符。
2.如果你只读了 HE,则只满足 if ((lge(l1,'A').and.lle(l1,'Z')).or.(lge(l1,'a').and.lle(l1,'z'))) , 后面的 ELSE 一律不执行。所以 Line2 没有值。
也许以下代码是你想要的
[Fortran] 纯文本查看 复制代码
program char_4
  implicit none
  integer::j,k
  character(len=80)::line1,line2=""
  character::t
  read(*,"(a80)") line1 !//此处用格式读入,不用表控,否则只读 HE
  do k=1,len_trim(line1)
    t = line1(k:k)
    if ((lge(t,'A').and.lle(t,'Z')).or.(lge(t,'a').and.lle(t,'z'))) then
      j = iachar(t) + 5
      if( j>iachar('z').or.(j>iachar('Z').and.j<iachar('Z')+6) ) then
        j = j - 26
      end if
      t = achar(j)
    end if
    line2(k:k) = t
  end do
  print *,line2
end program char_4






欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2