home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* DATAED2.PAS *)
- (* Grafik- und Histogrammgestützte Meßdateneditoren *)
- (* (C) 1990 Peter Kurzweil & TOOLBOX *)
- (* ------------------------------------------------------ *)
-
- PROGRAM Messdateneditor;
-
- USES Crt, Dos, Printer, Graph, PGRAPH;
-
- TYPE
- ScaleTyp = (linear, lineardown, log, logdown);
- CONST
- GraphActiv: BOOLEAN=FALSE;
- VAR
- ESC, UP, DOWN, LEFT, RIGHT, RETURN: BOOLEAN;
- ch: CHAR;
- x, y, z: Vektor; a, b: REAL; i, n: WORD; { Stützstellen }
-
- PROCEDURE SMOOTH(VAR z, x, y: Vektor;
- VAR n: WORD; Nr: BYTE;
- Titel1, Titel2, zTxt, xTxt, yTxt: strg80);
- FORWARD;
- PROCEDURE DataEditor(VAR x, y, z: Vektor;
- VAR n: WORD;
- xTxt, yTxt, zTxt: strg80;
- xscal, yscal: ScaleTyp;
- AngleTrue: BOOLEAN); FORWARD;
- PROCEDURE Graphik(x, y: Vektor;
- n: WORD;
- xtitel, ytitel: strg80;
- x1, x2, y1, y2: REAL;
- UserUscale: BOOLEAN;
- xscal, yscal: ScaleTyp;
- Origin, AngleTrue: BOOLEAN;
- ex: REAL;
- Lintyp, Thickness, Color, CurvexCol: BYTE;
- Nr: INTEGER); FORWARD;
- PROCEDURE ManualScaling(x, y: Vektor; n: WORD;
- VAR xmin, xmax, ymin, ymax: REAL;
- VAR UserUscale, AngleTrue: BOOLEAN;
- xTxt, yTxt: strg80;
- xscal, yscal: ScaleTyp); FORWARD;
-
- {---------------------- Hilfsroutinen -------------------- }
-
- FUNCTION FORMAT(x:REAL; f:BYTE): strg80; { Zahlenformat }
- VAR S: strg80;
- BEGIN { Gleitkomma }
- IF Abs(LOG10(x))<=5 THEN Str(x:f:5,S) ELSE
- BEGIN { E-Format }
- Str(x:f,S);
- WHILE Length(S)>f DO Delete(S,Pos('E',S)+2,1);
- WHILE Length(S)>f DO Delete(S,Pos('E',S)-1,1);
- END;
- FORMAT:=S;
- END;
-
- FUNCTION SFORMAT(S: strg80; len: BYTE): strg80;
- VAR i,k:BYTE; S1:strg80;
- BEGIN
- WHILE Length(S)>len DO Delete(S, Length(S), 1);
- WHILE S[1]=#32 DO Delete(S, 1, 1); S1:=S;
- k:=(len-Length(S)) DIV 2; S:='';
- FOR i:=1 TO k DO S:=S+#32; S:=S+S1;
- FOR i:=Length(S)+1 TO len DO S:=S+#32;
- SFORMAT:=S;
- END;
-
- PROCEDURE InKey; { Tastaturabfrage }
- VAR Regs: Registers;
- BEGIN
- UP:=FALSE; DOWN:=FALSE; LEFT:=FALSE; RIGHT:=FALSE;
- RETURN:=FALSE; ESC:=FALSE;
- Regs.AX:=$0C00; MsDos(Regs); { Lösche Tastaturpuffer }
- ch:=UpCase(ReadKey);
- CASE ch OF
- #0: BEGIN
- ch:=ReadKey;
- CASE ch OF
- #$48: UP:=TRUE; { Cursor UP }
- #$50: DOWN:=TRUE; { Cursor DOWN }
- #$4B: LEFT:=TRUE; { Cursor LEFT }
- #$4D: RIGHT:=TRUE { Cursor RIGHT }
- END;
- ch:=#32;
- END;
- #13: RETURN:=TRUE; { CR }
- #27: ESC:=TRUE; { ESC }
- END;
- END;
-
- PROCEDURE SwapMinMax(VAR x1, x2: REAL); { Vertauschen }
- VAR h: REAL; { x1 < x2 }
- BEGIN
- IF x1>x2 THEN BEGIN h:=x1; x1:=x2; x2:=h; END;
- END;
-
- PROCEDURE SwapMaxMin(VAR x1, x2: REAL); { Vertauschen }
- VAR h: REAL; { x1 > x2 }
- BEGIN
- IF x1<x2 THEN BEGIN h:=x1; x1:=x2; x2:=h; END;
- END;
-
- PROCEDURE ExtremaAbs(z: Vektor; n: WORD;
- VAR zmin, zmax: REAL);
- VAR i: WORD; a: REAL;
- BEGIN
- zmin:=Abs(z[1]); zmax:=zmin;
- FOR i:=2 TO n DO BEGIN
- a:=Abs(z[i]);
- IF a<zmin THEN zmin:=a;
- IF a>zmax THEN zmax:=a;
- END;
- END;
-
- PROCEDURE InfoLine(Msg: strg80; Line, TCol, BCol: BYTE);
- VAR k: BYTE; { Zentrierte Textausgabe }
- BEGIN
- TextColor(TCol); TextBackground(BCol);
- k:=(80-Length(Msg)+1) DIV 2;
- GotoXY(1, Line); ClrEol; GotoXY(k, Line); Write(Msg);
- END;
-
- {----------------------------------------------------------}
- { Graphikgestützer Meßdateneditor }
- {----------------------------------------------------------}
-
- {$F+}
- PROCEDURE CloseGraphik; { Verbesserte Version für PGRAPH }
- BEGIN
- GraphActiv:=FALSE;
- CloseGraph;
- END;
- {$F-}
-
- PROCEDURE OpenGraphik; { Verbesserte Version für PGRAPH }
- BEGIN { Schutz vor mehrmaligem Öffnen }
- IF GraphActiv THEN CloseGraphik;
- GraphActiv:=TRUE; GraphDriver:=Detect;
- InitGraph(GraphDriver, GraphMode, '');
- IF GraphResult<>grOk THEN BEGIN
- WriteLn('FEHLER: ', GraphErrorMsg(ErrorCode)); Halt;
- END;
- IF GraphDriver IN [1, 2, 7] THEN BEGIN
- Black:=0; Blue:=7; Green:=15; Cyan:=15; Red:=15;
- Magenta:=15; Brown:=15; LightGray:=7; DarkGray:=15;
- LightBlue:=15; LightGreen:=15; LightCyan:=15;
- LightRed:=15; LightMagenta:=15; Yellow:=15; White:=15;
- END;
- Uaxmin:=0; Uaxmax:=GetMaxX; Vaxmin:=0; Vaxmax:=GetMaxY;
- END;
-
- PROCEDURE Cross(x, y: REAL); { Fadenkreuz }
- CONST len=12;
- VAR u, v: INTEGER;
- BEGIN
- SetWriteMode(XORPut);
- SetColor(White); Scale(x, y, u, v);
- Line(u-len, v, u+len, v); Line(u, v-len, u, v+len);
- PutPixel(u, v, White);
- SetWriteMode(NormalPut);
- END;
-
- PROCEDURE InfoLineGraphik(Msg: strg80; Line, Color: BYTE);
- VAR h, len, x: WORD; { Textausgabe im Graphikmodus }
- BEGIN
- SetColor(Color); SetTextStyle(Defaultfont, HorizDir, 1);
- SetTextJustify(CenterText, CenterText);
- h:=(GetMaxY DIV 24);
- len:=TextWidth(Msg+'MM') DIV 2; x:=(GetMaxX DIV 2);
- IF Line>=25 THEN
- SetViewPort(0, GetMaxY-h, GetMaxX, GetMaxY, TRUE)
- ELSE SetViewPort(x-len, (Line-1)*h, x+len, Line*h, TRUE);
- ClearViewPort;
- SetViewPort(0, 0, GetMaxX, GetMaxY, TRUE);
- OutTextXY(x, Trunc((Line-0.5)*h), Msg);
- END;
-
- PROCEDURE DataEditor; { Graphikgestützter Meßdateneditor }
- VAR
- Msg, S: strg80; i: INTEGER; k, i1, i2: WORD;
- x1, x2, y1, y2, a, b, r, da, db, xo, xm, ym, sx, sy: REAL;
- xx, yy: Vektor;
- UserUscale: BOOLEAN; lx, ly: STRING[4];
-
- PROCEDURE Reset; { Bildaufbau }
- BEGIN
- Graphik(x, y, n, xTxt, yTxt, x1, x2, y1, y2, UserUscale,
- xscal, yscal, FALSE, AngleTrue, 999, SolidLn,
- NormWidth, Yellow, White, 001);
- InfoLineGraphik('(CURSOR) Kreuz bewegen, (SHIFT CURSOR)'
- +' schnell bewegen, (ESC) Ende', 1, White);
- InfoLineGraphik('(L)öschen, (A)chsen anpassen,'+
- ' (N)eu zeichnen', 2, White);
- InfoLineGraphik(xTxt, 24, White);
- END;
-
- BEGIN
- UserUscale:=FALSE; Reset;
- lx:=''; ly:=''; i:=1; i1:=0; i2:=0;
- IF xscal IN [linear, lineardown] THEN xx:=x;
- IF yscal IN [linear, lineardown] THEN yy:=y;
- IF xscal IN [log, logdown] THEN BEGIN
- FOR k:=1 TO n DO xx[k]:=LOG10(x[k]); lx:='log ';
- END;
- IF yscal IN [log, logdown] THEN BEGIN
- FOR k:=1 TO n DO yy[k]:=LOG10(y[k]); ly:='log ';
- END;
- Cross(xx[i], yy[i]);
- REPEAT
- Str(i, S); { Zahlenleiste }
- Msg:='Wert-Nr. '+S+#32#32+xTxt+' = '+FORMAT(x[i],8)+
- #32#32+yTxt+' = '+FORMAT(y[i],8)+#32#32+zTxt+' = '+
- FORMAT(z[i], 8);
- InfoLineGraphik(Msg, 25, White);
- InKey;
- Cross(xx[i], yy[i]);
- IF UP OR LEFT THEN { Cursortasten }
- IF i>1 THEN
- Dec(i);
- IF DOWN OR RIGHT THEN
- IF i<n THEN
- Inc(i);
- CASE ch OF { Steuerzeichen }
- '8','4': BEGIN
- i:=i-5;
- IF i<=1 THEN BEGIN i:=1;
- Curve(xx, yy, n, SolidLn,
- NormWidth, Yellow);
- END;
- END;
- '6','2': BEGIN
- i:=i+5;
- IF i>=n THEN BEGIN i:=n;
- Curve(xx, yy, n, SolidLn,
- NormWidth, Yellow);
- END;
- END;
- 'L': BEGIN { Meßpunkt löschen }
- IF n>3 THEN BEGIN
- Curve(xx, yy, n, SolidLn,
- NormWidth, Black);
- FOR k:=i+1 TO n DO BEGIN
- x[k-1]:=x[k]; y[k-1]:=y[k];
- z[k-1]:=z[k]; xx[k-1]:=xx[k];
- yy[k-1]:=yy[k];
- END;
- n:=n-1; IF i>=n THEN i:=n;
- Curve(xx, yy, n, SolidLn, NormWidth,
- Yellow);
- END ELSE Write(#7);
- END;
- 'N': Reset; { Kurve auffrischen }
- 'A': BEGIN { Manuelle Skalierung }
- CloseGraphik;
- ManualScaling(x, y, n, x1, x2, y1, y2,
- UserUscale, AngleTrue, xTxt,
- yTxt, xscal, yscal);
- Reset;
- END;
- END;
- Cross(xx[i], yy[i]); { Kreuz verschieben }
- UNTIL ESC;
- CloseGraphik;
- END;
-
- PROCEDURE Graphik; { Treiberroutine für Graphikbibliothek }
- VAR h: INTEGER;
-
- PROCEDURE Scale; { Skalierung für log. Achsen }
- VAR i: WORD;
- BEGIN
- IF xscal IN [log, logdown] THEN
- FOR i:=1 TO n DO x[i]:=LOG10(x[i]);
- IF yscal IN [log, logdown] THEN
- FOR i:=1 TO n DO y[i]:=LOG10(y[i]);
- END;
-
- PROCEDURE MakeUscale; { Koordinatensystem }
- BEGIN
- IF (NOT UserUscale) THEN BEGIN { ...automatisch }
- extrema(x, n, x1, x2); extrema(y, n, y1, y2);
- END;
- IF UserUscale THEN BEGIN { ...vorgegeben }
- IF xscal IN [log, logdown] THEN BEGIN
- x1:=LOG10(x1); x2:=LOG10(x2);
- END;
- IF yscal IN [log, logdown] THEN BEGIN
- y1:=LOG10(y1); y2:=LOG10(y2);
- END;
- END;
- IF xscal IN [lineardown, logdown] THEN
- SwapMaxMin(x1, x2);
- IF yscal IN [lineardown, logdown] THEN
- SwapMaxMin(y1, y2);
- IF xscal IN [linear, log] THEN SwapMinMax(x1, x2);
- IF yscal IN [linear, log] THEN SwapMinMax(y1, y2);
- IF ex=999 THEN BEGIN { Ausweitung }
- ex:=5; IF UserUscale THEN ex:=0;
- END;
- uscale(x1, x2, y1, y2, Origin, AngleTrue, ex);
- END;
-
- PROCEDURE MakeAxis; { Achsen bestellen }
- BEGIN
- IF xscal IN [linear, lineardown] THEN { x-Achse linear }
- XAxis(x1, x2, xtitel, Defaultfont, 1);
- IF yscal IN [linear, lineardown] THEN { y-Achse linear }
- YAxis(y1, y2, ytitel, Defaultfont, 1);
- IF xscal IN [log, logdown] THEN { x-Achse log. }
- LogXAxis(x1, x2, xtitel, Defaultfont, 1);
- IF yscal IN [log, logdown] THEN { y-Achse log. }
- LogYAxis(y1, y2, ytitel, Defaultfont, 1);
- XGrid(0); { Nullinie }
- Ygrid(0);
- END;
-
- BEGIN
- Scale;
- IF Nr=1 THEN BEGIN { Uscale bei erster Kurve }
- OpenGraphik;
- h:=TextHeight('Mg');
- GraphikWindow(5*h, GetMaxX-4*h, 4*h, GetMaxY-2*h);
- MakeUscale;
- MakeAxis;
- END;
- IF Nr<0 THEN BEGIN MakeUscale; END; { Uscale wechseln }
- Curve(x, y, n, Lintyp, Thickness, Color);
- IF (CurvexCol IN [0..15]) THEN Curvex(x, y, n, CurvexCol);
- IF Nr=999 THEN CloseGraphik; { letztes Bild }
- END;
-
- PROCEDURE ManualScaling; { Menü zur Achsenanpassung }
- VAR Msg: strg80;
-
- PROCEDURE expand(VAR a, b: REAL; p: REAL;
- zscal: ScaleTyp);
- VAR zz, z1, z2: REAL;
- BEGIN { Vergrößern/Verkleinern }
- z1:=a; z2:=b;
- IF zscal IN [log, logdown] THEN
- BEGIN z1:=LOG10(a); z2:=LOG10(b); END;
- zz:=Abs(z2-z1)*0.005*p; IF z1>z2 THEN zz:=-zz;
- z1:=z1-zz; z2:=z2+zz;
- IF zscal IN [log, logdown] THEN
- BEGIN z1:=exp10(z1); z2:=exp10(z2); END;
- a:=z1; b:=z2;
- END;
-
- PROCEDURE WriteValues; { Achsenausdehnung anzeigen }
- VAR k: BYTE;
- BEGIN
- IF UserUscale THEN InfoLine(
- 'Benutzereigenes Koordinatensystem', 4, White, Black)
- ELSE
- InfoLine('Automatische Skalierung', 4, White, Black);
- TextBackground(Black); TextColor(Yellow);
- WriteLn(#13#10);
- WriteLn(' Achsenausdehnung ',
- ' Größe');
- WriteLn(' Minimum Maximum ');
- FOR k:=1 TO 75 DO Write('-'); WriteLn(#13#10);
- WriteLn('X-Achse: ', FORMAT(xmin, 12), ' ',
- FORMAT(xmax,12), ' ', xTxt, #13#10);
- WriteLn('Y-Achse: ', FORMAT(ymin, 12), ' ',
- FORMAT(ymax,12), ' ', yTxt, #13#10#10#10);
- END;
-
- PROCEDURE FindExtrema(z: Vektor; n: WORD; zscal: ScaleTyp;
- VAR zmin, zmax: REAL);
- BEGIN
- IF zscal IN [linear, lineardown] THEN
- extrema(z, n, zmin, zmax)
- ELSE ExtremaAbs(z, n, zmin, zmax);
- END;
-
- BEGIN
- TextBackground(0); ClrScr;
- InfoLine('Manuelle Skalierung', 2, Black, White);
- InfoLine('(X)-Achse (Y)-Achse (W)inkeltreu (A)utomatik'+
- ' (+) Größer (-) Kleiner (ESC) Ende',
- 3, Black, White);
- IF NOT UserUscale THEN BEGIN
- FindExtrema(x, n, xscal, xmin, xmax);
- FindExtrema(y, n, yscal, ymin, ymax);
- END;
- WriteValues;
- REPEAT
- TextColor(White); TextBackground(Black); InKey;
- CASE ch OF
- 'A': BEGIN
- UserUscale:=FALSE; { Autoskalierung }
- FindExtrema(x, n, xscal, xmin, xmax);
- FindExtrema(y, n, yscal, ymin, ymax);
- END;
- 'W': BEGIN
- AngleTrue:=NOT AngleTrue; { Winkeltreue }
- IF AngleTrue THEN
- InfoLine('Winkeltreue', 23, 0, 15)
- ELSE InfoLine('Winkeltreue AUS', 23, 0, 15);
- END;
- 'X': BEGIN { x-Ausdehnung }
- UserUscale:=TRUE; AngleTrue:=FALSE;
- Write('X-Achse minimum: ');
- ClrEol; ReadLn(xmin);
- Write(' maximum: ');
- ClrEol; ReadLn(xmax);
- IF (xscal IN [log,logdown]) AND ((xmin<=0) OR
- (xmax<=0)) OR (xmin=xmax) THEN BEGIN
- Write(#7); FindExtrema(x,n,xscal,xmin,xmax);
- END;
- END;
- 'Y': BEGIN { y-Ausdehnung }
- UserUscale:=TRUE; AngleTrue:=FALSE;
- Write('Y-Achse minimum: ');
- ClrEol; ReadLn(ymin);
- Write(' maximum: ');
- ClrEol; ReadLn(ymax);
- IF (yscal IN [log,logdown]) AND ((ymin<=0) OR
- (ymax<=0)) OR (ymin=ymax) THEN BEGIN
- Write(#7); FindExtrema(y,n,yscal,ymin,ymax);
- END;
- END;
- '-': BEGIN { Verkleinern }
- UserUscale:=TRUE;
- InfoLine('Kurve um 10 % verkleinert',
- 23, 0, 15);
- expand(xmin, xmax, 10, xscal);
- expand(ymin, ymax, 10, yscal);
- END;
- '+': BEGIN { Vergrößern }
- UserUscale:=TRUE;
- InfoLine('Kurve um 10 % vergrossert',
- 23, 0, 15);
- expand(xmin,xmax,-10,xscal);
- expand(ymin,ymax,-10,yscal);
- END;
- END;
- WriteValues;
- UNTIL ESC;
- ESC:=FALSE;
- END;
-
- {----------------------------------------------------------}
- { Histogrammgestützter Meßdateneditor }
- {----------------------------------------------------------}
-
- FUNCTION HistoLine(y: Vektor; ymin, ymax: REAL; i, W: WORD):
- strg80; { Hilfsroutine }
- VAR PosX, PosP, k: INTEGER; S: strg80; { Histogrammzeile }
- BEGIN
- S:=''; {$R-}
- PosX:=Trunc(-ymin/(ymax-ymin)*W+1.5);
- IF PosX>W+1 THEN PosX:=W+1;
- IF PosX<0 THEN PosX:=1;
- PosP:=2;
- IF (ymax-ymin)<>0 THEN
- PosP:=Trunc((y[i]-ymin)/(ymax-ymin)*W+1.5);
- IF y[i]<0 THEN BEGIN
- FOR k:=1 TO PosP-1 DO S:=S+'.';
- FOR k:=PosP TO PosX DO S:=S+Chr(254);
- END;
- IF y[i]>0 THEN BEGIN
- FOR k:=1 TO PosX-1 DO S:=S+'.';
- FOR k:=PosX TO PosP DO S:=S+Chr(254);
- END;
- HistoLine:=S; {$R+}
- END;
-
- PROCEDURE HISTOGRAM(z, x, y: Vektor; n, i1, i2, Nr: WORD);
- VAR i: WORD; h: Vektor; hmin, hmax: REAL; S: strg80;
- BEGIN { Histogrammseite }
- CASE Nr OF
- 1: h:=z;
- 2: h:=x;
- 3: h:=y;
- END;
- extrema(h, n, hmin, hmax);
- IF Abs(hmax-hmin)<1E-8 THEN BEGIN
- hmin:=hmin*0.9; hmax:=hmax*1.1;
- END;
- FOR i:=i1 TO i2 DO BEGIN
- S:=HistoLine(h, hmin, hmax, i, 46); ClrEol;
- WriteLn(i:3, ' ', FORMAT(z[i],8), ' ', FORMAT(x[i],8),
- ' ', FORMAT(y[i],8),' ',S);
- END;
- END;
-
- PROCEDURE QSORT3(VAR x, y, z: Vektor; n: WORD); {$R-,S-}
- PROCEDURE sort(l, r: INTEGER);
- VAR i, j: INTEGER; h, g: REAL;
- BEGIN
- i:=l; j:=r; g:=x[(l+r) DIV 2];
- REPEAT
- WHILE x[i]<g DO i:=Succ(i);
- WHILE g<x[j] DO j:=Pred(j);
- IF i<=j THEN BEGIN
- h:=x[i]; x[i]:=x[j]; x[j]:=h;
- h:=y[i]; y[i]:=y[j]; y[j]:=h;
- h:=z[i]; z[i]:=z[j]; z[j]:=h;
- i:=Succ(i); j:=Pred(j);
- END;
- UNTIL i>j;
- IF l<j THEN sort(l, j);
- IF i<r THEN sort(i, r);
- END;
-
- BEGIN
- sort(1, n);
- END; {$R+,S+}
-
- PROCEDURE QSORT3DOWN(VAR x, y, z: Vektor; n: WORD); {$R-,S-}
- PROCEDURE sort(l, r: INTEGER);
- VAR i, j: INTEGER; h, g: REAL;
- BEGIN
- i:=l; j:=r; g:=x[(l+r) DIV 2];
- REPEAT
- WHILE x[i]>g DO i:=Succ(i);
- WHILE g>x[j] DO j:=Pred(j);
- IF i<=j THEN BEGIN
- h:=x[i]; x[i]:=x[j]; x[j]:=h;
- h:=y[i]; y[i]:=y[j]; y[j]:=h;
- h:=z[i]; z[i]:=z[j]; z[j]:=h;
- i:=Succ(i); j:=Pred(j);
- END;
- UNTIL i>j;
- IF l<j THEN sort(l, j);
- IF i<r THEN sort(i, r);
- END;
- BEGIN
- sort(1, n);
- END; {$R+,S+}
-
- PROCEDURE HISTOGRAMLst(z, x, y: Vektor; n, Nr: WORD;
- Titel1, Titel2, ZTxt, XTxt, YTxt: strg80);
- VAR i: WORD; h: Vektor; hmin, hmax: REAL; S: strg80;
- BEGIN
- {$I-} WriteLn(Lst); {$I+} { Drucker online? }
- IF IOResult<>0 THEN Exit;
- CASE Nr OF
- 1: h:=z;
- 2: h:=x;
- 3: h:=y;
- END;
- WriteLn(Lst, SFORMAT(Titel1,80), #13#10#10);
- WriteLn(Lst, #32#32#32#32, ZTxt, XTxt, YTxt,
- Titel2, #13#10);
- Extrema(h, n, hmin, hmax);
- IF hmin=hmax THEN BEGIN
- hmin:=hmin*0.9; hmax:=hmax*1.1;
- END;
- FOR i:=1 TO n DO BEGIN
- S:=HistoLine(h, hmin, hmax, i, 46);
- WriteLn(Lst, i:3, ' ', FORMAT(z[i],8), ' ',
- FORMAT(x[i],8), ' ', FORMAT(y[i],8), ' ', S);
- END;
- END;
-
- PROCEDURE SMOOTH; { Histogrammgestützer Meßdateneditor }
- VAR
- Line, L, i, YPos: BYTE; Msg: strg80; ch1: CHAR;
- T: ARRAY[1..3] OF STRING[10];
-
- PROCEDURE Normal; { Bildschirmattribute }
- BEGIN
- TextColor(7); TextBackground(0);
- END;
-
- PROCEDURE Invers;
- BEGIN
- TextColor(0); TextBackground(15);
- END;
-
- PROCEDURE Histo(FirstPage: BOOLEAN); { Bildaufbau }
- VAR i1, i2: BYTE;
- BEGIN
- IF FirstPage THEN BEGIN
- L:=1; Line:=1; YPos:=1; Normal; ClrScr;
- END;
- GotoXY(1, 1); Normal;
- i1:=L-YPos+1; i2:=L+(18-YPos);
- WHILE i2>n DO i2:=i2-1;
- HISTOGRAM(z, x, y, n, i1, i2, Nr);
- GotoXY(1, YPos); Invers;
- HISTOGRAM(z, x, y, n, L, L, Nr); GotoXY(1, YPos);
- END;
-
- PROCEDURE Header; { Bediener-Kopf }
- BEGIN
- Normal; ClrScr; InfoLine(Titel1, 2, White, black);
- Msg:='(L)öschen (S)ortieren (Ä)ndern (D)rucken '+
- '(H)isto (E)xakt (ESC) Exit';
- InfoLine(Msg, 3, 0, 15); GotoXY(1, 5); Normal;
- Write(' i ', T[1], T[2], T[3], Titel2);
- Window(1, 6, 80, 24); Histo(TRUE);
- END;
-
- BEGIN
- T[1]:=SFORMAT(ZTxt, 9); T[2]:=SFORMAT(XTxt, 9);
- T[3]:=SFORMAT(YTxt, 9);
- Header;
- REPEAT
- Inkey;
- IF Up THEN BEGIN { Zeile nach oben }
- IF L>1 THEN BEGIN
- Normal; HISTOGRAM(z, x, y, n, L, L, Nr);
- L:=L-1; Line:=Line-1;
- IF Line<1 THEN BEGIN
- Line:=1; GotoXY(1, 1); InsLine;
- END;
- GotoXY(1, Line); Invers;
- HISTOGRAM(z, x, y, n, L, L, Nr);
- GotoXY(1, Line);
- END;
- END;
- IF Down THEN BEGIN { Zeile nach unten }
- IF L<n THEN BEGIN
- Normal; HISTOGRAM(z, x, y, n, L, L, Nr);
- L:=L+1; Line:=Line+1;
- IF Line>=18 THEN BEGIN
- Line:=18; WriteLn;
- END;
- GotoXY(1, Line); Invers;
- HISTOGRAM(z, x, y, n, L, L, Nr);
- GotoXY(1, Line);
- END;
- END;
- CASE ch OF
- 'S': BEGIN { Sortieren }
- YPos:=WhereY;
- Msg:='Sortieren nach (1) '+T[1]+' (2) '+T[2]+
- ' (3) '+T[3];
- InfoLine(Msg, 19, black, White);
- Inkey; ch1:=ch;
- Msg:='Sortieren (1) aufsteigend (2) absteigend';
- InfoLine(Msg, 19, black, White); Inkey;
- IF ch='2' THEN ch:=Chr(Ord(ch1)+3) ELSE
- ch:=ch1;
- CASE ch OF
- '1': BEGIN QSort3(z, x, y, n);
- Histo(TRUE); END;
- '2': BEGIN QSort3(x, z, y, n);
- Histo(TRUE); END;
- '3': BEGIN QSort3(y, z, x, n);
- Histo(TRUE); END;
- '4': BEGIN QSort3Down(z, x, y, n);
- Histo(TRUE); END;
- '5': BEGIN QSort3Down(x, z, y, n);
- Histo(TRUE); END;
- '6': BEGIN QSort3Down(y, z, x, n);
- Histo(TRUE); END;
- ELSE
- BEGIN DelLine; GotoXY(1, YPos); END;
- END;
- END;
- 'H': BEGIN { Auftragungsart }
- YPos:=WhereY;
- Msg:='Zeichne (1) '+T[1]+' (2) '+T[2]+
- ' (3) '+T[3];
- InfoLine(Msg, 19, black, White);
- Inkey;
- CASE ch OF
- '1': BEGIN Nr:=1; Header; END;
- '2': BEGIN Nr:=2; Header; END;
- '3': BEGIN Nr:=3; Header; END;
- ELSE BEGIN DelLine; GotoXY(1,YPos); END;
- END;
- END;
- 'L': BEGIN { Löschen }
- YPos:=WhereY;
- IF n>3 THEN BEGIN
- FOR i:=L+1 TO n DO BEGIN
- z[i-1]:=z[i]; x[i-1]:=x[i]; y[i-1]:=y[i];
- END;
- n:=Pred(n); DelLine;
- IF L<=n THEN Histo(FALSE) ELSE Histo(TRUE);
- END;
- END;
- 'ä': BEGIN { Ändern }
- YPos:=WhereY; Invers; GotoXY(1, 17);
- Write(T[1],'= '); ClrEol; ReadLn(z[L]);
- Write(T[2],'= '); ClrEol; ReadLn(x[L]);
- Write(T[3],'= '); ClrEol; ReadLn(y[L]);
- Histo(TRUE);
- END;
- 'E': BEGIN { Genauer Wert }
- YPos:=WhereY; Invers; GotoXY(1, 17);
- ClrEol; WriteLn(T[1], ' = ', z[L]);
- ClrEol; WriteLn(T[2], ' = ', x[L]);
- ClrEol; Write(T[3], ' = ', y[L]);
- Write(' Weiter mit RETURN'); Inkey;
- Histo(TRUE);
- END;
- 'D': HISTOGRAMLst(z, x, y, n, Nr, Titel1, Titel2,
- T[1], T[2], T[3]);
- END;
- UNTIL ESC;
- END;
-
- {----------------------------------------------------------}
- { Hauptprogramm: Anwendungsbeispiele }
- {----------------------------------------------------------}
-
- BEGIN
- Geraet:=Bildschirm;
- Randomize;
- a:=-2*Pi; b:=2*Pi; n:=100; { Datensatz erzeugen }
- FOR i:=1 TO n DO BEGIN
- x[i]:=(i-1)*(b-a)/n+a;
- y[i]:=Sin(1.5*x[i])+2*Cos(2.5*x[i])-0.5;
- x[i]:=x[i]*(1.0+0.05*Random); { Rauschen }
- y[i]:=y[i]*(1.0+0.2*Random);
- z[i]:=Sqrt(x[i]*x[i]+y[i]*y[i]);
- END;
- DataEditor(x, y, z, n, 'A', 'B', 'Betrag', linear,
- linear, TRUE);
- DataEditor(x, y, z, n, 'x [ppm]', 'y-Signal', 'z', linear,
- log, FALSE);
- SMOOTH(x, y, z, n, 2,
- 'Histogrammgestützer Meßdateneditor',
- 'y = f(x)', 'x', 'y', 'z');
- ClrScr;
- END.
-
-