【问题标题】:Compare two lines in Fortran比较 Fortran 中的两行
【发布时间】:2018-12-04 11:02:48
【问题描述】:

我有一个包含 2 列的数据文件。比方说:
第 1 列(8,8,8,6,9),读作a
第 2 列 (3,4,5,6,7),读作 b
我想写一个代码检查a(i)=a(i+1)然后b=0

所以结果应该是第一列a:(8,8,8,6,7),第二列b应该是(0,0,0,6,7)

我试过了,但失败了:

program read2cols
  implicit none

  integer ::ios,i,j
  real a,b
  open(file='8081.txt', unit=22, status='old', action='read')

do 
   read(22,*,iostat=ios) a(i),b(j)
   if(a(i)<a(i))b=0 

       if(ios/=0) exit 
     print*,a,b 
 enddo
  close(22)


end program read2cols

【问题讨论】:

  • 什么失败了?它编译吗?它运行吗?它会产生错误消息吗?它是否以错误的结果完成?
  • 另外:这是您运行的实际代码吗?您的部分代码毫无意义,可能导致内存不足和失控循环。
  • 我阅读你的问题的方式,b(i) = 0 如果a(i) == a(i+1)。但在这种情况下,生成的b 应该是(0, 0, 5, 6, 7),因为a 的第三个值与第四个不同。
  • 我越是看代码,越是困惑。 ij 从未设置,您正在测试一个值是否小于自身,ab 被声明为变量,但大多数时候它们被作为数组寻址。

标签: fortran do-loops read-data


【解决方案1】:

你的程序可以是这样的:

program read2cols
  implicit none

  integer :: ios, i, j
  real :: a(5), b(5)
  open(file='8081.txt', unit=22, status='old', action='read')

  read(22, *, iostat = ios) a(1), b(1)
  do i = 2,5
    read(22, *, iostat = ios) a(i), b(i)
    if (ios /= 0) exit
    if (a(i-1) == a(i)) b(i-1) = 0
  end do

  print *, a, b
  close(22)

end program read2cols

输出:

   8.00000000       8.00000000       8.00000000       6.00000000       9.00000000       
   0.00000000       0.00000000       5.00000000       6.00000000       7.00000000

注意事项:

您将ab 声明为标量,然后使用i 对它们进行索引,通过将a(5), b(5) 声明为数组来解决此问题。 do .. 中缺少循环索引,它应为 do i = ..。最后,条件应该是if (a(i-1) == a(i)) b(i-1) = 0,因为只有读取后才能比较一个值。

【讨论】:

  • 在问题的代码中,ab 是(外部)函数,而不是标量。
  • OP 说:第 1 列 (8,8,8,6,9),将其读作 a。第 2 列 (3,4,5,6,7),将其读取为 b.,因此绝对不是外部函数,而是包含数字列的数组。
  • real a,b 行声明 ab 是返回类型为实数的函数。当然,我们知道这是一个错误。
  • @francescalus 可能应该在尝试引用值 a(i) 和 b(i) 之前对 ios 进行测试,你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多