我正在编写一个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语句,由于某种原因,程序根本不会排序。任何线索为什么会这样做?
答案 0 :(得分:1)
您没有初始化ymin。相反,您要初始化ymax两次。因此,ymin的默认初始化为零,这恰好是所考虑的最低数字,并被报告为最小值。