You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:08:05