计算文件中相等行数

时间:2014-03-30 18:22:42

标签: if-statement fortran fortran90 gfortran

假设您有一个格式为的文件:

1
1
1
2
2
3
3
3
3
...

我想计算有多少相等的数字并将它们迭代地保存在字符串中。例如:

m = 3 (times 1),
m = 2 (times 2),
m = 4 (times 3).

我把我的代码放在这里:

    program sele
        implicit none
        integer::j,k,s,n,l,r,m
        real*8,allocatable::ID(:)
        real*8:: j_r8,i_r8

        open(10,file='data.dat')
        n=0
            DO
              READ(10,*,END=100)
              n=n+1
            END DO

     100     continue
            rewind(10)

        allocate(ID(n))
    s=0
        do s=1, n
            read(10,*) ID(s)
        end do

    do r=1,n-1
    if (ID(r)-ID(r+1) .EQ. 0) then
    m = m + 1
    print*, m
     end if
    end do

   end program

最后do是我想扩展的条件,例如:

 if (condition is true) then
  save an index of the number of equal digits
  use this to do some operations:

做i = 1,相等的数字      如果(条件不是真的话)那么       用其他数字重启。

1 个答案:

答案 0 :(得分:0)

如果要读取的值是给定有限范围内的整数值(例如1到100),则最简单的方法如下:

program sele
   implicit none
   integer, parameter :: vmin=1
   integer, parameter :: vmax=100
   integer            :: list(vmin:vmax) 
   integer            :: value,i       
   open(10,file='data.dat')
   list=0
   do
      read(10,*,end=10) value
      if(value < vmin .OR. value > vmax) then
         write(*,*) 'invalid value ',value
         stop
      endif
      list(value)=list(value)+1
   enddo
10 continue
   do i=vmin,vmax
     if(list(i) > 0) then
        write(*,*) list(i),' times ',i
     endif
   enddo
end program

这给出了你的例子:

3 times 1
2 times 2
4 times 3

可以很容易地改进程序来管理变量vmin和vmax(然后必须声明数组列表可分配并以正确的大小分配)。 如果范围太大,那么简单的数组就不再准确了,正确的算法变得更加复杂:它必须避免存储未使用的值。