求助一段简单的fortran代码
根据你的描述,在每行中只需要判断三次,并作相应的位置调整即可:
若1,2相等,则不管3是不是和1,2 相等,都不需要调整三个数的位置;
若1,3相等,则不管2是不是和1,3相等,只需要调整2和3的位置;
若2,3相等,则不管1是不是和2,3相等,只需要调整1和3的位置;
则编程思路如下:
PROGRAM main
IMPLICIT NONE
INTEGER,PARAMETER::Col=3
INTEGER::i,j,Line,err
REAL*8,ALLOCATABLE::A(:,:)
REAL*8::temp,errf
errf=1.0E-8 !判断两实数是否相等
Line=100 !输入文件的列数
ALLOCATE(A(Line,Col),stat=err) !开辟空间
IF(err/=0)GOTO 997
OPEN(10,file='1.txt') !指定输入文件名
READ(10,*)((A(i,j),j=1,Col),i=1,Line) !读入文件中的数据
CLOSE(10) !关闭文件
DO i=1,Line !逐行判断行内的三个数是否需要交换
IF(abs(A(i,1)-A(i,2))>errf)THEN !若条件不满足,则一、二相等,结束当前行判断进入下一行;若条件满足,则一、二不等,需判断其他情况。
IF(abs(A(i,1)-A(i,3))>errf)THEN !若条件不满足,则一、三相等,交换二、三位置,结束当前行判断进入下一行;若条件满足,则一、三不等,需判断其他情况。
IF(abs(A(i,2)-A(i,3))>errf)THEN !若条件不满足,则二、三相等,交换一、三位置,结束当前行判断进入下一行;若条件满足,则二、三不等。且此时已判断出一、二、三全不等,不交换位置。
WRITE(*,*)"第",i,"行没有相等的实数"
ELSE
temp=A(i,1)
A(i,1)=A(i,3)
A(i,3)=temp
ENDIF
ELSE
temp=A(i,2)
A(i,2)=A(i,3)
A(i,3)=temp
ENDIF
ENDIF
ENDDO
OPEN(10,file='2.txt') !指定输出文件名
WRITE(10,*)((A(i,j),j=1,Col),i=1,Line) !向文件中写数据
CLOSE(10) !关闭文件
GOTO 1000
997 WRITE(*,*)"PROGRAM开辟数组时内存不足"
STOP
1000END PROGRAM main
算例,(只给了5行数据):
1.txt
0.1 0.1 2.0
0.2 0.3 0.2
0.4 0.6 0.6
0.8 0.5 0.6
0.4 0.4 0.4
2.txt
0.100000000000000 0.100000000000000 2.00000000000000
0.200000000000000 0.200000000000000 0.300000000000000
0.600000000000000 0.600000000000000 0.400000000000000
0.800000000000000 0.500000000000000 0.600000000000000
0.400000000000000 0.400000000000000 0.400000000000000
2024-09-19 广告