![]() |
Maximalen Zuwachs bekommen
Hi!!
Ich habe 2 ListBoxen, in einer sind datumsangaben und in einer anderen dazugehörige Werte. Jetzt möchte ich den größten Zuwachs haben. Also: ich möchte zuerst den 1. Wert speichern, dann ale folgenden prüfen, und den größten davon dem 1. wert zuordnen. Dann nimmt man den 2. Wert und sucht den darauf folgenden größsten, usw.. Jeweils vom größten Wert wird der Wert abgezogen, von dem man begonnen hat, so erhält man den Zuwachs. Dann möchte ich den maximalen Zuwachs haben in der Form: von Datumsangabe, Wert bis Datumsangabe, Wert Kann mir jemand dabei helfen? |
Re: Maximalen Zuwachs bekommen
Also, da bin ich auch schon wieder. Jetzt weiß ich was Du willst:
nicht den höchsten Zuwachs, sondern die höchste Differenz zum Startwert. Das ist statistisch was anderes! Nimm wie in der PN beschrieben, den höchsten Wert (2. Spalte!) "Tabelle[nMerker,2]" und ziehe den Startwert "Tabelle[L,2]" ab. Thats it! Das Jahr ist dann Tabelle[nMerker,1]. |
Re: Maximalen Zuwachs bekommen
Das ist es aber nicht, mal ein beispiel:
Die Werte: 5 9 4 8 2 8 6 @Billa ziehe ich den Startwert nun vom höchsten ab, dann hab ich: 9 - 5 = 4 Der größte Zuwachs ist aber 6: 8 - 2 = 6 |
Re: Maximalen Zuwachs bekommen
Genau den Wert findet das erste Beispiel meiner PNs "Tabelle[nMerker,3]". Ich poste mal mein Beispiel, dann kann man ja weiter diskutieren....Vielleicht sehe ich es einfach nicht ?!
Delphi-Quellcode:
Hier noch das dfm
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; const nTabMin = 0; nTabMax = 99; {...reicht für 100 Jahre...} type Tab = array [nTabMin..nTabMax,1..3] of Integer; { ...der Einfachheit halber, es könnten auch andere Typen sein...} type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Button3: TButton; Edit3: TEdit; Edit4: TEdit; StringGrid1: TStringGrid; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Tabelle : Tab; procedure Tabelle_fuellen; procedure Gitter_fuellen; procedure Differenzen_bilden; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Tabelle_fuellen; var nRun : integer; begin for nRun := 0 to 11 do Tabelle [nRun,1] := 1980 + nRun; Tabelle[0,2] := 200; Tabelle[1,2] := 218; Tabelle[2,2] := 220; Tabelle[3,2] := 197; Tabelle[4,2] := 199; Tabelle[5,2] := 207; Tabelle[6,2] := 183; Tabelle[7,2] := 176; Tabelle[8,2] := 176; Tabelle[9,2] := 191; Tabelle[10,2] := 210; Tabelle[11,2] := 204; end; procedure TForm1.Gitter_fuellen; var nCol, nRun : integer; begin for nRun := 0 to 11 do for ncol := 1 to 3 do begin StringGrid1.Cells[nCol-1,nRun] := IntToStr( Tabelle[nRun,nCol] ); end; end; procedure TForm1.Differenzen_bilden; var nRun : integer; begin Tabelle[0,3] := 0; for nRun := 1 to 11 do Tabelle[nRun,3] := Tabelle[nRun,2] - Tabelle[nRun-1,2]; end; procedure TForm1.Button1Click(Sender: TObject); begin Tabelle_fuellen; Differenzen_bilden; Gitter_fuellen; end; procedure TForm1.Button2Click(Sender: TObject); var nMerker, nMax, nRun, L, H, LY, HY : Integer; begin nMax := 0; // fiktives Maximum LY := StrToInt( edit1.Text ); // das Anfangsjahr HY := StrToInt( edit2.Text ); // das Endjahr for nRun := 0 to 11 do begin if Tabelle[nRun,1] = LY then L := nRun; // suche Index zum Jahr if Tabelle[nRun,1] = HY then H := nRun; // suche Index zum Jahr end; for nRun := L to H do // Zeitraum absuchen if Tabelle[nRun,3] > nMax then begin nMax := Tabelle[nRun,3]; // ggf. neues Maximum setzen nMerker := nRun; end; StringGrid1.Row := nMerker; StringGrid1.Col := 3; end; procedure TForm1.Button3Click(Sender: TObject); var nMerker, nMin, nRun, L, H, LY, HY : Integer; begin nMin := 99999; // fiktives Minimum LY := StrToInt( edit3.Text ); // das Anfangsjahr HY := StrToInt( edit4.Text ); // das Endjahr for nRun := 0 to 11 do begin if Tabelle[nRun,1] = LY then L := nRun; // suche Index zum Jahr if Tabelle[nRun,1] = HY then H := nRun; // suche Index zum Jahr end; for nRun := L to H do // Zeitraum absuchen if Tabelle[nRun,3] < nMin then begin nMin := Tabelle[nRun,3]; // ggf. neues Minimum setzen nMerker := nRun; end; StringGrid1.Row := nMerker; StringGrid1.Col := 3; end; end.
Delphi-Quellcode:
Anmerkungen:
object Form1: TForm1
Left = 227 Top = 165 Width = 696 Height = 412 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 24 Top = 256 Width = 137 Height = 25 Caption = 'Differenzen' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 24 Top = 296 Width = 141 Height = 25 Caption = 'Suche größtes Wachstum' TabOrder = 1 OnClick = Button2Click end object Edit1: TEdit Left = 180 Top = 300 Width = 121 Height = 21 TabOrder = 2 Text = '1988' end object Edit2: TEdit Left = 320 Top = 300 Width = 121 Height = 21 TabOrder = 3 Text = '1990' end object Button3: TButton Left = 28 Top = 336 Width = 137 Height = 25 Caption = 'Suche größte Abnahme' TabOrder = 4 OnClick = Button3Click end object Edit3: TEdit Left = 180 Top = 336 Width = 121 Height = 21 TabOrder = 5 Text = '1982' end object Edit4: TEdit Left = 320 Top = 336 Width = 121 Height = 21 TabOrder = 6 Text = '1987' end object StringGrid1: TStringGrid Left = 28 Top = 20 Width = 457 Height = 201 ColCount = 3 DefaultRowHeight = 12 FixedCols = 0 RowCount = 100 FixedRows = 0 TabOrder = 7 end end 1. Button1.Click (Differenzen) immer ausführen 2. das Stringgrid dient nur der Visualisierung: die Werte erhält man durch Referenzierung. Bei Button2.Click - Das Jahr des höchsten Zuwachses Tabelle[nMerker,1] - den höchsten Zuwachs Tabelle[nMerker,3] zwischen den Jahren edit1 und edit2 Bei Button3.Click - Das Jahr der höchsten Abnahme Tabelle[nMerker,1] - die höchste Abnahme Tabelle[nMerker,3] zwischen den Jahren edit3 und edit4 3. Es kommen in dem Minibeispiel keine Bereichs und Gültigkeitsprüfungen vor. Aber das ist ja leicht nachzuholen 4. Die Eingabe der Daten und Datumsfelder kann verfeinert werden. Wie gesagt: ein Schnellschuss.... Gruß Billa |
Re: Maximalen Zuwachs bekommen
*Schwup*
Delphi-Quellcode:
function GroessterZuwachs (werte : Array of Integer) : Integer;
var ndx, zuwachs, maxzuwachs : Integer; begin maxzuwachs := 0; for ndx := Low(werte) + 1 to High (werte) do begin zuwachs := werte [ndx] - werte [ndx-1]; if (zuwachs > maxzuwachs) then begin maxzuwachs := zuwachs; end; end; result := maxzuwachs; end; procedure TForm1.Button1Click(Sender: TObject); var tmp : Array [1..7] Of Integer; begin tmp[1] := 5; tmp[2] := 9; tmp[3] := 4; tmp[4] := 8; tmp[5] := 2; tmp[6] := 8; tmp[7] := 6; Label1.Caption := IntToStr (GroessterZuwachs (tmp)); end; |
Re: Maximalen Zuwachs bekommen
Danke euch beiden!
Das muss ich mir jetzt erst mal genauer anschauen. ;) |
Re: Maximalen Zuwachs bekommen
@Sharky: Genau das meine ich.
Jetzt ist es nur so, dass ich meine Tabelle so hab:
Code:
Jetzt müsste ich die Angabe so haben:
12.04.2003: 5
13.04.2003: 9 14.04.2003: 4 15.04.2003: 8 16.04.2003: 2 17.04.2003: 8 18.04.2003: 6 "Größter Zuwachs von 16.04.2003 - 17.04.2003" D.h. Jedem Datum muss der dazugehörige Wert zugewiesen werden und nachher möchte ich das Datum ausgeben. |
Re: Maximalen Zuwachs bekommen
@Matze: Nix für ungut, aber das hier grenzt an Beschäftigungstherapie. Das war exakt der Inhalt unsérer PNs.
@Sharky: Ist eigentlöich das gleiche, sieht aber zugegebenermassen deutlich eleganter aus! :bounce2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 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