![]() |
Delphi-Version: 5
Delphi Aufgabe - Prämien
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Community,
ich bin seit ungefähr einer Woche neu hier und bin mir nicht sicher, ob ich diesen Beitrag in das richtige Subforum poste. Nun, ich habe seit ungefähr einem halben Jahr Informatikunterricht in der Sekundarstufe II und versuche gelegentlich anhand von Textaufgaben die jewiligen Programme zu programmieren, um dann halt auch außerhalb der Schule fit zu bleiben. Nun habe ich eine Aufgabe gefunden, bei der ich einfach keinen richtigen Ansatz finde. Angefangen habe ich schon, aber ich bezweifle, dass an dem jetzigen Quellcode nichts auszusetzen ist. So, ich poste den hier mal, vllt. könntet ihr mir ja weiterhelfen. Die Aufgabe habe ich als png Datei angehängt. Vielen Dank im Voraus.
Delphi-Quellcode:
Die Aufgabe lautet: Formuliere ein Algorithmus zur Berechnung der prämie und erstellen sie das dazugehörige Pascal-Programm
procedure TForm1.Button1Click(Sender: TObject);
var x:Integer; y:Integer; begin x:=StrToInt(Edit1.Text); If (x <= 3) Then Edit3.Text:='100' Else If (x > 3) and (x < 10) Then Begin y:=100; Case x of 4..9: y:=y*(x-1)+50 // Ich dachte mir, dass man eine Rekursion verwenden kann, indem man immer den vorherigen Wert mit 50 addiert, Umsetzung war aber ein wenig erfloglos :-D end; Edit3.Text:=IntToStr(y); end; |
AW: Delphi Aufgabe - Prämien
Delphi-Quellcode:
Nach meinem Verständnis x < 3, denn der dritte Jahrestag ist bereits das dritte Jahr
If (x <= 3)
Delphi-Quellcode:
Unnötige erste Abfrage. Du hast vorher bereits alle unter 3 Jahren erwischt.
If (x > 3) and (x < 10)
Delphi-Quellcode:
Du hast doch schon abgefragt ob er unter 10 Jahre da ist. Hier noch ein mal?
4..9: y:=y*(x-1)+50
Zitat:
|
AW: Delphi Aufgabe - Prämien
Zitat:
Delphi-Quellcode:
-Abfrage.
If (x <= 3)
Ohne ELSE wäre es so schon richtig. Wobei es auch so nicht unbedingt falsch ist, aber unnötig isses natürlich schon. :angle: Nur von der angesprochenen Rekursion kann ich nirgends was finden. PS: Falls du nett bist, dann könntest du ja in deinem ersten Post noch das [DELPHI]-Tag einbauen. |
AW: Delphi Aufgabe - Prämien
Hausaufgaben: es scheint nur Abfragen in allen Variationen zu geben. Warum nicht mal ein Ego-Shooter als Hausaufgabe?
Delphi-Quellcode:
Obwohl ich weiß nicht ob der Part: y*(x-1)+50 auch richtig ist. Hier werden nach meinem Verständnis die Jahre mal Grundprämie genommen und die Jahresprämie dazu addiert (Punkt vor Strichrechnung).
4..9: y:=y*(x-1)+50
|
AW: Delphi Aufgabe - Prämien
Eigentlich kann man das direkt nach der Textvorgabe herunter programmieren:
Delphi-Quellcode:
Dies ist auch ein gutes Beispiel, warum man Code und Darstellung trennen sollte.
function PraemieBerechnen( Dauer : integer ) : Currency;
begin Result := 0; // Wenn die Dauer kleiner 1 Jahr, dann gibt es nichts, also raus hier :o) // Steht zwar so nicht direkt im Text, kann man aber zwischen den Zeilen lesen if Dauer < 1 then Exit; // Bis zu 10 Jahren gibt es immer mindestens 100,00€ if Dauer <= 10 then begin Result := 100; // bei mehr als 3 Jahren, kommen noch pro Mehr-Jahr 50,00€ hinzu if Dauer > 3 then Result := Result + 50 * ( Dauer - 3 ); end else // mehr als 10 Jahre, für jedes Jahr 60,00€ begin Result := Dauer * 60; // ab 50 Jahren gibt es die Hälfte noch mal oben drauf if Dauer >= 50 then Result := Result + Result / 2; end; end; // Nun der Aufruf über den Button procedure TForm1.Button1Click( Sender : TObject ); var Dauer : integer; Praemie : Currency; begin if TryStrToInt( Edit1.Text, Dauer ) then begin Praemie := PraemieBerechnen( Dauer ); Edit3.Text := FloatToStr( Praemie ); end else ShowMessage( Edit1.Text + ' ist keine gültige Zahl' ); end; Es ist einfach übersichtlicher |
AW: Delphi Aufgabe - Prämien
Du weißt ja, ich denke kompliziert.
Delphi-Quellcode:
type
TPraemie = class private FGrundPraemie: Currency; FJahrPraemie: Currency; //Unter 10 FJahrPreamie10: Currency; FAlter: Word; FBetriebsJahre: Word; function Berechnung: Currency; public property GrundPraemie: Currency read FGrundPraemie; property JahrPraemie: Currency read FJahrPraemie; property JahrPreamie10: Currency read FJahrPreamie10; property Alter: Word read FAlter write FAlter; property BetriebsJahre: Word read FBetriebsJahre write FBetriebsJahre; property Summe: Currency read Berechnung; constructor Create; end; constructor TPraemie.Create; begin inherited; FGrundPraemie := 100; FJahrPraemie := 50; FJahrPreamie10 := 60; end; function TPraemie.Berechnung: Currency; begin if FBetriebsJahre > 0 then begin if FBetriebsJahre <= 3 then Result := FGrundPraemie else begin if FBetriebsJahre <= 10 then Result := FGrundPraemie + ((FBetriebsJahre - 3) * FJahrPraemie) else Result := FBetriebsJahre * FJahrPreamie10; end; if FAlter >= 50 then Result := Result * 1.5; end else Result := 0; end; procedure TForm1.Button2Click(Sender: TObject); var Praemie: TPraemie; begin Praemie := TPraemie.Create; try Praemie.BetriebsJahre := StrToInt( Edit1.Text ); Edit3.Text := FloatToStr( Praemie.Summe ); finally Praemie.Free; end; end; |
AW: Delphi Aufgabe - Prämien
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe es nocheinmal programmiert. Bin mir aber nicht sicher, ob man es so machen kann. ;-)
Die Form habe ich als png datei angehängt !
Delphi-Quellcode:
type
{ TForm1 } TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var Dauer,Alter:Integer; Result:Real; begin Dauer:=StrToInt(Edit1.Text); if (Dauer < 10) then begin Result:=100; if (Dauer > 3) and (Dauer < 10) then Result:=Result + (50 * (Dauer - 3)); end else begin Alter:=StrToInt(Edit2.Text); Result:=Dauer*60; if Alter >= 50 then Result:=Result + (Result / 2); end; if TryStrToInt(Edit1.Text, Dauer) then begin Edit3.Text:=FloatToStr(Result); end; end; end. |
AW: Delphi Aufgabe - Prämien
Hmmm, nun ja, da sind noch überflüssige Sachen drin, die da raus können.
Und laut der Textaufgabe ist da etwas falsch umgesetzt (hatte ich aber auch falsch interpretiert :) )
Delphi-Quellcode:
So funktioniert das, wenn in den beiden Edit-Feldern Eingaben enthalten sind, die auch in Integer umgewandelt werden können.
procedure TForm1.Button1Click(Sender: TObject);
var Dauer, Alter :Integer; Praemie : Real; // ein sprechender Name hilft gegen Verwirrungen :o) begin // erst mal die Werte aus dem Formular holen Dauer := StrToInt( Edit1.Text ); Alter := StrToInt( Edit2.Text ); // Jetzt die Berechnung if ( Dauer < 10 ) then begin Praemie := 100; // Die Abfrage ( Dauer < 10 ) ist nicht falsch, aber überflüssig // da wir dieses ja schon hier sicherstellen if ( Dauer > 3 ) { and ( Dauer < 10 ) } then Praemie := Praemie + ( 50 * ( Dauer - 3 ) ); end else begin Praemie := Dauer * 60; end; if ( Alter >= 50 ) then Praemie := Praemie + ( Praemie / 2 ); // Jetzt das Ergebnis ausgeben Edit3.Text := FloatToStr( Praemie ); end; Um das abzufangen bietet sich ![]() Der entsprechende Teil sähe dann so aus:
Delphi-Quellcode:
// erst mal die Werte aus dem Formular holen
if not TryStrToInt( Edit1.Text, Dauer ) or not TryIntToStr( Edit2.Text, Alter ) then begin // Hinweis ausgeben ShowMessage( 'Keine gültige Eingabe!' ); // Verlassen Exit; end; |
AW: Delphi Aufgabe - Prämien
Delphi-Quellcode:
kann weg.
if TryStrToInt(Edit1.Text, Dauer) then
Dauer wird danach ja nicht mehr benötigt und wenn das vorherrige
Delphi-Quellcode:
Probleme bemerkt hätte, dann wäre die Ausführung sowieso nicht bis dort hin gekommen.
Dauer:=StrToInt(Edit1.Text);
[edit] auf Beitrag 7 bezogen |
AW: Delphi Aufgabe - Prämien
Danke nochmal an alle ! Aber die Leerzeichen im Quellcode setzt man nur wegen der Übesichtlichkeit, oder ? Ich zum Besipiel setze kaum Leerzeichen, sondern versuche nur die übersichtliche Struktur beizubehalten :D , z.B x:=(a*b*c)+d; und nicht x := ( a * b * c ) + d; :P
Hmm... und könntet ihr mir vielleicht sagen, ob es notwendig ist später zum Beispiel als Hobbyprogrammierer selber Klassen zu definieren und zu schreiben oder werden die Klassen reichen, die Delphi oder FreePascal einem vorgeben ? |
AW: Delphi Aufgabe - Prämien
Kommt drauf an, was du alles machen willst.
Eine Klasse stellt eine Sammlung von Methoden und Variablen dar, welche zu einem bestimmten Themenbereich gehören. Ist besser als unzählige globale Variablen und frei rumschwirrende Prozeduren. (deswegen wurde ja OOP erfunden und als Bonus bekommt man die Vererbung gleich mit dazu) Und vorallem für die Trennung von Code und GUI sind diese ganz praktisch. Also im Prinzip wirst du da nicht drumrumkommen. (selbst wenn es ohne ebenfalls ginge) |
AW: Delphi Aufgabe - Prämien
Zitat:
a.) ich bin traurig, dass du keine Klasse geschrieben hast :cry: Ist aber nicht wirklich schlimm ;) b.) Du verwendest den Variablennamen "Result". Ist zwar nicht verboten, aber der hat bei Funktionen eine Bedeutung. Ich würde es wegen einem besseren Verständnis nicht nehmen. Ist aber an dieser Stelle aber nicht wirklich schlimm. c.) Real als Variablentyp. - nach meiner Kenntnis ist der Typ veraltet. Er wird zwar nie verschwinden, bleibt aber wohl nur aus Kompatibilitätsgründen da. Besser ist Double. - Aber auch Double ist hier nicht richtig, da es sich um Währung handelt. Bei kleinen Zahlen fällt das nicht auf, aber wenn ich diesen Rundungsfehler hätte 1,24E8 €, bzw. das was hier durch runden weggefallen ist, wäre ich ein reicher Mann. Für Währungen nimmt man Currency als Typ. Da wird nichts gerundet. d.) über das
Delphi-Quellcode:
brauchen wir nicht groß reden, im Zweifelsfall kommt eine Fehlermeldung.
Dauer:=StrToInt(Edit1.Text);
e.)
Delphi-Quellcode:
Hier bekommt auch der eine Prämie, der lediglich einen Arbeitsvertrag hat. Denn hier bekommen auch die eine Prämie, die 0 Jahre gearbeitet haben.
if (Dauer > 3) and (Dauer < 10) then
f.) Noch besser ist das:
Delphi-Quellcode:
Hier kommen nach e. auch die dran die -3 Jahre gearbeitet haben (wie das gehen soll weiß ich zwar nicht, aber rein rechnerisch ginge es). Dann aber kämen auch die dran, die noch nicht geboren sind ca. -1 Jahr ;) Integer ist gut, Word ist besser, da er keine negativen Werte zulässt.
Dauer,Alter:Integer;
Ist alles nicht so wild wenn keine Fehler bei der Eingabe passieren. Ansonsten gut gemacht :thumb: Zitat:
|
AW: Delphi Aufgabe - Prämien
Zitat:
Das alte Real-Typ ist "verschwunden" und ist inzwischen standardmäßig als Real48 verfügbar. (wurde irgendwann umgestellt ... vor langer Zeit / vor Delphi 7) Der "neue" Real-Typ ist ein dynamischer Typ, wie auch Integer (aktuell NativeInt), Char, PChar und String. Aktuell ist er eine Weiterleitung auf Double. ![]() ![]() ![]() PS: Ein Integer ohne Vorzeichen ist eigentlich ein Cardinal. Integer = signed integer Cardinal = unsigned integer ShortInt - Byte SmallInt - Word LongInt - LongWord Int64/LargeInt - UInt64 Integer - Cardinal |
AW: Delphi Aufgabe - Prämien
So, endlich fertig und hoffentlich richtig :D
Delphi-Quellcode:
Eine Frage habe ich dann doch noch ! :P Wie kann ich dem Programm eigentlich sagen, dass er mir bei Zahlen unter 0 eine Fehlermeldung (ShowMessage oder sowas ;D) ausgeben soll? Also die 3 Edit Felder dürfen keine negativen Zahlen beinhalten und auch nicht vom Programm akzeptiert werden. :P
procedure TForm1.Button1Click(Sender: TObject);
var Dauer, Alter :Word; Praemie :Currency; begin Dauer := StrToInt( Edit1.Text ); Alter := StrToInt( Edit2.Text ); if ( Dauer < 10 ) and ( Dauer > 0 ) then begin Praemie := 100; if ( Dauer > 3 ) then Praemie := Praemie + ( 50 * ( Dauer - 3 ) ); end else begin Praemie := Dauer * 60; end; if ( Alter >= 50 ) then Praemie := Praemie + ( Praemie / 2 ); Edit3.Text := FloatToStr( Praemie ); end; |
AW: Delphi Aufgabe - Prämien
Da gibt es viele Möglichkeiten, aber hier bietet sich StrToIntDef gerade zu an.
Delphi-Quellcode:
Wird etwas falsches angegeben, z.B. Text statt Zahl, bekommt Variable Alter den Wert -1. Und da es mindestens 0 Jahre alt sein muss um in der Firma arbeiten zu dürfen reicht nun eine einfache if Alter > -1 Anfrage. Gibt einer -25 dann ist es auch < 0, also perfekt.
Alter := StrToIntDef(Edit1.Text, -1);
Ansonsten vielleicht etwas genauer:
Delphi-Quellcode:
const
Min = 16; Max = 65; var Alter: Integer; begin Alter := StrToIntDef(Edit1.Text, -1); if (Alter < Min) or (Alter > Max) then ShowMessage('Falsche Alterseingabe') else ShowMessage('Alles klar, der Typ ist ' + IntToStr(Alter) + ' Jahre alt'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz