AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Berechnungsfehler aus Stringgriddaten

Ein Thema von Hellraizer · begonnen am 5. Jan 2009 · letzter Beitrag vom 6. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Hellraizer

Registriert seit: 18. Dez 2008
Ort: NRW
28 Beiträge
 
Delphi 2007 Professional
 
#1

Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:32
Hallo,
habe ein Problem
ist ne ganz harte nuss

zuerst der Quelltext:

Delphi-Quellcode:
unit Paketdienst1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, math;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Memo1: TMemo;
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.cells[0,0]:='PLZ';
stringgrid1.cells[1,0]:='Gewicht (kg)';
stringgrid1.cells[2,0]:='Länge (cm)';
stringgrid1.cells[3,0]:='Breite (cm)';
stringgrid1.cells[4,0]:='Höhe (cm)';
memo1.Text:='';
end;

procedure TForm1.Button1Click(Sender: TObject);
var z:integer;
begin
randomize;
for z:=1 to 1000 do
begin
  stringgrid1.Cells[0,z]:=formatfloat('00000', randomrange (1000, 99999));
  stringgrid1.Cells[1,z]:=inttostr (randomrange (1, 50));
  stringgrid1.Cells[2,z]:=inttostr (randomrange (1, 120));
  stringgrid1.Cells[3,z]:=inttostr (randomrange (1, 120));
  stringgrid1.Cells[4,z]:=inttostr (randomrange (1, 120));
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var z:integer;
begin
edit1.clear;
edit2.Clear;
for z := 1 to stringgrid1.rowcount - 1 do
stringGrid1.cells[0,z]:=('');
for z := 1 to stringgrid1.rowcount - 1 do
stringGrid1.cells[1,z]:=('');
for z := 1 to stringgrid1.rowcount - 1 do
stringGrid1.cells[2,z]:=('');
for z := 1 to stringgrid1.rowcount - 1 do
stringgrid1.cells[3,z]:=('');
for z := 1 to stringgrid1.rowcount - 1 do
stringGrid1.cells[4,z]:=('');
for z := 1 to stringgrid1.rowcount - 1 do
stringGrid1.cells[5,z]:=('');
memo1.clear;
stringgrid1.row:=1;
stringgrid1.col:=0;
stringgrid1.setfocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
type tdatensatz=record gewicht, volumen:real; pakete, fahrzeuge: integer; end;
var plz: array[0..9] of tdatensatz;
    mg, mv: real;
    pl, p, x: integer; // mg=maximal_gewicht, mv=maximal_volumen, PLZ=PLZGebiet, pl=PLZ(HilfsVar), p=Postleitzahlgebit(HilfsVar), x=Zählvar(HilfsVar)
    g, l, b, h, v:Real; //g=gewicht, l=länge, b=breite, h=höhe, v=volumen


begin
memo1.Clear;
  if (edit1.Text='') or (edit2.text='') then
    begin
     showmessage ('Bitte vollstängige Eingaben');
     exit;
    end;
  if (strtoint(edit1.text)<=0) or (strtoint(edit2.text)<=0) then
    begin
     showmessage ('Bitte vollstängige und korrekte Eingaben');
     exit;
    end;
  for p:=0 to 9 do
   begin
     plz[p].gewicht:=0;
     plz[p].volumen:=0;
     plz[p].fahrzeuge:=0;
     plz[p].pakete:=0;
   end;
  mg:=strtofloatdef(edit1.text,-1)*1000;
  mv:=strtofloatdef(edit2.Text,-1)*1000000;
  if (mg<0) or (mv<0) then
    begin
     showmessage ('Bitte vollstängige und korrekte Eingaben');
     exit;
    end
  else
  begin
   for x:=1 to 1000 do
      begin
       pl:=strtointdef(stringgrid1.Cells[0,x],0);
       g:=strtofloatdef(stringgrid1.Cells[1,x],0);
       l:=strtofloatdef(stringgrid1.Cells[2,x],0);
       b:=strtofloatdef(stringgrid1.Cells[2,x],0);
       h:=strtofloatdef(stringgrid1.Cells[2,x],0);
       v:=h*b*l;
       if (pl>=1000) and (pl<=99999) and (g>0) and (v>0) then
         begin
           p:=pl div 10000;
           plz[p].gewicht:=plz[p].gewicht+g;
           plz[p].volumen:=plz[p].volumen+v;
           plz[p].pakete:=plz[p].pakete+1;
         end;
       end;
   for p:=0 to 9 do
      with plz[p] do
         fahrzeuge:=max (ceil (g/mg), ceil (v/mv));
   for p:=0 to 9 do
      with plz[p] do
         memo1.lines.add ('PLZ-Gebiet'+inttostr(p)+': '+
         inttostr(fahrzeuge)+'Fahrzeug(e), '+
         inttostr(pakete)+' Pakete');
  end
end;





end.



und zwar geht es darum das ich aus dem Stringgrid die Daten entnehme und damit rechne um die Anzahl der benötigten Fahrzeuge pro PLZ-Gebiet
(dabei wird jede PLZ durch 10.000 geteilt und dann durch die anfangsziffer einer gruppe zugeordnet, es gibt als gruppen von 0-9.
die anzahl der fahrzeuge wird definiert durch das volumen der pakete in abhängigkeit zum fahrzeug und dem gewicht der pakete zum fahrzeug.

Ich hoffe es kann wer was damit anfang und mir helfen. is vermutlich nur ein kleiner fehler, aber ich sitze schon stunden dran den zu finden -.-''

LG Kevin
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:37
Was für ein Problem hast du jetzt?

Edit:
Wieso hast du so viele unnötige doppelte Schleifen drin?
Delphi-Quellcode:
Wie z. B. diese:
   for p:=0 to 9 do
      with plz[p] do
         fahrzeuge:=max (ceil (g/mg), ceil (v/mv));
   for p:=0 to 9 do
      with plz[p] do
         memo1.lines.add ('PLZ-Gebiet'+inttostr(p)+': '+
         inttostr(fahrzeuge)+'Fahrzeug(e), '+
         inttostr(pakete)+' Pakete');
Wieso nicht so:
Delphi-Quellcode:
   
for p:=0 to 9 do
  begin
    with plz[p] do
      begin
        fahrzeuge:=max (ceil (g/mg), ceil (v/mv));
        memo1.lines.add (Format('PLZ-Gebiet%d: %d Fahrzeug(e), %dPakete', [p, fahrzeuge, pakete]));
      end;
  end;
(Format eingebaut)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:38
Was funktioniert den genau nicht? Rücke mal alle blocks so ein, dass begin und end auf gelicher Ebene liegen
Markus Kinzler
  Mit Zitat antworten Zitat
Hellraizer

Registriert seit: 18. Dez 2008
Ort: NRW
28 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:45
das problem liegt irgendwo in dieser procedur

procedure TForm1.Button2Click(Sender: TObject);

das problem ist, das er zwar die paket anzahl pro plzgruppe korrekt berechnet, aber nicht wieviele fahrzeuge benötigt werden pro gruppe. Da gibt er immer nur 1 fahrzeug pro gruppe aus.
ich hab die .exe(natürlich virenfrei ) mal drangehängt zur veranschaulichung.
Angehängte Dateien
Dateityp: exe paketdienst_137.exe (471,0 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:51
ist ja ganz klar.
Überleg mal welchen Wert die Variable "fahrzeuge" denn bekommt?
Bei deiner Logik immer den Wert des letzten Schleifendurchgangs.

Ich hab dir oben eine Änderung für diesen Part dargestellt.

[Edit]
Sorry - da war Schmarn!
fahrzeuge gehört ja zu einem Record. Das ist nur sehr schwer ersichtlich.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Hellraizer

Registriert seit: 18. Dez 2008
Ort: NRW
28 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 18:57
ich dachte schon^^
aber woran kann das denn liegen?

[edit] ich hab nochmal die ganze source reingemacht [/edit]
Angehängte Dateien
Dateityp: pas paketdienst1_953.pas (3,8 KB, 2x aufgerufen)
Dateityp: dpr paketdienst_185.dpr (205 Bytes, 2x aufgerufen)
Dateityp: dfm paketdienst1_676.dfm (2,4 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 19:00
Hast du dir schon mal die berechneten Werte von g, mg, v und mv angeschaut?

Trotzdem möcht ich dir nahelegen, dass du die unnötigen Schleifen entfernst
Und nebenbei bemerkt: "Randomize" solltest du nur einmal aufrufen, und das in OnCreate der Form.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Hellraizer

Registriert seit: 18. Dez 2008
Ort: NRW
28 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 19:04
die doppelten/überflüssigen schleifen sind weg. randomize im oncreate.
das problem leider noch da ich bin am verzweifeln
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 19:07
mmh - ich hab mir das mal angeschaut
ich scheint so als schmeisst du die Einheiten total durcheinander.

Z. B. Gewicht - in der StringList als kg angegeben - beim Edit als Tonne angegeben.

du musst nochmal umrechnen - deine Werte bei ceil ergeben irgendwas mit 0,011 (bei einer Beispielberechnung)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Hellraizer

Registriert seit: 18. Dez 2008
Ort: NRW
28 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Berechnungsfehler aus Stringgriddaten

  Alt 5. Jan 2009, 19:11
HIER werden die eingaben aus den edit feldern auf das format der stringgrid.cells gebracht, oder nicht?

Delphi-Quellcode:
  for p:=0 to 9 do
   begin
     plz[p].gewicht:=0;
     plz[p].volumen:=0;
     plz[p].fahrzeuge:=0;
     plz[p].pakete:=0;
   end;
  mg:=strtofloatdef(edit1.text,-1)*1000; // <--- HIER
  mv:=strtofloatdef(edit2.Text,-1)*1000000;
  if (mg<0) or (mv<0) then
    begin

sry wenn mein code bissl unübersichtlich ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz