Programmfragment

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Programmfragment

Beitrag von heizkoerper »

Hallo Lazarusfreunde,

ich möchte ein Programmfragment veröffentlichen, mit welchem alle
Möglichkeiten der Berechnungen von m-Werten bei n-möglichen
Eingabewerten bestehen.

Ein gutes Beispiel ist die Dreiecksberechnung. Hierbei werden in der
Regel drei Werte von maximal 6 Werten (3 Winkel und 3 Seitenlängen)
zur Berechnung benötigt. Es bestehen somit sehr viele Möglichkeiten
der Dateneingabe.

Ich selber habe schon viele Programme mit dieser Methode entwickelt.

Und nun zum Programmstart:

Als erstes werden folgende Konstanten und Variablen definiert:

Const Min =frei wählbar; Minimaler Eingabewert
Max =frei wählbar; Maximaler Eingabewert
DurchlaufMax =n; Maximale Berechnungsdurchläufe
MinWerte =m; Mindestens einzugebene Werte
ErgebnisFehler=frei wählbar; Es sollte ein sehr großer Wert sein,
damit ein Fehler erkennbar ist

Var Wert1,Wert2,...WertN :Extended; N-mögliche Eingabewerte
BWert1,BWert2,...BWertN:Boolean; Ist ein Wert bekannt oder berechntet,
erhält er den Wert True
Durchlauf :Byte; Aktueller Berechnungsdurchlauf

Nun folgen Beispielfunktionen, um die möglichen Berechnungen durchzuführen:

Code: Alles auswählen

Function Wert1_von_Wert2_und_Wert3(Wert2,Wert3:Extended):Extended;
Begin Wert1_von_Wert2_und_Wert3:=f(Wert2,Wert3);Wert1:=True End;
.
.
.
Function WertN_von_Wert1_und_Wert3(Wert1,Wert3:Extended):Extended;
Begin WertN_von_Wert1_und_Wert3:=f(Wert1,Wert3);WertN:=True End;


Als erstes werden die Daten wie folgt überprüft:
(Nur die ersten oberen N Eingabewerte werden getestet!)

Code: Alles auswählen

Function Datenkontrolle:Boolean;
 Function StringWert(Wert:String;Min,Max:Extended):Extended;
  Function Komma(Zwischen:String):String;
  Var i:Byte;
  Begin
   For i:=1 To Length(Zwischen) Do If Zwischen[i]=',' Then Zwischen[i]:='.';
   Komma:=Zwischen
  End;
 Var i        :Byte;
       Fehler:Integer;
       Zahl   :Extended;
 Begin
  Val(Komma(Wert),Zahl,Fehler);
  If (Fehler<>0) Or (Zahl<Min) Or (Zahl>Max) Then
   StringWert:=ErgebnisFehler Else StringWert:=Zahl
 End;
Const F='Falscher Eingabewert!';
Var    Zaehler:Byte;
Begin
 Datenkontrolle:=True;Zaehler:=0;
 BWert1:=False;BWert2:=False;...BWertN:=False;
 If (Zaehler<MinWerte) And (EditWert1.Text<>'') Then
  Begin
   Wert1:=StringWert(EditWert1.Text,Min,Max);
   If Wert1<>ErgebnisFehler Then Begin Inc(Zaehler);BWert1:=True End
                                          Else EditWert1.Text:=F
  End;
 .
 .
 .
 If (Zaehler<MinWerte) And (EditWertN.Text<>'') Then
  Begin
   WertN:=StringWert(EditWertN.Text,Min,Max);
   If WertN<>ErgebnisFehler Then Begin Inc(Zaehler);BWertN:=True End
                                          Else EditWertN.Text:=F
  End;
 If Zaehler<>MinWerte Then Datenkontrolle:=False
End;


Bei erfolgreicher Berechnung werden die Daten ausgegeben:

Code: Alles auswählen

Procedure ErgebnisseAusgeben;
Const F='Rechenfehler!';
Begin
 If BWert1 And (Wert1>Min) And (Wert1<Max) Then
  EditWert1.Text:=FloatToStrF(Wert1,ffFixed,18,3)
                                                                     Else EditWert1.Text:=F;
 .
 .
 .
 If BWertN And (WertN>Min) And (WertN<Max) Then
  EditWertN.Text:=FloatToStrF(WertN,ffFixed,18,3)
                                                                      Else EditWertN.Text:=F;
End;


Nun folgen die eigentlichen Berechnungen:

Code: Alles auswählen

Procedure Berechnen;
Begin
 Durchlauf:=0;
 Repeat
  If Not(BWert1) And BWert2 And BWert3 Then Wert1:=Wert1_von_Wert2_und_Wert3(Wert2,Wert3);
  .
  .
  .
  If Not(BWertN) And BWert1 And BWert3 Then WertN:=WertN_von_Wert1_und_Wert3(Wert1,Wert3);
  Inc(Durchlauf)
 Until BWert1 And BWert2...And BWertN Or (Durchlauf=DurchlaufMax)
End;
 
procedure TFormAlkoholtester.ButtonBerechnenClick(Sender:TObject);
begin
 If Datenkontrolle Then Begin Berechnen;ErgebnisseAusgeben End
end;



Ich wünsche viel Spaß bei der Anwendung.


Gruß Heizkoerper
Zuletzt geändert von Lori am Fr 6. Jan 2012, 22:19, insgesamt 1-mal geändert.
Grund: Highlighter

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Programmfragment

Beitrag von MAC »

Danke.
Sehr nutzreich.
Allerdings ein paar fragen:
a) wieso verwendest du byte für i aks Zählervariable, so kann die zahl nur bis 255 sein.
b) wenn der Text mit dem Highlighter makiert ist kann man ihn einfacher lesen
c) du verwendest sehr oft ...
würdest du irgendwo die unit anhängen welche komplett kompipierbar ist so würde ich diese bestimmt verbessern (z.B arrays benutzen) und veröffentlichen.
d) ach ja, ErgebnisFehler ist zwar ne einfache sache, aber sie ist unsauber, eine extra variable für Fehler (boolean) wäre sicherer.

Code: Alles auswählen

Signatur := nil;

heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Re: Programmfragment

Beitrag von heizkoerper »

Hallo MAC,

zu Deinen Fragen:

Die Byte-Variable i reicht, damit können bis zu 255 Eingabedaten bearbeitet werden. Falls nicht, könnte Word benutzt werden.

Mit ... sind z.B. weitere Funktionen gemeint.

Da die Funktionen ein Extended-Ergebnis haben, ist auch die Fehler-Variable ein Extended-Ausdruck.

Anbei ein kleines Lazarus-Anwendungsprogramm.

Viel Spaß beim Ausprobieren.

Bei Fragen oder Problemen bitte melden.

Gruß Heizkoerper
Dateianhänge
main.pas
(6.69 KiB) 84-mal heruntergeladen
Gleichstrom.zip
(127.05 KiB) 94-mal heruntergeladen

Antworten