2013-11-02 2 views
0

Я в процессе написания программы Fortran90, которая возьмет входной файл, содержащий точки, которые нужно нарисовать, сортировать эти точки, вычислять минимальные и максимальные значения x и y, распечатайте все это в другой файл, а затем создайте график и распечатайте его.Программа Fortran90, кажется, округляет числа без моего разрешения, и это испортило мой вывод

До сих пор я вычислял значения min и max, и у меня есть все, что печатается в файл.
Структура программы как таковой:

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

Вы не инициализируете ymin. Вместо этого вы инициализируете ymax дважды. Поэтому ymin получает инициализацию нуля по умолчанию, которая считается наименьшим числом, и сообщается как минимум.

+0

О, джед ... это определенно. Спасибо что подметил это. У вас есть идея, почему он только сортирует, когда у меня есть записи для записи? –

+0

Я не знаю FORTRAN 90 достаточно, чтобы действительно ответить на этот вопрос. Сожалею. – mikeTronix

+0

'more' также не инициализируется, поэтому процедура сортировки не гарантирует ничего, независимо от того, существуют ли операторы записи. Удаление их может привести к тому, что оптимизация компилятора сделает что-то, чтобы выявить эту ошибку, или, возможно, это совпадение, когда вы столкнулись с ней одновременно с удалением записей. –

Смежные вопросы