如何在Fortran中对输出行进行排序以实现指定输出顺序
如何在Fortran中对输出行进行排序以实现指定输出顺序
我完全理解你的问题:当前代码会把同一输入行的3个RD递增版本连续输出,导致输出是按输入行分组的;但你想要的是每一轮都输出所有输入行各一次——也就是第一轮输出所有行的RD+0.1,第二轮RD+0.2,第三轮RD+0.3,最终形成你给出的目标输出顺序。
问题出在你的循环结构上:外层循环读一行数据,然后内层循环连续输出这一行的3个递增版本,自然会出现分组的情况。要解决这个问题,核心思路是先把所有输入数据存储起来,再按轮次遍历输出,下面给你几个可行的方案:
方案1:使用固定数组存储(适合输入行数固定的场景)
如果确定输入只有3行,你可以直接把每行数据读到固定大小的数组里,然后按轮次循环输出:
PROGRAM SORTED_OUTPUT IMPLICIT NONE ! 定义存储3行数据的数组 INTEGER, DIMENSION(3) :: NIA, NIB, NIC REAL, DIMENSION(3) :: RA, RB, RC, RD_initial INTEGER :: I, J ! 打开并读取输入文件 OPEN(3, FILE='input_2.data') DO I=1,3 READ(3,*) NIA(I), NIB(I), NIC(I), RA(I), RB(I), RC(I), RD_initial(I) END DO CLOSE(3) ! 按轮次输出:每一轮遍历所有3行数据,RD递增0.1*J DO J=1,3 DO I=1,3 WRITE(*,100) NIA(I), NIB(I), NIC(I), RA(I), RB(I), RC(I), RD_initial(I) + 0.1*J END DO END DO ! 保持你原来的格式符 100 FORMAT (I3,1X,I1,1X,I2,1X,F10.6,1X,F10.6,1X,F10.6,1X,F10.6) END PROGRAM SORTED_OUTPUT
这个方案先把所有数据读入数组,外层循环控制RD的递增量(J从1到3对应+0.1、+0.2、+0.3),内层循环遍历所有存储的行,这样每一轮都会输出所有输入行的对应版本,正好符合你想要的顺序。
方案2:使用动态数组(适合输入行数不固定的通用场景)
如果你的输入行数可能变化,建议用动态数组来存储数据,这样代码更灵活:
PROGRAM SORTED_OUTPUT IMPLICIT NONE INTEGER, ALLOCATABLE :: NIA(:), NIB(:), NIC(:) REAL, ALLOCATABLE :: RA(:), RB(:), RC(:), RD_initial(:) INTEGER :: I, J, num_lines, read_status ! 打开输入文件并统计行数 OPEN(3, FILE='input_2.data', STATUS='OLD') num_lines = 0 DO READ(3, *, IOSTAT=read_status) IF (read_status /= 0) EXIT num_lines = num_lines + 1 END DO REWIND(3) ! 回到文件开头准备读取数据 ! 动态分配数组空间 ALLOCATE(NIA(num_lines), NIB(num_lines), NIC(num_lines), & RA(num_lines), RB(num_lines), RC(num_lines), RD_initial(num_lines)) ! 读取所有数据到数组 DO I=1,num_lines READ(3,*) NIA(I), NIB(I), NIC(I), RA(I), RB(I), RC(I), RD_initial(I) END DO CLOSE(3) ! 按轮次输出 DO J=1,3 DO I=1,num_lines WRITE(*,100) NIA(I), NIB(I), NIC(I), RA(I), RB(I), RC(I), RD_initial(I) + 0.1*J END DO END DO 100 FORMAT (I3,1X,I1,1X,I2,1X,F10.6,1X,F10.6,1X,F10.6,1X,F10.6) ! 释放动态数组 DEALLOCATE(NIA, NIB, NIC, RA, RB, RC, RD_initial) END PROGRAM SORTED_OUTPUT
这个方案会先统计输入文件的行数,再分配对应大小的数组,不管输入是3行还是更多行,都能正确处理并按轮次输出。
方案3:直接读取所有行到变量(适合固定3行的极简场景)
如果确定只有3行输入,也可以直接把每行数据读到单独的变量里,然后按轮次输出,代码更直观:
PROGRAM SORTED_OUTPUT IMPLICIT NONE INTEGER :: NIA1, NIB1, NIC1, NIA2, NIB2, NIC2, NIA3, NIB3, NIC3 REAL :: RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2, RA3, RB3, RC3, RD3 INTEGER :: J OPEN(3, FILE='input_2.data') ! 直接读取3行数据到各自的变量 READ(3,*) NIA1,NIB1,NIC1,RA1,RB1,RC1,RD1 READ(3,*) NIA2,NIB2,NIC2,RA2,RB2,RC2,RD2 READ(3,*) NIA3,NIB3,NIC3,RA3,RB3,RC3,RD3 CLOSE(3) ! 按轮次输出每一行的递增版本 DO J=1,3 WRITE(*,100) NIA1,NIB1,NIC1,RA1,RB1,RC1,RD1 + 0.1*J WRITE(*,100) NIA2,NIB2,NIC2,RA2,RB2,RC2,RD2 + 0.1*J WRITE(*,100) NIA3,NIB3,NIC3,RA3,RB3,RC3,RD3 + 0.1*J END DO 100 FORMAT (I3,1X,I1,1X,I2,1X,F10.6,1X,F10.6,1X,F10.6,1X,F10.6) END PROGRAM SORTED_OUTPUT
这三个方案都能实现你想要的输出顺序,你可以根据自己的实际需求选择最合适的一个~
备注:内容来源于stack exchange,提问作者gunnerBR
相关产品推荐
相关产品推荐

