Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi (evtl. rekursive) schleife (https://www.delphipraxis.net/22692-evtl-rekursive-schleife.html)

eroe 21. Mai 2004 16:25


(evtl. rekursive) schleife
 
Hallo Jungs,

Erstmal zur Schilderung meines Vorhabens : also, ich habe ein StringGrid und möchte die Summe der Zahlenwerte einer Reihe ausrechnen

Delphi-Quellcode:
          for j:=0 to StringGrid1.ColCount do
            summe:=summe+strtoint(StringGrid1.Cells[j,i]);
Soweit kein Problem, jedoch möchte ich dem Anwender jetzt die Möglichkeit geben die x größten Werte NICHT in die Berechnung einzubeziehen (Falls jemand von euch Segler ist, es soll ein RegattaProgramm werden das dem User die Möglichkeit bietet sogenannte Streicher anzugeben, d.h. das jeweils die schlechtesten x Wettfahrten gestrichen werden)
Am liebsten hätte ich das ganze dynamisch, sprich das der Anwender sich aussuchen kann wieviele Streicher es gibt, jedoch komm ich ab mehr als einem Streicher leider nicht mehr richtig klar :(

Könntet ihr mir eventuell ein paar Denkanstöße geben wie ich das - notfalls auch rekursiv, obwohl mir eine itterative Variante lieber wäre - realisieren kann ?

Es grüßt und hofft

eroe :)

bttb930 21. Mai 2004 16:33

Re: (evtl. rekursive) schleife
 
so könnte es gehen
Delphi-Quellcode:
var
  j, summe, anz, minwert: Integer
begin
  summe := 0;
  minwert := 1000000;
  for j := 0 to StringGrid1.ColCount do
    if anz > 0 then
    begin
      dec(anz);
      minwert := min(minwert, StrToInt(StringGrid1.Cells[j,i]);
    end
    else
    if minwert < strtoint(StringGrid1.Cells[j,i]) then
    begin
      summe := summe + minwert;
      minwert := strtoint(StringGrid1.Cells[j,i]);
    end
    else
      summe:=summe+strtoint(StringGrid1.Cells[j,i]);
end;

eroe 21. Mai 2004 16:42

Re: (evtl. rekursive) schleife
 
Hmm .. Würde es dir was ausmachen deinen Code noch zu kommentieren ? Leider sehe ich das Prinzip nicht ganz, und ich würde von der Algorithmik her schon gerne verstehen was ich programmiere ;)

Und was ist dies hier :

Delphi-Quellcode:
min(minwert, StrToInt(StringGrid1.Cells[j,i]);
für eine Funktion ? Ist mir leider gänzlich unbekannt :(

Luckie 21. Mai 2004 16:48

Re: (evtl. rekursive) schleife
 
Zitat:

Zitat von eroe
Und was ist dies hier :

Delphi-Quellcode:
min(minwert, StrToInt(StringGrid1.Cells[j,i]);
für eine Funktion ? Ist mir leider gänzlich unbekannt :(

Delphi Hilfe schon gefunden? :roll:

eroe 21. Mai 2004 16:55

Re: (evtl. rekursive) schleife
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von eroe
Und was ist dies hier :

Delphi-Quellcode:
min(minwert, StrToInt(StringGrid1.Cells[j,i]);
für eine Funktion ? Ist mir leider gänzlich unbekannt :(

Delphi Hilfe schon gefunden? :roll:

Tut mir herzlichst leid, dass ich in einem Moment der geistigen Umnachtung nicht sofort an F1 gedacht hab, sondern wirklich die Dreistigkeit besaß, zu fragen!!
Ich hoffe Euer Hochwürden können mir verzeihen, es tut mir schrecklich leid!
:roll:

bttb930 21. Mai 2004 20:18

Re: (evtl. rekursive) schleife
 
vergiß den code von oben, er funktioniert doch nicht.

dann mußt du wohl mit einem array arbeiten.

eroe 22. Mai 2004 15:46

Re: (evtl. rekursive) schleife
 
Also, ich hab es jetz mittels 2 Arrays probiert, jedoch reagiert er, unabhängig davon wie oft er durchlaufen _soll_, generell so, als solle er nur das schlechteste streichen, sprich die Eingabe des Anwenders scheint ihn schlicht nicht zu interessieren :(

Da ich mit relativ vielen Zählergesteuerten Schleifen arbeite, habe ich den Text mal kommentiert ..

Delphi-Quellcode:
   
    begin
    if StringGrid1.Cells[0,i]='' then      //Sicherheitsabfrage
      exit
    else
      begin
      setlength(gesamt,wettfahrten);       //Anlegen der Arrays
      setlength(hilfe,wettfahrten);
      for n:=2 to StringGrid1.ColCount-3 do
        gesamt[n-2]:=strtoint(StringGrid1.Cells[n,i]);
            //Füllen des Arrays gesamt NUR für den ersten Durchlauf
      for o:=0 to streicher do
            //Streicher = Anzahl x --> Die x schlechtesten Werte streichern
        begin
        groesstes:=gesamt[0];
        summe:=0;
        for j:=low(gesamt) to high(gesamt) do
          begin
          if gesamt[j]>groesstes then
            groesstes:=gesamt[j];          //Der größte Wert wird rausgsucht
          end;
        for k:=low(gesamt) to high(gesamt) do
          begin
          if gesamt[k]<> groesstes then
            hilfe[k]:=gesamt[k];
                //Alle Werte außer dem Größten werden in den Array 'hilfe' geschrieben
          end;
        for l:=low(hilfe) to high(hilfe) do
          summe:=summe+hilfe[l];
                //Die Summe der Zahlen im Array 'hilfe' wird berechnet
        for m:=low(gesamt) to high(gesamt) do
          gesamt[m]:=hilfe[m];
                //Der Array 'gesamt' bekommt die Werte des Arrays 'hilfe', um beim nächsten Durchlauf den schlechtesten Wert schon aussortiert zu haben
        end;
      StringGrid1.Cells[StringGrid1.ColCount-2,i]:=inttostr(summe);
      end;
    end;
ich hoffe ihr könnt mir helfen, oder mir zumindest den einen oder anderen Denkanstoß geben :)


Es grüßt und hofft,

eroe

eroe 23. Mai 2004 11:09

Re: (evtl. rekursive) schleife
 
Hmm .. hat denn niemand ne Idee ?? :(

atreju2oo0 23. Mai 2004 12:18

Re: (evtl. rekursive) schleife
 
Ich weiß ja nicht wie groß dein Stringgrid wird aber so wie ich das sehe würde ich einfach mit Bubblesort ( siehe DP-Hilfe ) alle Werte sortieren und dann die unteren x abschneiden..

eroe 23. Mai 2004 12:28

Re: (evtl. rekursive) schleife
 
Zitat:

Zitat von atreju2oo0
Ich weiß ja nicht wie groß dein Stringgrid wird aber so wie ich das sehe würde ich einfach mit Bubblesort ( siehe DP-Hilfe ) alle Werte sortieren und dann die unteren x abschneiden..

ähm .. LOL :D
Eigentlich is das ne sehr gute Idee, danke !
Man wie ich sowas hasse, tagelang rumzusitzen und die Fehler bei so nem Algorithmus zu suchen und dann zu erfahren, dass es viel einfacher geht ;)
Wie gesagt, danke nochmal, ich werds mal probieren!

Phoenix 23. Mai 2004 13:22

Re: (evtl. rekursive) schleife
 
es geht noch einfacher, und Du kannst dabei bei einem Durchlauf bleiben:

Beim addieren aller Werte merkst Du Dir die aktuelle Zahl in einem weiteren Array vor.
Dieses Array besitzt so viele Elemente, wie man Streicher weghaben will.

Gibts es nun im weiteren Durchlauf eine grössere Zahl, so wird diese dem Array hinzugefügt. Ist das Array voll wird die jeweils kleinste Zahl aus dem Array rausgeworfden.

Am Ende wird nun einfach die Summe aller Zahlen im Array von der Gesamtsumme abgezogen. Damit sind die Streicher a) bekannt (weil im Array) und b) nicht im Endergebnis vorhanden.

UNd man hat sich die sortiereri gespart, weil die kann recht schnell auf die Performance gehen.

eroe 23. Mai 2004 14:59

Re: (evtl. rekursive) schleife
 
Auch ein netter Vorschlag, jedoch bin ich nur soweit gekommen .. Ich kann doch bei 12 Werten nicht alle in einen Array schreiben der nur zB 2 Felder besitzt o_O
Aber ich vermute mal dass ich dich nur falsch verstanden habe, von daher hier mal der Code von mir, so wie ichs verstanden hab :

Delphi-Quellcode:
begin
  summe:=0;
  setlength(array_str,streicher);
  for i:=2 to StringGrid1.ColCount-3 do
    begin
    summe:=summe+strtoint(StringGrid1.Cells[i,1]);
    array_str[i-2]:=strtoint(StringGrid1.Cells[i,1]);
    end;
end;

PS: Die andere Variante läuft jetzt perfekt :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 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