-1

X、Y 座標を画面にプロットする Fortran プログラムを作成しようとしています。プログラムに入力ファイルからプロットを受信させます。入力ファイルの最初のエントリはポイント数です。その後のすべての行には、x 値、スペース、対応する y 値があります。次に、プログラム バブルで x 値を最小から最大に並べ替えます。次に、これらの値をグラフ化します。x軸の目盛がxmax-xmin/点数、y軸が同じになるようにグラフ化したいです。ポイントの「*」をダーティグラフとして出力するにはどうすればよいですか??? 書き込み用のアルゴリズムを形成する方法の方向性だけで、全体の答えを探しているわけではありません。以下にリストされているのは、これまでに持っているコードとサンプル入力ファイルです

入力ファイル

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

コード

 *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    
4

1 に答える 1

1

手早く汚いものが必要な場合、最も簡単な方法は、グラフを横にプロットすることです (紙に印刷する場合ほど悪くはありません)。次に、y(現在はx)値に比例する長さで各行を印刷できます(最後にa 、またはヒストグラムの場合は*すべてs):*

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

そうでなければ、ライブラリを使用したくない場合、事態はすぐに複雑になります。次の最も簡単な方法は、文字の 2 次元配列 (画面のサイズ) を作成し、最初はスペースで埋めてから、それに「プロット」することです。完了したら、文字を行ごとに読み取って印刷することで印刷できます。利点は、軸をデータから分離することです。行を印刷するときにすべてを実行しようとすると、さまざまなタスクが混同されます。

しかし、プロットはすぐに予想以上に複雑になります。たとえば、目盛りを選択してラベルを印刷することは、それ自体がうまくいくための主要なタスクです。ライブラリを使用する方が本当に優れています(これが、最初に横向きのアプローチを提案した理由です-ライブラリを使用したくないよりもこれが非常に迅速で汚れている場合は、多くの場合、それで十分です)。

(これは、非常に迅速に実行できる場合の種類です。数分でまとめました)

更新: 目盛りの場合 (複雑になりすぎています!)、グラフィックス gem アルゴリズムが必要です。これはほぼ標準であり、論文は理解しやすいものです。これにより、合計範囲(および目盛りの間隔)が得られ、スケーリングは簡単になります(あなたが言うように、キャラクターは「価値がある」(xmax-xmin)/nchars-これ以上何を説明すればよいかわかりません)。

于 2012-04-08T03:57:34.257 に答える