Я в процессе написания программы 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
Еще одна проблема, я обнаружил, что если я удалю операторы записи из подпрограммы сортировки по какой-то причине программа не сортирует вообще. Есть ли подсказки, почему это было бы так?
О, джед ... это определенно. Спасибо что подметил это. У вас есть идея, почему он только сортирует, когда у меня есть записи для записи? –
Я не знаю FORTRAN 90 достаточно, чтобы действительно ответить на этот вопрос. Сожалею. – mikeTronix
'more' также не инициализируется, поэтому процедура сортировки не гарантирует ничего, независимо от того, существуют ли операторы записи. Удаление их может привести к тому, что оптимизация компилятора сделает что-то, чтобы выявить эту ошибку, или, возможно, это совпадение, когда вы столкнулись с ней одновременно с удалением записей. –