在作图Fortran语言,算法所需援助所需、算法、语言、Fortran

2023-09-11 07:23:53 作者:捻墨于埃

我想创建一个FORTRAN程序,将绘制X,Y坐标到屏幕上。我有计划接收图输入文件。在输入文件中的第一个条目是点的量。之后,每行有一个x值,那么一个空间,然后在相应的y值。然后,我有计划冒泡排序的x值从最小到最大的。接下来,我要绘制这些值。我想绘制它们从而使X轴的刻度是XMAX-XMIN /#点和y轴是相同的。如何将我去打印一个*的点作为一个肮脏的图???即时没有寻找整个回答如何形成的算法的写入只是一些方向。下面列出的是code,我有这么远,示例输入文件

输入文件

  10
 -4 16
 -3 9
 -2 4
 -1 1
 0 0
 1 1
 2 4
 3 9
 4月16日
 5月25日
 

code

  *启动code
  程序的主

 * DECLARATIONS
  INTEGER EXISTS,DONE,点,使用I,E
  REAL XSTEP,YSTEP,XMIN,XMAX,YMIN,YMAX
  真正的X(100),Y(100),A,B
  CHARACTER INNAME * 30,OUTNAME * 30
  逻辑更多
  CHARACTER(70)LINE

 *初始化
  INNAME ='NULL.DOC
  EXISTS = 0
  DONE = 0
  点= 0
  二手= 0
  I = 0
  E = 0
  更多= .TRUE。
  A = 0
  B = 0
  XSTEP = 0
  YSTEP = 0
  XMIN = 0
  XMAX = 0
  YMIN = 0
  YMAX = 0


 *清除阵列
  DO I = 1100
  X(I)中= 0
  Y(I)= 0
  到底
  I = 0

 * FORMATS
 5 FORMAT('','点号',I3,'X =',F5.2,'Y =',F5.2)
 10 FORMAT('','XMIN =',F5.2,XMAX =',F5.2)
 15 FORMAT('','YMIN =',F5.2,YMAX =',F5.2)
 20 FORMAT('','X STEP =',F5.2,'Y STEP =',F5.2)



 *主要code
 ************************************************** **************


 *提示输入文件名称并输入
PRINT *,'请输入一个文件名包括扩展名
PRINT *,ENTER退出或q退出
READ(*,*)INNAME

 * OPEN IF(0)
IF(INNAME.EQ.'Q'.OR.INNAME.EQ.'QUIT')THEN
PRINT *,再见
其他

 *测试对于文件
查询(FILE = INNAME,EXIST = EXISTS)

 *如果不存在= FALSE,显示信息
IF(.NOT.EXISTS)THEN
PRINT *,文件不存在,请重试

 *再存在下去= TRUE,OPEN(单位= 1)
其他
OPEN(单位= 1,FILE = INNAME,STATUS ='老')
END IF

 ************************************************** ***********

 * ASK FOR的选择输出
PRINT *,'请输入姓名输入一个输出文件W / EXTENSION
PRINT *,ENTER退出或q退出
READ(*,*)OUTNAME

IF(OUTNAME.EQ.'Q'.OR.OUTNAME.EQ.'QUIT')THEN
PRINT *,再见
其他

 ************************************************** ***********
 *检查DONE(IF 1)
IF(DONE.EQ.0)THEN

 *打开输出文件DO(2)
做,而(USED.EQ.0)
查询(FILE = OUTNAME,EXIST = EXISTS)

 *打开状态,如果(2)若文件已存在
IF(EXISTS.EQ.1)THEN
OPEN(单位= 2,FILE = OUTNAME,STATUS ='老')

 * END如果文件是否已经存在的AMD敞开,如果不存在,
其他
OPEN(单位= 2,FILE = OUTNAME,状态=新)

 * END IF(2)
END IF

 *读取1整数(100最大值)#文件点的
READ(1,*,END = 111),分

 *读取x和y的100最大值
DO I = 1,点
READ(1,*,END = 111)×(I)中,Y(I)
到底

 * SORT点
E =点 -  1
更多= .TRUE。
做,而(更多.EQ。.TRUE。)
更多= .FALSE。
DO I = 1,E
中频(Ⅹ(Ⅰ).GT.X(I + 1))THEN
更多= .TRUE。
A = X(I)
B = Y(I)
X(Ⅰ)= X(I + 1)
Y(I)= Y(I + 1)
X(I + 1)= A
Y(I + 1)= B
END IF
到底
E = E-1
到底

 *找到分钟,X和Y MAX
I = 1
XMIN = X(I)的
XMAX = X(点)
YMIN = Y(I)
YMAX = Y(I)
DO I = 1,点
IF(Y(I).LT。YMIN)THEN
YMIN = Y(I)
END IF
THEN IF(Y(I).GT。YMAX)
YMAX = Y(I)
END IF
到底

 *发现X和Y步骤
XSTEP =(XMAX-XMIN)/点
YSTEP =(YMAX-YMIN)/点



 *打印输出文件
DO I = 1,点
WRITE(2,5)I,X(Ⅰ)中,Y(Ⅰ)
到底
WRITE(2,10)XMIN,XMAX
WRITE(2,15)YMIN,YMAX
WRITE(2,20)XSTEP,YSTEP
 *打印图形


 *到底(2)
到底

 * END IF(1)
END IF

 * END IF QUIT(S)
END IF
END IF

 *关闭文件
  CLOSE(UNIT = 1)
  CLOSE(UNIT = 2)

 111 PRINT *,该程序已经结束

 *停止
  停止

 *结束
  结束
 

解决方案 Fortran语言教程

如果你想要的东西快速和肮脏的,迄今为止最简单的方法是绘制图形横盘(不是那么糟糕,因为它的声音,如果你要打印到纸)。那么你可以只打印的长度成正比,Y(今x)的值每行(以 * 在年底,或全部 * S表示直方图):

  + ------------------------------------- > ÿ
| *
| *
| *
。等等
 

否则,如果你不想使用图书馆,事情变得复杂起来相当迅速。下一个最简单的方法是让人物的二维数组(屏幕大小),最初是用空格填充,然后阴谋来表示;一旦完成,你可以通过按行读取字符一行并将它们打印出来。其优点有它从数据中分离轴 - 如果你尽力做好每一件事,你打印线,不同的任务变得混淆

但阴谋很快变得比预期更为复杂。例如,选择刻度线和打印标签本身就是一个重大的任务要做好。你真的更好地使用库(这就是为什么我建议横盘的方式第一 - 如果是这样的话快+肮脏的比你不希望使用一个库,然后就是往往不够好)。

(这是种如果你能很快做到的事情 - 我扔了一起几分钟)

更新:为tickmarks(!它变得太复杂)你想要的图形宝石算法 - 这是pretty的很多标准和纸张很容易理解。 ,让您在整个范围(以及刻度间隔),然后缩放容易(一个字符是身价(XMAX-XMIN)/ nchars ,因为你说 - 不知道更多的解释)

?。

I am trying to create a fortran program that will plot X,Y coordinates to the screen. I have the program receive plots from an input file. in the input file the first entry is the amount of points. every line after that has an x value then a space then the corresponding y values. I then have the program bubble sort the x values from smallest to greatest. next i want to graph these values. i want to graph them so that the scale of the x axis is xmax-xmin/#of points and the y axis is the same. how would i go about printing a '*' for points as a dirty graph??? im not looking for the entire answer just some direction of how to form the algorithm for the write. Listed below is the code that i have so far and a sample input file

Input File

 10
 -4 16
 -3 9
 -2 4
 -1 1
 0 0
 1 1
 2 4
 3 9
 4 16
 5 25

Code

 *START OF CODE
  PROGRAM MAIN

 *DECLARATIONS
  INTEGER EXISTS, DONE, POINTS, USED, I, E
  REAL XSTEP, YSTEP, XMIN, XMAX, YMIN, YMAX
  REAL    X(100), Y(100), A, B
  CHARACTER INNAME*30, OUTNAME*30
  LOGICAL MORE
  CHARACTER (70) LINE

 *INITIALIZATIONS
  INNAME='NULL.DOC'
  EXISTS=0
  DONE=0
  POINTS=0
  USED=0
  I=0
  E=0
  MORE = .TRUE.
  A=0
  B=0
  XSTEP = 0
  YSTEP = 0
  XMIN=0
  XMAX=0
  YMIN=0
  YMAX=0


 *CLEAR THE ARRAYS     
  DO I=1,100
  X(I)=0
  Y(I)=0
  END DO
  I=0

 *FORMATS
 5     FORMAT(' ','POINT #', I3, ' X=', F5.2,' Y=', F5.2)
 10    FORMAT(' ','XMIN=',F5.2, ' XMAX=', F5.2)
 15    FORMAT(' ','YMIN=',F5.2, ' YMAX=', F5.2)
 20    FORMAT(' ','X STEP=',F5.2, ' Y STEP=', F5.2)



 *MAIN CODE
 ****************************************************************


 *PROMPT FOR NAME OF FILE AND INPUT
PRINT *,'PLEASE INPUT A FILE NAME INCLUDING AN EXTENSION'
PRINT *,'ENTER QUIT OR Q TO EXIT'
READ (*,*) INNAME

 *OPEN IF(0)                    
IF(INNAME.EQ.'Q'.OR.INNAME.EQ.'QUIT')THEN
PRINT *,'GOODBYE'
ELSE     

 *TEST FOR FILE
INQUIRE(FILE=INNAME, EXIST=EXISTS)

 *IF EXIST=FALSE, DISPLAY MESSAGE 
IF(.NOT.EXISTS) THEN
PRINT *,'FILE DOES NOT EXIST, PLEASE TRY AGAIN'    

 *ELSE EXIST=TRUE, OPEN (UNIT=1)
ELSE 
OPEN(UNIT=1, FILE=INNAME, STATUS='OLD')
END IF

 *************************************************************

 *ASK CHOICES FOR OUTPUT
PRINT *,'PLEASE ENTER A NAME FOR AN OUTPUT FILE W/ EXTENSION'
PRINT *,'ENTER QUIT OR Q TO EXIT'
READ(*,*)OUTNAME

IF(OUTNAME.EQ.'Q'.OR.OUTNAME.EQ.'QUIT')THEN
PRINT *,'GOODBYE'
ELSE

 *************************************************************
 *CHECK IF DONE (IF 1)
IF(DONE.EQ.0)THEN

 *OPEN THE OUTPUT FILE DO(2)
DO WHILE(USED.EQ.0)
INQUIRE(FILE=OUTNAME,EXIST=EXISTS)

 *OPEN IF(2) FOR IF FILE ALREADY EXISTS
IF(EXISTS.EQ.1)THEN
OPEN(UNIT=2,FILE=OUTNAME,STATUS='OLD')

 *END IF FOR IF FILE ALREADY EXISTS AMD OPEN IF DID NOT EXIST,              
ELSE
OPEN(UNIT=2,FILE=OUTNAME,STATUS='NEW')

 *END IF (2)                   
END IF

 *READ IN 1 INTEGER (MAXIMUM VALUE OF 100) FOR # OF POINTS IN FILE
READ(1,*, END=111),POINTS

 *READ IN X AND Y VALUES WITH MAX OF 100
DO I=1, POINTS
READ(1,*,END=111) X(I),Y(I)
END DO

 *SORT POINTS
E = POINTS - 1
MORE = .TRUE.
DO WHILE (MORE .EQ. .TRUE.)
MORE = .FALSE.
DO I=1, E
IF(X(I).GT.X(I+1)) THEN
MORE = .TRUE.
A=X(I)
B=y(I)
X(I)=X(I+1)
Y(I)=Y(I+1)
X(I+1)=A
Y(I+1)=B
END IF
END DO
E=E-1
END DO

 *FIND MIN AND MAX OF X AND Y
I=1
XMIN = X(I)
XMAX = X(POINTS)
YMIN = Y(I)
YMAX = Y(I)
DO I=1, POINTS
IF(Y(I) .LT. YMIN) THEN
YMIN = Y(I)
END IF
IF(Y(I) .GT. YMAX) THEN
YMAX = Y(I)
END IF
END DO

 *fIND X AND Y STEPS    
XSTEP = (XMAX-XMIN)/POINTS
YSTEP = (YMAX-YMIN)/POINTS



 *PRINT TO THE OUTPUT FILE
DO I=1, POINTS
WRITE(2,5)I,X(I),Y(I)
END DO
WRITE(2,10)XMIN,XMAX
WRITE(2,15)YMIN,YMAX
WRITE(2,20)XSTEP,YSTEP
 *PRINT GRAPH


 *END DO (2)
END DO

 *END IF (1)
END IF

 *END IF QUIT(S)
END IF
END IF

 *CLOSE THE FILES
  CLOSE(UNIT=1)
  CLOSE(UNIT=2)

 111   PRINT * , 'The Program Has Now Ended'

 *STOP
  STOP

 *END
  END    

解决方案

if you want something quick and dirty, the easiest approach by far is to plot the graph sideways (not as bad as it sounds if you are going to print to paper). then you can just print each line with a length proportional to the y (now x) value (with a * at the end, or all *s for a histogram):

+-------------------------------------> y
|         *
|            *
|          *
. etc

otherwise, if you don't want to use a library, things get complicated quite quickly. the next simplest approach is to make a 2d array of characters (the size of your screen), initially filled with spaces, and then "plot" to that; once done you can print it by reading the characters row by row and printing them. the advantage there is that it separates the axes from the data - if you try to do everything as you print a line, the different tasks become mixed up.

but plotting soon becomes more complex than you expected. for example, choosing tick marks and printing labels is itself a major task to do well. you're really better using a library (which is why i suggested the sideways approach first - if this is so quick + dirty than you don't want to use a library, then that is often good enough).

(this is the kind if thing you can do very quickly - i threw that together in a few minutes)

update: for tickmarks (it's getting too complicated!) you want the graphics gem algorithm - it's pretty much the standard, and the paper is easy to understand. that gives you your total range (as well as the tick spacing), and then scaling is easy (a character is "worth" (xmax-xmin)/nchars, as you say - not sure what more to explain?).