Fortran90程序似乎是在没有我的许可的情况下将数字四舍五入,而且它正在弄乱我的输出

时间:2013-11-02 16:49:21

标签: sorting fortran fortran90 graphing rounding-error

我正在编写一个Fortran90程序,它将获取包含要绘制的点的输入文件,对这些点进行排序,计算最小和最大x和y值,将所有这些打印到另一个文件,然后创建一个图表并打印出来。

到目前为止,我要计算最小值和最大值,并且我已经将它打印到文件中了。
该计划的结构如下:

Please enter an input file:

GRAPH3.txt

Please enter an output file:

output.txt

然后它会从GRAPH3.txt中提取数据,做东西并打印出来。

GRAPH3.txt如下所示:

11
8.3       8.3
12.0      12.0
2.0       2.0
4.0       4.0
1.0       1.0
4.5       4.5
12.1      12.1
4.6       4.6
3.0       3.0
7.2       7.2
9.0       9.0

第一个数字表示有多少分。其余的只是数字对。

当我运行程序时,这是我的输出:

 presort
  8.30   8.30
 12.00  12.00
  2.00   2.00
  4.00   4.00
  1.00   1.00
  4.50   4.50
 12.10  12.10
  4.60   4.60
  3.00   3.00
  7.20   7.20
  9.00   9.00
 postsort
  1.00   1.00
  2.00   2.00
  3.00   3.00
  4.00   4.00
  4.00   4.00
  4.00   4.00
  7.20   7.20
  8.00   8.00
  9.00   9.00
 12.00  12.00
 12.00  12.00
Xmin:    1.00
Xmax:   12.00
Ymin:    0.00
ymax:   12.00

显然,ymin应为1.00,但它会显示在0.00。你知道为什么会这样做吗?

这是我的计划:

        PROGRAM G6P4
        implicit none
        character(len=30) :: infile,outfile
        logical inexist, outexist,more,quit
        integer i,j,n,overwrite
        real x(100),y(100),xmax,xmin,ymax,ymin
        more=.true.
        inexist = .false.
        outexist = .false.
        overwrite=2
        do while (.not.inexist)
            print *, 'Please enter an input filename'
            read *, infile
            INQUIRE(FILE=infile, EXIST=inexist)
            if (.not.inexist) then
                print *, 'Invalid Input File'
            end if
        end do
        do while (more.or.infile.eq.outfile)
            print *, 'Please enter an output filename'
            read *, outfile
            INQUIRE(FILE=outfile, EXIST=outexist)
            if (infile.eq.outfile) then
                print *, 'Outfile cannot equal infile.'
            else
                if (outexist) then
                    print *, 'File already exists'
                    print *, '1 to enter overwrite, 2 to enter new file, 0 to quit'
                    read *,overwrite
                    select case (overwrite)
                    case (1)
                        more =.false.
                    case (2)
                        more = .true.
                    case (0)
                        more = .false.
                        quit = .true.
                    case default
                        print *,'NOPE'
                        more = .true.
                    end select
                else
                    more=.false.
                end if
            end if
        end do
        if (quit.eqv..false.) then
            OPEN(1, FILE=infile)
            OPEN(2, FILE=outfile)
            READ(1,*)n
            if (n.le.100.and.n.gt.0) then
                do i = 1, n
                    read (1,*) x(i),y(i)
                end do
                write (2,*) 'presort'
                do i = 1, n
                    write (2,'(2(F6.2,X))') x(i),y(i)
                end do
                call sort(x,y,n)
                write (2,*) 'postsort'
                do i = 1, n
                    write (2,'(2(F6.2,X))') x(i),y(i)
                end do
                xmin = x(1)
                xmax = x(n)
                ymax = y(1)
                ymax = y(n)
                do i = 2, n
                    if (ymin.GT.y(i)) then
                        ymin=y(i)
                    end if
                    if (ymax.lt.y(i)) then
                        ymax=y(i)
                    end if
                enddo
                write (2,'(A,X,F6.2)') 'Xmin: ',xmin
                write (2,'(A,X,F6.2)') 'Xmax: ',xmax
                write (2,'(A,X,F6.2)') 'Ymin: ',ymin
                write (2,'(A,X,F6.2)') 'ymax: ',ymax
            else
                print *,'File has invalid number of data points'
            end if
        end if

        end PROGRAM

        subroutine sort(x,y,n)
            real, intent(out),dimension(100) :: x,y
            integer ::  n
            integer :: end,j,t
            logical :: more
            end = n-1
            do while (more)
                more = .false.
                do j = 1, end
                    if (x(j).gt.x(j+1)) then
                        write (*,'(A,2(F6.1,X))')'Pre: ',x(j),x(j+1)
                        t = x(j)
                        x(j)=x(j+1)
                        x(j+1)=t
                        t=y(j)
                        y(j) = y(j+1)
                        y(j+1)=t
                        more = .true.
                        write (*,'(A,2(F6.1,X))')'Post: ',x(j),x(j+1)
                    end if
                enddo
                end = end-1
            enddo
        end subroutine

我发现的另一个问题是,如果我从sort子例程中删除了write语句,由于某种原因,程序根本不会排序。任何线索为什么会这样做?

1 个答案:

答案 0 :(得分:1)

您没有初始化ymin。相反,您要初始化ymax两次。因此,ymin的默认初始化为零,这恰好是所考虑的最低数字,并被报告为最小值。