home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* BESTWERT.MOD *)
- (* Programm zur Ermittlung von Ausgleichskurven nach dem *)
- (* Gaußschen Prinzip *)
- (* Compiler: Fitted Modula-2 Version 2.0a *)
- (* (c) 1991 Jens Rohloff & TOOLBOX *)
- (* ------------------------------------------------------ *)
- MODULE Bestwertkurve;
-
- IMPORT RealInOut;
-
- FROM RealConversions IMPORT LongRealToString;
- FROM InOut IMPORT WriteLine, WriteString,
- WriteCard, WriteLn, Read,
- ReadCard, Done;
- FROM Windows IMPORT Window, OpenWindow, CloseWindow,
- SelectWindow;
- FROM Menu IMPORT PopMenu;
- FROM Display IMPORT SetCursorPosition, line0, col0,
- lineN, colN, ClrEOS;
- FROM Info IMPORT Information;
-
- CONST
- max = 15; (* Konstante für maximale Datenfeldgröße *)
-
- TYPE
- Daten = ARRAY [1..max] OF LONGREAL; (* Datenfeldtyp *)
-
- VAR
- Xdaten, Ydaten : Daten; (* Felder für die Daten *)
- Titel, In, Aus : Window; (* siehe Module Windows *)
- Ende, Unsin : BOOLEAN; (* für Programmabbruch *)
- n, cmd : CARDINAL; (* zu cmd -> Module Menu*)
- mwert, nwert : LONGREAL; (* Arbeitswerte *)
-
-
- PROCEDURE Einlesen(VAR Xdaten, Ydaten : Daten;
- VAR n : CARDINAL);
- (* Einlesen liest die X- und Y-Meßwerte sowie deren *)
- (* Anzahl ein. *)
- (* Xdaten: Datenfeld für die X-Werte der Meßreihe *)
- (* Ydaten: Datenfeld für die Y-Werte der Meßreihe *)
- (* n : Anzahl der eingegebenen Wertepaare *)
- VAR
- I : CARDINAL;
- BEGIN
- REPEAT
- SetCursorPosition(line0, col0); (* Oben links *)
- ClrEOS;
- WriteString(' Wie viele X-Y Werte ? (max.');
- WriteCard(max, 2);
- WriteString(' ) ');
- ReadCard(n);
- UNTIL(n <= max) AND Done;
- SetCursorPosition(line0, col0); (* Oben links *)
- ClrEOS;
- I := 1;
- FOR I := 1 TO n DO
- REPEAT
- SetCursorPosition(line0+I-1, 2);
- WriteCard(I, 2);
- WriteString('.X-Wert eingeben : ');
- RealInOut.ReadLongReal(Xdaten[I]);
- UNTIL RealInOut.Done;
- WriteString(' ');
- REPEAT
- SetCursorPosition(line0+I-1, 42);
- WriteCard(I, 2);
- WriteString('. Y-Wert eingeben : ');
- RealInOut.ReadLongReal(Ydaten[I]);
- UNTIL RealInOut.Done;
- END;
- END Einlesen;
-
-
- PROCEDURE Amwert(VAR Xdaten, Ydaten : Daten;
- n : CARDINAL;
- VAR Unsin : BOOLEAN) : LONGREAL;
- (* Amwert berechnet Formfaktor für 1.Fkt. Wenn die *)
- (* Anzahl der Datenpaare kleiner als zwei ist, bricht *)
- (* die Prozedur die Bearbeitung ab. *)
- (* Xdaten: X-Werte der Meßreihe *)
- (* Ydaten: Y-Werte der Meßreihe *)
- (* n : Anzahl der Wertepaare *)
- (* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
- (* paare nicht ausreicht *)
- (* Amwert: Formfaktor für die Funktion f(x)= amwert * x *)
- VAR
- a : CHAR;
- I : CARDINAL;
- werta, wertb, m : LONGREAL;
- BEGIN
- werta := 0.0; wertb := 0.0; m := 0.0;
- Unsin := (n < 2); (* Berechnung *)
- IF NOT Unsin THEN
- FOR I := 1 TO n DO
- werta := werta + (Xdaten[I] * Ydaten[I]);
- wertb := wertb + (Xdaten[I] * Xdaten[I]);
- END;
- m := (werta / wertb);
- END;
- RETURN(m);
- END Amwert;
-
-
- PROCEDURE Pwert(VAR Xdaten, Ydaten : Daten;
- n : CARDINAL;
- VAR Unsin : BOOLEAN) : LONGREAL;
- (* Pwert berechnet Formfaktor für 3.Fkt. Wenn die *)
- (* Anzahl der Datenpaare kleiner als drei ist, bricht *)
- (* die Prozedur die Bearbeitung ab. *)
- (* Xdaten: X-Werte der Meßreihe *)
- (* Ydaten: Y-Werte der Meßreihe *)
- (* n : Anzahl der Wertepaare *)
- (* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
- (* paare nicht ausreicht *)
- (* Pwert : Formfaktor für die Funktion f(x)= Pwert * x² *)
- VAR
- I : CARDINAL;
- a : CHAR;
- werta, wertb, P : LONGREAL;
- BEGIN
- werta := 0.0; wertb := 0.0; P := 0.0;
- Unsin := (n < 3);
- IF NOT Unsin THEN
- FOR I := 1 TO n DO
- werta := werta + (Ydaten[I]*Xdaten[I]*Xdaten[I]);
- wertb := wertb + (Xdaten[I]*Xdaten[I]*
- Xdaten[I]*Xdaten[I]);
- END;
- P := (werta / wertb);
- END;
- RETURN(P);
- END Pwert;
-
-
- PROCEDURE mn(VAR Xdaten, Ydaten : Daten;
- n : CARDINAL;
- VAR AParameter, BParameter : LONGREAL;
- VAR Unsin : BOOLEAN);
- (* mn berechnet Formfaktore für 2.Fkt. Wenn die Anzahl *)
- (* der Datenpaare kleiner als zwei ist, bricht die *)
- (* Prozedur die Bearbeitung ab. *)
- (* Xdaten: X-Werte der Meßreihe *)
- (* Ydaten: Y-Werte der Meßreihe *)
- (* n : Anzahl der Wertepaare *)
- (* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
- (* paare nicht ausreicht *)
- (* Aparameter: Werte für die Funktion in der Darstellung*)
- (* Bparameter: f(x)=Aparameter * x + Bparameter *)
- VAR
- I : CARDINAL;
- werta, wertb, wertc, wertd, werte : LONGREAL;
- BEGIN
- werta := 0.0; wertb := 0.0; wertc := 0.0;
- wertd := 0.0; werte := 0.0;
- AParameter := 0.0; BParameter := 0.0;
- Unsin := (n < 3);
- IF NOT Unsin THEN
- FOR I := 1 TO n DO
- werta := werta + (Xdaten[I] * Xdaten[I]);
- wertb := wertb + (Xdaten[I]);
- wertc := wertc + (Ydaten[I] * Xdaten[I]);
- wertd := wertd + (1.0);
- werte := werte + (Ydaten[I]);
- END;
- AParameter := ((wertc*wertd)-(wertb*werte)) /
- ((werta*wertd)-(wertb*wertb));
- BParameter := ((werta*werte)-(wertb*wertc)) /
- ((werta*wertd)-(wertb*wertb));
- END;
- END mn;
-
-
- PROCEDURE Ausgabe(awert, bwert : LONGREAL;
- Schalter : CARDINAL);
- (* Schalter = 1 => Ausgabefunktion f(x) = a1 * x *)
- (* Schalter = 2 => Ausgabefunktion f(x) = a1 * x + a0 *)
- (* Schalter = 3 => Ausgabefunktion f(x) = a2 * x² *)
- VAR
- antwort : CHAR;
- string : ARRAY [0..13] OF CHAR;
- ok : BOOLEAN;
- BEGIN
- SetCursorPosition(line0, 10);
- WriteString(' Ermittelte Funktion : y = ');
- LongRealToString(awert, 4, 13, string, ok);
- IF ok THEN WriteString(string); END;
- IF NOT (Schalter = 3) THEN
- (* Auswahl der richtigen Fkt-darstellung *)
- WriteString(' * x ');
- IF Schalter = 2 THEN
- WriteString('+ ');
- LongRealToString(bwert,4,13,string,ok);
- IF ok THEN WriteString(string); END;
- END;
- ELSE
- WriteString(' * x² ');
- END;
- Read(antwort); (* Warten auf Aktion des Anwenders *)
- SetCursorPosition(lineN, colN);
- END Ausgabe;
-
- BEGIN
- SetCursorPosition(line0, col0);
- OpenWindow(Titel, 0, 0, 3, 79, TRUE,
- ('[ Bestwertkurvengenerator ]'));
- Ende := FALSE;
- REPEAT
- PopMenu(4, 0, "[ Auswahl ]|Form : y=m*x|Form : " +
- "y=m*x+n|Form : y=p*x²|Information |Ende",
- 20, TRUE, cmd);
- IF NOT ((cmd = 4) OR (cmd = 5)) THEN
- OpenWindow(In, 4, 0, 20, 79, TRUE, ('[ Eingabe ]'));
- OpenWindow(Aus, 21, 0, 24, 79, TRUE, ('[ Ausgabe ]'));
- SelectWindow(In, FALSE);
- Einlesen(Xdaten, Ydaten, n);
- SelectWindow(Aus, FALSE);
- CASE cmd OF
- 1: mwert := Amwert(Xdaten, Ydaten, n, Unsin);
- IF NOT Unsin THEN Ausgabe(mwert, 0.0, 1) END
- |
- 2: mn(Xdaten, Ydaten, n, mwert, nwert, Unsin);
- IF NOT Unsin THEN Ausgabe(mwert, nwert, 2) END
- |
- 3: mwert := Pwert(Xdaten, Ydaten, n, Unsin);
- IF NOT Unsin THEN Ausgabe(mwert, 0.0, 3) END;
- END;
- CloseWindow(Aus);
- CloseWindow(In);
- ELSE
- CASE cmd OF
- 4: Information('Bestwert.doc');
- (* Datei mit Hilfetext *)
- ELSE
- Ende := TRUE
- END;
- END;
- UNTIL Ende;
- CloseWindow(Titel);
- END Bestwertkurve.
- (* ------------------------------------------------------ *)
- (* Ende von BESTWERT.MOD *)