Autor Beitrag
Masta_Rafa
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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.!

ausblenden volle Höhe Delphi-Quelltext
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:
//Umwandlung der Eingabetexte von einem String in eine Dezimalzahl
  Lagerhöhe    := Strtofloat (EditLagerhoeheEingabe.Text);    //Angabe in Metern
  Regallänge   := Strtofloat (EditRegallaengeEingabe.Text);   //Angabe in Metern
  Palettenlast := Strtofloat (EditPalettenlastEingabe.Text);  //Angabe in Metern
...
...
...
  //Berechnung der Zeilenanzahl
  Zeilenanzahl := trunc((Lagerhöhe - 1)/1.5);                 

  //Berechnung der Spaltenanzahl
  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));

  //Berechnung der Ständerlänge
  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);   

  //Berechnung des Ständergewichts
  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;

//  --> Ab hier taucht das Problem jetzt auf.Der Ständerpreis ist abhängig vom Gewicht.
//  --> Alles bis 400kg kostet 1995€,weil der Preis pro Tonne angegeben ist,0.4
//  --> Alles über 400kg und bis 999kg kostet 1639€ und da gibts Probleme mit, wenn z.B
//  -->fürs Gewicht 0.6Tonnen rauskommen, wählt Delphi nicht 1639€, sondern 1995€ als Preis

  //Zuordnung der Ständerpreise, da der Preis vom errechneten Gewicht abhängig ist
  If (StändergewichtEinePalette <= 0.4) then  Ständerpreis := 1995;   //0,4 stehen für 0,4 Tonnen, da Preis pro Tonne angegeben wird, bis 400kg
  If (StändergewichtEinePalette > 0.4)  and  (StändergewichtEinePalette <= 0.999) then Ständerpreis := 1639;    //
  If (StändergewichtEinePalette >= 1)   then  Ständerpreis := 1426;   //Ständergewicht ab 1000kg

  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;
...
...
...
// --> Der von Delphi gewählte Ständerpreis soll dann hier eingesetzt werden (was auch funktioniert, bis auf 
// --> Die Tatsache, dass er den falschen Wert einsetz)

  //Berechnung der Ständerkosten
  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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Sa 06.09.08 16:03 
Was soll passiere und was passiert statt dessen? :roll: Wirst du mit Fehlermelödungen beworfen? :P

Edit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  if (StändergewichtEinePalette <= 0.4) then
    Ständerpreis := 1995   //0,4 stehen für 0,4 Tonnen, da Preis pro Tonne angegeben wird, bis 400kg
  else
    if (StändergewichtEinePalette > 0.4) and (StändergewichtEinePalette <= 0.999) then
      Ständerpreis := 1639    //
    else
      if (StändergewichtEinePalette >= 1) then
        Ständerpreis := 1426;   //Ständergewicht ab 1000kg


Aber eigentlich ist egal was du da machst, da der Ständerpreis hinterher wieder überschrieben wird. :rofl: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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. :zwinker:
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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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. :zwinker:

ausblenden 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!
ausblenden volle Höhe Delphi-Quelltext
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; // Ganzzahlen
  Gewicht: Extended; // Extended entspricht Real = Fließkommazahl/Fließpunktzahl
begin
  {Ein Array stellt eine Aneinanderkettung n Elemte dar, ersetzt also deine zig einzeln deklarierten Variablen für jede Palettenanzahl!
  In diesem Fall wird ein dyn. Array verwendet, um flexibel auf die Palettenanzahl reagieren zu können.
  Dynamisch ist das Gegenteil von statisch. Bei einem statischen Array werden die Grenzen (Anzahl der Elemente) bereits beim Deklarieren festgelegt. Beispiel: Array[1..10] of Integer;
  Bei einem Dynamischen werden die Grenzen erst im Code via SetLength(Array, Länge) festgelegt. Zu beachten ist, dass ein dynm. Array immer bei 0 beginnt!!
  Result meint hier das, was die Funktion zurückgibt. }

  SetLength(Result, aAnzahl); 

  Zeilen := Trunc((aHoehe - 1) / 1.5);

  // Low ermittelt die untere, High die obere Grenze eines Arrays! 
  for i := Low(result) to High(result) do begin
    Spalte := Trunc(aLaenge / (0.9 * (i+1) + 0.1)); // i+1, da der Index bei 0 beginnt ;-)
    Laenge := Trunc(4 * Spalte * (Zeilen - 1) * 1.5);
    Gewicht  := (Laenge  * 10.9) * 0.001;

  { Result ist die Variable, die die Funktion zurückgibt. Da der Rückgabetyp als Array deklariert wurde, greifen wir mittels Index auf die einzelnen Elemente zu.
    result[3] meint beispielsweise die Variable Nummer 4 in der Liste vom Typ Real! }

   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;

 // Nun kann man Beispielsweise wie folgt die Funktion verwenden:
    Showmessage( FloatToStr( Preis(10,20,5,100)[1] ));
 // Zeigt das Ergebnis für zwei Paletten an.

Erklären konnte ich nie besonders gut. :P Sollten noch Fragen offengeblieben sein, sollten sich diese hoffentlich mit Hilfe des Tutorial vom user profile iconChristian beantworten lassen.

user profile iconMasta_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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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. :zwinker:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 07.09.08 21:18 
Hallo,

Habs jetzt anders hinbekommen. Jetzt funktioniert alles.

Anstatt

ausblenden 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

ausblenden 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