0

私は、グラフ化するポイントを含む入力ファイルを取得し、それらのポイントをソートし、x と y の最小値と最大値を計算し、これらすべてを別のファイルに出力し、グラフを作成する Fortran90 プログラムを作成中です。それも印刷します。

ここまでで、最小値と最大値を計算し、すべてファイルに出力しました。
プログラムの構造は次のとおりです。

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

私が発見したもう 1 つの問題は、並べ替えサブルーチンから書き込みステートメントを削除すると、何らかの理由でプログラムがまったく並べ替えられないことです。なぜそれを行うのか、手がかりはありますか?

4

1 に答える 1

1

ymin を初期化していません。代わりに ymax を 2 回初期化しています。したがって、ymin はゼロのデフォルト初期化を取得します。これはたまたま考慮される最小の数値であり、最小として報告されます。

于 2013-11-02T16:52:46.970 に答える