假设您有一个格式为的文件:
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,相等的数字 如果(条件不是真的话)那么 用其他数字重启。
答案 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(然后必须声明数组列表可分配并以正确的大小分配)。 如果范围太大,那么简单的数组就不再准确了,正确的算法变得更加复杂:它必须避免存储未使用的值。