| Autor |
Beitrag |
Masta_Rafa
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 06.09.08 15:26
Hallo an alle!
Ich hab nicht viel Ahnung vom Programmieren. Aber jetzt habe ich die Aufgabe, als Hausarbeit ein Palettenlager zu Programmieren.Jedoch tritt ein Problem bei meinem Programm auf. Das Problem taucht bei den If- Bedingungen auf.Keine Angst, hab hier nur einen
größeren Teil des Quellcodes dargestellt damit mögliche Fehler, die schon im Vorraus passiert sein können, auch entdeckt
werden. Der Teil wo der Fehler auftritt ist nur sehr kurz.!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| Lagerhöhe := Strtofloat (EditLagerhoeheEingabe.Text); Regallänge := Strtofloat (EditRegallaengeEingabe.Text); Palettenlast := Strtofloat (EditPalettenlastEingabe.Text); ... ... ... Zeilenanzahl := trunc((Lagerhöhe - 1)/1.5);
SpaltenanzahlEinePalette := trunc(Regallänge/((0.9 * 1) + 0.1)); SpaltenanzahlZweiPaletten := trunc(Regallänge/((0.9 * 2) + 0.1)); SpaltenanzahlDreiPaletten := trunc(Regallänge/((0.9 * 3) + 0.1)); SpaltenanzahlVierPaletten := trunc(Regallänge/((0.9 * 4) + 0.1)); SpaltenanzahlFünfPaletten := trunc(Regallänge/((0.9 * 5) + 0.1)); SpaltenanzahlSechsPaletten := trunc(Regallänge/((0.9 * 6) + 0.1));
StänderlängeEinePalette := (4 * SpaltenanzahlEinePalette * (Zeilenanzahl - 1) * 1.5); StänderlängeZweiPaletten := (4 * SpaltenanzahlZweiPaletten * (Zeilenanzahl -1) * 1.5); StänderlängeDreiPaletten := (4 * SpaltenanzahlDreiPaletten * (Zeilenanzahl -1) * 1.5); StänderlängeVierPaletten := (4 * SpaltenanzahlVierPaletten * (Zeilenanzahl -1) * 1.5); StänderlängeFünfPaletten := (4 * SpaltenanzahlFünfPaletten * (Zeilenanzahl -1) * 1.5); StänderlängeSechsPaletten := (4 * SpaltenanzahlSechsPaletten * (Zeilenanzahl -1) * 1.5);
StändergewichtEinePalette := (StänderlängeEinePalette * 10.9) * 0.001; StändergewichtZweiPaletten := (StänderlängeZweiPaletten * 10.9) * 0.001; StändergewichtDreiPaletten := (StänderlängeDreiPaletten * 10.9) * 0.001; StändergewichtVierPaletten := (StänderlängeVierPaletten * 10.9) * 0.001; StändergewichtFünfPaletten := (StänderlängeFünfPaletten * 10.9) * 0.001; StändergewichtSechsPaletten := (StänderlängeSechsPaletten * 10.9) * 0.001;
If (StändergewichtEinePalette <= 0.4) then Ständerpreis := 1995; If (StändergewichtEinePalette > 0.4) and (StändergewichtEinePalette <= 0.999) then Ständerpreis := 1639; If (StändergewichtEinePalette >= 1) then Ständerpreis := 1426; If (StändergewichtZweiPaletten <= 0.4) then Ständerpreis := 1995; If (StändergewichtZweiPaletten > 0.4) and (StändergewichtZweiPaletten <= 0.999) then Ständerpreis := 1639; If (StändergewichtZweiPaletten >= 1) then Ständerpreis := 1426; ... ... ...
StänderkostenEinePalette := (StändergewichtEinePalette * Ständerpreis); StänderkostenZweiPaletten := (StändergewichtZweiPaletten * Ständerpreis); StänderkostenDreiPaletten := (StändergewichtDreiPaletten * Ständerpreis); StänderkostenVierPaletten := (StändergewichtVierPaletten * Ständerpreis); StänderkostenFünfPaletten := (StändergewichtFünfPaletten * Ständerpreis); StänderkostenSechsPaletten := (StändergewichtSechsPaletten * Ständerpreis); |
Hoffe ihr könnt mir da weiter helfen und es ist verstädnlich was ich meine.
Danke schon mal im Vorraus!
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Sa 06.09.08 16:03
Was soll passiere und was passiert statt dessen? Wirst du mit Fehlermelödungen beworfen?
Edit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (StändergewichtEinePalette <= 0.4) then Ständerpreis := 1995 else if (StändergewichtEinePalette > 0.4) and (StändergewichtEinePalette <= 0.999) then Ständerpreis := 1639 else if (StändergewichtEinePalette >= 1) then Ständerpreis := 1426; |
Aber eigentlich ist egal was du da machst, da der Ständerpreis hinterher wieder überschrieben wird.  Du brauchst also für jeden Ständer einen eigenen Preis.
PS: Du studierst nicht zufällig Produktionswirtschaft oder sowas?
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Masta_Rafa 
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 06.09.08 17:06
danke für die hilfe!
werd es bald versuchen!
ich studier transportwesen und logistik!
darunter fällt dann auch, dass man was vom programmieren versteht, naja aber wenn man es nur 3 monate hat, und das noch ein mal in der woche, dann lernt man nicht gleich alles
also danke noch einmal
lg
--- Moderiert von Narses: Beiträge zusammengefasst---
Also es ändert leider nichts...
noch mal ums kurz zu erklären...
Das Programm berechnet zunächst, wie groß das Gewicht von einer bis 6 Paletten ist
Ist das Gewicht einer dieser Paletten bis 0,4t, so betragen die Ständerkosten 1995€
Ist das Gewicht größer als 0,4t aber kleiner als 0,999t, so betragen die Ständerkosten 1639€
Ist das Gewicht größer als 1t, so betragen die Ständerkosten 1426€.
Damit ich aber nicht eine Formel tausend mal eingeben muss, wollte ich mir die arbeit bisschen erleichtern, indem ich mir
gedacht hab, dass Delphi nach der Ermittlung des Gewichts entscheidet, was für ein Preis zugeordnet wird, also 1995€ oder 1639€ oder 1426€ und dieser Preis danach in eine allgemein formulierte Gelichung eingesetzt wird...
Deswegen dann die Formel
StänderkostenEinePalette := (StändergewichtEinePalette * Ständerpreis);
...
...
...
...
StänderkostenSechsPaletten := (StändergewichtSechsPaletten * Ständerpreis);
wobei Delphi dann natürlich den richtigen Ständerpreis einsetzten sollte. Beim Programm funktioniert bis jetzt alles, bis auf dieser Teil. So ordnet Delphi zb beim Gewicht von 0,6t einen Preis von 1995€ zu, obwohl dieser nach den Bedingungen bei 1639€ liegen müsste...
Wäre für jede Hilfe dankbar!
mfg
|
|
Mike19
      
Beiträge: 256
Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
|
Verfasst: Sa 06.09.08 18:15
Hallo,
hast Du mal mit Einzelschrittausführung die Werte, mit welchen er rechnet überprüft ?
Dann müsstest Du doch sehen, wo die falschen Werte entstehen.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 06.09.08 18:41
Irgnedetwas stimmt wohl an deiner Formel nicht. Wenn du das ganze allerdings dynamisch gestalten willst, ginge das auch so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| Type PreisList = Array of Real;
function Preis(aAnzahl, aHoehe, aLaenge, aLast: Integer): PreisList; var i: integer; Zeilen, Laenge, Spalte, Gewicht: extended; begin; SetLength(Result, aAnzahl);
Zeilen := (aHoehe - 1) / 1.5;
for i := low(result) to high(result) do begin Spalte := (aLaenge / (0.9 * (i+1) + 0.1)); Laenge := (4 * Spalte * (Zeilen - 1) * 1.5); Gewicht := (Laenge * 10.9) * 0.001;
if (Gewicht < 0.4) then result[i] := 1995 * Gewicht else if (Gewicht > 0.4) and (Gewicht <= 0.999) then result[i] := 1639 * Gewicht else if (Gewicht >= 1) then result[i] := 1426 * Gewicht;
end; end;
meinpreis := Preis(10, 5, 5, 100)[6] |
Mit Sicherheit lässt sich das noch optimieren. Der Unterschied zu deiner Version besteht im wesentlichen darin, dass ich Arrays verwende.
Sollte eigentlich so stimmen, wenn ich mich auf die Schnelle nicht vertan habe.
Grüße,
Marc.
Zuletzt bearbeitet von Marc. am Sa 06.09.08 19:20, insgesamt 9-mal bearbeitet
|
|
Masta_Rafa 
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 06.09.08 18:42
Ja hab ich, wie oben geschrieben weiß ich auch wo der Fehler auftritt,
nämlich dass er einen falschen Preis nimmt, er scheint die zweite If- Anweisung nicht zu befolgen (zwischen 400 und 999kg)
da er ja 600kg zu der falsche If-Anweisung zuordnet, und da liegt der Fehler.
Leider weiß ich aber nicht warum.
Lg
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Sa 06.09.08 19:01
Hast du in den Projektoptionen "Boolsche Ausdrücke vollständig auswerten" aktiviert? Sonst wird deine If () and () then Abfrage schon vor dem and beendet wenn der Teilausdruck true ist. Oder schreib es so: If (() and ()) then. So werden auch beide Ausdrücke ausgewertet.
cu Delphi10
_________________ Salus populi suprema lex esto
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 06.09.08 19:03
Es könnte aber auch am Datentyp real liegen. Nicht alle Dezimalzahlen lassen sich korrekt in Binär darstellen.
Hast Du meinen obigen Code einmal ausprobiert? Ich würde gerne einmal wissen, ober er wenigstens richtige Werte liefert. Könnte aber auch sein, dass die Formel wirklich nur mit gerundeten Zahlen funktioniert, wäre dann entsprechend anzupassen.
cu
Marc
|
|
Masta_Rafa 
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 06.09.08 20:15
@ Marc
Das Problem ist, dass der Professor mit uns jede einzelne Zeile durchgeht und uns befragt, deswegen wäre es vom
Vorteil wenn alles so einfach wie möglich ist. Da ich nur wenig Delphi Erfahrung und auch Verständnis habe, wäre es für
mich sehr schwer, all das von dir aufgezeichnete zu erklären. Danke aber für deine Mühe. Damit deine Arbeit nicht umsonst war, hier ein paar Werte die herauskommen müssen. (Alles vorher schriftlich berechnet und auch richtig)
Eingabewerte:
Regallänge= 20m
Lagerhöhe= 5m
Palettenlast= 100kg
Errechneten Werte (Ausgabewerte):
Ständergewicht Ständerkosten
Eine Palette: 1,308t 1865,21€
Zwei Paletten: 0,654t 1071,91€
Drei Paletten: 0,4578 750,33€
Vier Paletten: 0,327t 652,36€
Fünf Paletten: 0,262t 521,89€
Sechs Platten: 0,196t 391,42€
Da ich nicht genau weiß wie ich deine Formel umsetzten sollte, schick ich dir die Werte. Wenn Lust und Zeit besteht, kannst dus gerne ausprobieren!
@ delphi 10
Habe es so wie du sagtest umgestellt, und auch die Klammersetzung nach deiner Vorgabe angewendet. Ergebnis: Alles wie vorher, Werte falsch. Schade ....
@ all
Danke an alle, ich finds echt klasse dass ihr euch solche Mühe macht um mir zu helfen! Bin euch sehr dankbar!!!
Lg
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 06.09.08 20:52
Damit funktioniert mein Code einwandfrei. Ich hab mir nochmal die Mühe gemacht alles auszukommentieren und zu erklären. Ist wirklich nicht allzu schwer.
Delphi-Quelltext 1:
| Function Name(Paramter1,Parameter2,...,Paramter3: Typ1; Parameter4, Paramter5: Typ2): Rückgabetyp; |
Als Rückgabetyp einer Funktion lässt Delphi Array of XYZ leider nicht zu, daher muss ein eigener Typ her, in diesem Fall TPreisList!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| type TPreisList = Array of Real;
function Preis(aAnzahl, aLaenge,aHoehe, aLast: Integer): TPreisList; var i, Zeilen, Laenge, Spalte: Integer; Gewicht: Extended; begin SetLength(Result, aAnzahl);
Zeilen := Trunc((aHoehe - 1) / 1.5);
for i := Low(result) to High(result) do begin Spalte := Trunc(aLaenge / (0.9 * (i+1) + 0.1)); Laenge := Trunc(4 * Spalte * (Zeilen - 1) * 1.5); Gewicht := (Laenge * 10.9) * 0.001;
if (Gewicht < 0.4) then result[i] := 1995 * Gewicht else if (Gewicht > 0.4) and (Gewicht <= 0.999) then result[i] := 1639 * Gewicht
else if (Gewicht >= 1) then result[i] := 1426 * Gewicht; end; end;
Showmessage( FloatToStr( Preis(10,20,5,100)[1] )); |
Erklären konnte ich nie besonders gut.  Sollten noch Fragen offengeblieben sein, sollten sich diese hoffentlich mit Hilfe des Tutorial vom Christian beantworten lassen.
Masta_Rafa hat folgendes geschrieben: | Damit ich aber nicht eine Formel tausend mal eingeben muss, wollte ich mir die arbeit bisschen erleichtern, indem ich mir
gedacht hab, dass Delphi nach der Ermittlung des Gewichts entscheidet, was für ein Preis zugeordnet wird, also 1995€ oder 1639€ oder 1426€ und dieser Preis danach in eine allgemein formulierte |
Aus diesem Grunde habe ich das mittels Array + For-Schleife gelöst.
Also, hoffe, dass ich dir etwas weiterhelfen konnte.
Grüße,
Marc
|
|
Masta_Rafa 
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 06.09.08 21:17
Ach ok, vielen Dank!
Das ist wirklich gut erklärt!
Damit ist die Sache wohl endlich erledigt!
Danke an alle die mitgeholfen haben!
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 06.09.08 21:23
Kein Problem, aber denke bitte daran, dass der Code nicht direkt von dir stammt und evtl. der Prof. dies auch nocheinmal selbst prüfen könnte.
Daher weiß ich nicht, ob Strg+C/V allzuviel Sinn macht.
Da du aber nun weißt, wie sowas funktioniert, würde ich dir empfehlen diese Funktion nocheinmal selbst zu tippen. Aber viel verändern kann man da nun wohl nicht. Weiß nicht genau, wie du das nun am besten handelst. 
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: So 07.09.08 11:34
Vielleicht noch einen Hinweis. Auf eine andere Programmstruktur zurückzugreifen, war mir zu einfach. Ich wollte jetzt wissen, warum deine obige If-Abfrage nicht funktionierte. Soweit ich das jetzt sehe, liegt das an der Optimierungsstrategie des Compilers. Wird diese ausgeschaltet, funktioniert die If-Abfrage korrekt. Aber warum da was wegoptimiert wird....????
I don't no. Wenn die Optimierung ausgeschaltet ist, mußte ich einige Male das Programm compilieren um den Effekt zu erreichen.
cu delphi10
_________________ Salus populi suprema lex esto
|
|
Masta_Rafa 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 07.09.08 21:18
Hallo,
Habs jetzt anders hinbekommen. Jetzt funktioniert alles.
Anstatt
Delphi-Quelltext 1: 2: 3:
| If (StändergewichtZweiPaletten <= 0.4) then Ständerpreis := 1995; If (StändergewichtZweiPaletten > 0.4) and (StändergewichtZweiPaletten <= 0.999) then Ständerpreis := 1639; If (StändergewichtZweiPaletten >= 1) then Ständerpreis := 1426; |
habe ich es umgeändert in
Delphi-Quelltext 1: 2: 3:
| If (StändergewichtZweiPaletten <= 0.4) then StänderkostenZweiPaletten := (StändergewichtZweiPaletten * 1995) else If (StändergewichtZweiPaletten > 0.4) and (StändergewichtZweiPaletten <= 0.999) then StänderkostenZweiPaletten := (StändergewichtZweiPaletten * 1639) else If (StändergewichtZweiPaletten >= 1) then StänderkostenZweiPaletten := (StändergewichtZweiPaletten * 1426); |
Also danke an alle. Hab jetzt aber eine andere Frage
Zum Schluss bekomme ich 6 varianten für die Gesamtkosten raus
GesamtkostenEinePalette
GesamtkostenZweiPaletten
GesamtkostenDreiPaletten
GesamtkostenVierPaletten
GesamtkostenFünfPaletten
GesamtkostenSechsPaletten
Jedoch soll von den 6 Gesamtkostenvarianten nur die jenige mit den minimalen Kosten in einem Edit Feld angezeigt werden.
Frage: Wie bekomme ich dies hin
1.entweder über If- Anweisungen
2.oder Arrays
Ich danke euch
lg
|
|
|