回 帖 发 新 帖 刷新版面

主题:发个有趣的小程序

    program main
    character  aaaa*66 
    write(aaaa,723) 23.4,41.6,45
723 format(1pe12.4,',',G23.4,',',i9 
    call writen(aaaa) 
    write(*,*) trim(aaaa) 
    end 

    subroutine writen(aaaa) 
    character aaaa*(*) 
    ii=len(aaaa) 
    do 30 k=1,ii 
    do 10 i=1,ii-1 
    if(aaaa(i:i).ne.char(32)) goto 10 
    do 20 k=i+1,ii 
    aaaa(k-1:k-1)=aaaa(k:k) 
10  continue
30  continue 
    end 

这个程序是我编写一个大程序中的一个小程序段(变了一下便于大家验证),
很有意思,与大家共享。

在编写一个大程序中,我要将计算的结果用acad显示,接口是script格式,
这种格式要求数字之间不能有空格,命令前方也不得有空格,我自己写了
类似的这段小程序,将所有空格去掉。
我80年代初学的FORTRAN 77,赶不上现在的fortran,请见谅。

若大家觉得这个程序没有用,请版主删了本贴。


[em8][em8][em8]

回复列表 (共6个回复)

沙发

1. 先把程序贴完整了,至少要没有编译错误啦。
2. 你确定你的程序很有趣?趣在何处不妨用文字简单介绍一下。

板凳

“出土”代码的上市确实很有趣。

3 楼

你的程序有很多的错误!你确定你贴出来的代码能够运行?即便它是“Fortran77”。

这是我写的:把你的代码改了,运行没有问题。

program main
    character  aaaa*66
    write(aaaa,"(f12.4,',',f23.4,',',i9 )") 23.4,41.6,45
    call writen(aaaa) 
    write(*,*) trim(aaaa) 
    read(*,*)
end 

subroutine writen(aaaa) 
  character aaaa*(*) 
  ii=len(aaaa) 
  do k=1,ii 
    do i=1,ii-1 
      if(aaaa(i:i)==char(32)) then
        do j=i+1,ii 
          aaaa(j-1:j-1)=aaaa(j:j) 
        end do 
      end if     
    end do 
  end do 
end 

由于懒惰,很多的初始设置没做,好的fortran程序代码不是这样。

4 楼

我用Fortran 6.6c编译的,没有问题。
其实,就是那个格式(tab键的设置)
不同于大家现在的,
所以有点古董味道,大家不要在意,
关键你自己要有办法,程序是手段。
大家觉得这个程序不好,而我又严格
按照fortran77编程,所以以后不再发
新程序了。

我编程也20多年了,快50了,有点遗憾,可能我
太老了,不适合继续编程与年轻人切磋了。
老而知羞。

5 楼

前辈的代码是有问题,比如第四行
              723 format(1pe12.4,',',G23.4,',',i9 
就少了个右括号。还有两行: 
     do 20 k=i+1,ii 
         aaaa(k-1:k-1)=aaaa(k:k) 
也有问题,其一是掉了 20 continue那行,其二,前面已经用了变量k,这里不能再用,编译器提示错误。我用 cvf6.6a 试的。

其实3楼的程序也有点小问题,只要把第二行的数字 66 改成 46 运行就看出来了。以下是俺的f77 程序。
----------------------------------------------
      program main
      character  aaaa*46 
      write(aaaa,723) 23.4,41.6,45
723   format(1pe12.4,',',G23.4,',',i9 )
      write (*,*) aaaa 
      call writen(aaaa) 
      write(*,*) aaaa 
      end 

      subroutine writen(aaaa) 
      character aaaa*(*)
      jjj=0
      ii=len(aaaa)
      i=0
      k=0
      if(aaaa(ii:ii).eq.char(32)) then
         jjj=1
         aaaa(ii:ii)='7'
      endif
      
10    i=i+1
      if(aaaa(i:i).eq.char(32)) then 
          k=k+1
          do 20 j=i+1,ii 
              aaaa(j-1:j-1)=aaaa(j:j) 
20        continue
          i=i-1
      elseif(i .eq. ii) then
          do 30 j=0,k-1
              aaaa(ii-j:ii-j)=' '
30        continue
          if (jjj .eq. 1) aaaa(ii-k:ii-k)=' '
          return
      endif
      goto 10
      end 
-----------------------------------------------------
最外层用了goto 构成的循环而不是do循环,目的就是为了能改变计数变量。

前辈要是喜欢切磋也不必理会年轻人的冲劲(年轻人没这劲了反倒不一定是好事),毕竟计算机发展太快了,观念看法已经完全不一样,过去那种计算机上总结出来的经验有可能在现在看来就是一很小的技巧。其实谁也不敢保证自己的程序肯定100%好。欢迎继续发帖回帖,fortran主要是用来解决实际问题的,只要解决的正确解决好就行,没必要一定怎么怎么样。

6 楼

楼上说的不错,“其实3楼的程序也有点小问题,只要把第二行的数字 66 改成 46 运行就看出来了”,是subroutine writen里面的最核心循环条件判断语句的问题。这个小东西是很有趣。^^

我来回复

您尚未登录,请登录后再回复。点此登录或注册