我最近编写了一个FORTRAN代码,其中包含我使用冒泡排序算法的部分。现在,由于对非常大的文件进行排序(约7/8分钟)需要很长时间。但是,大多数输入文件的排列方式可以跳过排序并节省一些时间。其中 GO TO 和 CONTINUE 是我的朋友。但我并不确切知道将这些构造放在何处。
variable declaration
!****************** Name of the *.inp file from command line *****************
numargs=iargc()
IF (numargs.eq.3) THEN
CALL getarg(1,inputfile)
WRITE(*,*) ' Input: ',trim(inputfile)
CALL getarg(2,outputfile)
WRITE(*,*) 'Output: ',trim(outputfile)
CALL getarg(3,carg)
WRITE(*,*) 'Sorting invoked...'
ELSE IF (numargs.eq.2) THEN
CALL getarg(1,inputfile)
WRITE(*,*) ' Input: ',trim(inputfile)
CALL getarg(2,outputfile)
WRITE(*,*) 'Output: ',trim(outputfile)
**maybe IF statement for skipping the sorting part using GO TO (how?? IDK.)**
ELSE
WRITE(*,*) '****** The input and output filenames are missing! ******'
CALL exit(0)
END IF
INQUIRE(file=inputfile,exist=lex)
IF(.not.lex) THEN
WRITE(*,*) '**** file ', trim(inputfile), ' Does not exist!'
CALL exit(-1)
ENDIF
INQUIRE(file=outputfile,exist=lex)
IF(lex) THEN
WRITE(*,*) '**** file ', trim(outputfile), ' exists!'
WRITE(*,*) 'Delete and run the program again'
CALL exit(-1)
ENDIF
**estimation of records in input file**
**reading input file**
**bubble sort** (to be skipped or not depending upon command line argument)
**some more computation**
END
我希望我足够清楚!期待您的建议和指导。
PT
答案 0 :(得分:3)
我不会使用goto。我宁愿做类似于以下的事情
Logical :: sort_needed
sort_needed = .True.
... skip first part ...
ELSE IF (numargs.eq.2) THEN
CALL getarg(1,inputfile)
WRITE(*,*) ' Input: ',trim(inputfile)
CALL getarg(2,outputfile)
WRITE(*,*) 'Output: ',trim(outputfile)
sort_needed = .False.
ELSE
WRITE(*,*) '****** The input and output filenames are missing! ******'
CALL exit(0)
END IF
... skip to sort ....
If( sort_needed ) Then
Call sort( appropriate_arguments )
End If
...
End
一般来说,避免使用goto,往往会导致令人困惑的代码。虽然我不是现代Fortran中的狂热者,但它很少是最好的方式 - 实际上我真的不记得我最后一次用它来生气了
其他一些事情
1)这个很容易遵循,但养成发布完整代码而不是片段的习惯。它通常会澄清你想要问的内容。
2)冒泡排序是一种非常低效的算法。只要文件不大,至少要使用类似选择排序的东西。然而,从长远来看,像快速或堆排序这样的东西可能会为你节省大量时间
3)Fortran具有访问命令行的标准方法,iargc
和getarg
不是这样做的。我建议您查阅并使用command_argument_count
和get_command_argument
,任何好的,最新的Fortran书籍都将涵盖这些