Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sortieren nach Liste (https://www.delphipraxis.net/154958-sortieren-nach-liste.html)

JayAy 3. Okt 2010 04:05

Sortieren nach Liste
 
Hallo zusammen,

ich wollte mir ein Programm basteln, das beim Stimmenauszählen hilft. Leider funktioniert das ganze nicht...
Neben dem Fehler will ich aber auch wissen, wie ich die Namen in der oberen Zeile gleich den sortierten Zahlen entsprechend einordne.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure StringGrid2Click(Sender: TObject);
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StringGrid2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Liste: array[1..100000] of integer;
  ListeMisch: array[1..100000] of integer;
  ListeQuick: array[1..100000] of integer;
  l: integer;
  vertausche,vergleiche,Mischtausch,Mischvergleich: integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i,k: integer;
begin

  For k:= 1 to 64 do
  begin
    For i:= 1 to 35 do
    begin
      stringgrid1.Cells[i,k]:=inttostr(0);
    end;
  end;

  For k:= 1 to 64 do
  begin
    For i:= 1 to 35 do
    begin
      stringgrid2.Cells[i,k]:=inttostr(0);
    end;
  end;

  stringgrid1.cells[0,1]:='Abschreiber/in';
  stringgrid1.cells[0,2]:='Angeber/in';
  stringgrid1.cells[0,3]:='Antisportler/in';
  stringgrid1.cells[0,4]:='Arroganteste/r';
  stringgrid1.cells[0,5]:='Besserwisser/in';
  stringgrid1.cells[0,6]:='beste Frisur';
  stringgrid1.cells[0,7]:='beste/r Schauspieler/in';
  stringgrid1.cells[0,8]:='dümmste Fragen';
  stringgrid1.cells[0,9]:='Bestgelaunteste/r';
  stringgrid1.cells[0,10]:='Clown';
  stringgrid1.cells[0,11]:='Rätsel';
  stringgrid1.cells[0,12]:='Eitelste/r';
  stringgrid1.cells[0,13]:='Millionär/in';
  stringgrid1.cells[0,14]:='Vater/Mutter';
  stringgrid1.cells[0,15]:='Extrovertierteste/r';
  stringgrid1.cells[0,16]:='Faulste/r';
  stringgrid1.cells[0,17]:='Freak';
  stringgrid1.cells[0,18]:='Geizigste/r';
  stringgrid1.cells[0,19]:='Höflichste/r';
  stringgrid1.cells[0,20]:='Infantilste/r';
  stringgrid1.cells[0,21]:='Intelligenzbestie';
  stringgrid1.cells[0,22]:='Interessanteste/r';
  stringgrid1.cells[0,23]:='Lache';
  stringgrid1.cells[0,24]:='Kreativste/r';
  stringgrid1.cells[0,25]:='Lehrerliebling';
  stringgrid1.cells[0,26]:='Lustigste/r';
  stringgrid1.cells[0,27]:='Macho/Tussi';
  stringgrid1.cells[0,28]:='Mr/Ms Fashion';
  stringgrid1.cells[0,29]:='Mr/Ms Max Planck';
  stringgrid1.cells[0,30]:='Mitläufer/in';
  stringgrid1.cells[0,31]:='möchtegern-witzig';
  stringgrid1.cells[0,32]:='Morgenmuffel';
  stringgrid1.cells[0,33]:='nervigste Stimme';
  stringgrid1.cells[0,34]:='Netteste/r';
  stringgrid1.cells[0,35]:='Nikotinopfer';
  stringgrid1.cells[0,36]:='Öko';
  stringgrid1.cells[0,37]:='One-Night';
  stringgrid1.cells[0,38]:='Partyking';
  stringgrid1.cells[0,39]:='Partykotzer/in';
  stringgrid1.cells[0,40]:='politische Ansicht';
  stringgrid1.cells[0,41]:='Schleimer/in';
  stringgrid1.cells[0,42]:='Schnacker/in';
  stringgrid1.cells[0,43]:='Schnapsdrossel';
  stringgrid1.cells[0,44]:='Schnorrer/in';
  stringgrid1.cells[0,45]:='Schönheit';
  stringgrid1.cells[0,46]:='schönstes Lächeln';
  stringgrid1.cells[0,47]:='Schwänzer/in';
  stringgrid1.cells[0,48]:='Sozialste/r';
  stringgrid1.cells[0,49]:='Sportlichste/r';
  stringgrid1.cells[0,50]:='Stimmungskanone';
  stringgrid1.cells[0,51]:='Tollpatsch';
  stringgrid1.cells[0,52]:='Body';
  stringgrid1.cells[0,53]:='Schwiegertraum';
  stringgrid1.cells[0,54]:='Unauffälligste/r';
  stringgrid1.cells[0,55]:='Unselbsständigste/r';
  stringgrid1.cells[0,56]:='Verkehrsrowdy';
  stringgrid1.cells[0,57]:='Verplanteste/r';
  stringgrid1.cells[0,58]:='Verwöhnteste/r';
  stringgrid1.cells[0,59]:='Weichei';
  stringgrid1.cells[0,60]:='Wichtigtuer';
  stringgrid1.cells[0,61]:='Wichtigtuer/in';
  stringgrid1.cells[0,62]:='Zicke';
  stringgrid1.cells[0,63]:='Zuspätkommer/in';
  stringgrid1.cells[0,64]:='Zuverlässigste/r';
  stringgrid1.cells[1,0]:='Anneke';
  stringgrid1.cells[2,0]:='Anh';
  stringgrid1.cells[3,0]:='Annika';
  stringgrid1.cells[4,0]:='Ann-Cathrin';
  stringgrid1.cells[5,0]:='Felicitas';
  stringgrid1.cells[6,0]:='Finja';
  stringgrid1.cells[7,0]:='Hanna';
  stringgrid1.cells[8,0]:='Joana';
  stringgrid1.cells[9,0]:='Johanna';
  stringgrid1.cells[10,0]:='Josephine';
  stringgrid1.cells[11,0]:='Julia E.';
  stringgrid1.cells[12,0]:='Julia M.';
  stringgrid1.cells[13,0]:='Kerrin';
  stringgrid1.cells[14,0]:='Kim';
  stringgrid1.cells[15,0]:='Kira B.';
  stringgrid1.cells[16,0]:='Kira K.';
  stringgrid1.cells[17,0]:='Kristina';
  stringgrid1.cells[18,0]:='Liv';
  stringgrid1.cells[19,0]:='Luise';
  stringgrid1.cells[20,0]:='Marie';
  stringgrid1.cells[21,0]:='Miriam';
  stringgrid1.cells[22,0]:='Mona';
  stringgrid1.cells[23,0]:='Natascha';
  stringgrid1.cells[24,0]:='Pia';
  stringgrid1.cells[25,0]:='Sarah E.';
  stringgrid1.cells[26,0]:='Sarah H.';
  stringgrid1.cells[27,0]:='Sarah T.';
  stringgrid1.cells[28,0]:='Sina G.';
  stringgrid1.cells[29,0]:='Sina N.';
  stringgrid1.cells[30,0]:='Stefanie';
  stringgrid1.cells[31,0]:='Svea';
  stringgrid1.cells[32,0]:='Svenja';
  stringgrid1.cells[33,0]:='Tjorven';
  stringgrid1.cells[34,0]:='Vanessa';
  stringgrid1.cells[35,0]:='Yasmin';
  stringgrid2.cells[0,1]:='Abschreiber/in';
  stringgrid2.cells[0,2]:='Angeber/in';
  stringgrid2.cells[0,3]:='Antisportler/in';
  stringgrid2.cells[0,4]:='Arroganteste/r';
  stringgrid2.cells[0,5]:='Besserwisser/in';
  stringgrid2.cells[0,6]:='beste Frisur';
  stringgrid2.cells[0,7]:='beste/r Schauspieler/in';
  stringgrid2.cells[0,8]:='dümmste Fragen';
  stringgrid2.cells[0,9]:='Bestgelaunteste/r';
  stringgrid2.cells[0,10]:='Clown';
  stringgrid2.cells[0,11]:='Rätsel';
  stringgrid2.cells[0,12]:='Eitelste/r';
  stringgrid2.cells[0,13]:='Millionär/in';
  stringgrid2.cells[0,14]:='Vater/Mutter';
  stringgrid2.cells[0,15]:='Extrovertierteste/r';
  stringgrid2.cells[0,16]:='Faulste/r';
  stringgrid2.cells[0,17]:='Freak';
  stringgrid2.cells[0,18]:='Geizigste/r';
  stringgrid2.cells[0,19]:='Höflichste/r';
  stringgrid2.cells[0,20]:='Infantilste/r';
  stringgrid2.cells[0,21]:='Intelligenzbestie';
  stringgrid2.cells[0,22]:='Interessanteste/r';
  stringgrid2.cells[0,23]:='Lache';
  stringgrid2.cells[0,24]:='Kreativste/r';
  stringgrid2.cells[0,25]:='Lehrerliebling';
  stringgrid2.cells[0,26]:='Lustigste/r';
  stringgrid2.cells[0,27]:='Macho/Tussi';
  stringgrid2.cells[0,28]:='Mr/Ms Fashion';
  stringgrid2.cells[0,29]:='Mr/Ms Max Planck';
  stringgrid2.cells[0,30]:='Mitläufer/in';
  stringgrid2.cells[0,31]:='möchtegern-witzig';
  stringgrid2.cells[0,32]:='Morgenmuffel';
  stringgrid2.cells[0,33]:='nervigste Stimme';
  stringgrid2.cells[0,34]:='Netteste/r';
  stringgrid2.cells[0,35]:='Nikotinopfer';
  stringgrid2.cells[0,36]:='Öko';
  stringgrid2.cells[0,37]:='One-Night';
  stringgrid2.cells[0,38]:='Partyking';
  stringgrid2.cells[0,39]:='Partykotzer/in';
  stringgrid2.cells[0,40]:='politische Ansicht';
  stringgrid2.cells[0,41]:='Schleimer/in';
  stringgrid2.cells[0,42]:='Schnacker/in';
  stringgrid2.cells[0,43]:='Schnapsdrossel';
  stringgrid2.cells[0,44]:='Schnorrer/in';
  stringgrid2.cells[0,45]:='Schönheit';
  stringgrid2.cells[0,46]:='schönstes Lächeln';
  stringgrid2.cells[0,47]:='Schwänzer/in';
  stringgrid2.cells[0,48]:='Sozialste/r';
  stringgrid2.cells[0,49]:='Sportlichste/r';
  stringgrid2.cells[0,50]:='Stimmungskanone';
  stringgrid2.cells[0,51]:='Tollpatsch';
  stringgrid2.cells[0,52]:='Body';
  stringgrid2.cells[0,53]:='Schwiegertraum';
  stringgrid2.cells[0,54]:='Unauffälligste/r';
  stringgrid2.cells[0,55]:='Unselbsständigste/r';
  stringgrid2.cells[0,56]:='Verkehrsrowdy';
  stringgrid2.cells[0,57]:='Verplanteste/r';
  stringgrid2.cells[0,58]:='Verwöhnteste/r';
  stringgrid2.cells[0,59]:='Weichei';
  stringgrid2.cells[0,60]:='Wichtigtuer';
  stringgrid2.cells[0,61]:='Wichtigtuer/in';
  stringgrid2.cells[0,62]:='Zicke';
  stringgrid2.cells[0,63]:='Zuspätkommer/in';
  stringgrid2.cells[0,64]:='Zuverlässigste/r';
  stringgrid2.cells[1,0]:='Alexander';
  stringgrid2.cells[2,0]:='Anil';
  stringgrid2.cells[3,0]:='Arved';
  stringgrid2.cells[4,0]:='Bennet';
  stringgrid2.cells[5,0]:='Daniel W.';
  stringgrid2.cells[6,0]:='Eike';
  stringgrid2.cells[7,0]:='Felix J.';
  stringgrid2.cells[8,0]:='Felix S.';
  stringgrid2.cells[9,0]:='Ferdinand';
  stringgrid2.cells[10,0]:='Florian';
  stringgrid2.cells[11,0]:='Ha';
  stringgrid2.cells[12,0]:='Jan';
  stringgrid2.cells[13,0]:='Jannik F.';
  stringgrid2.cells[14,0]:='Jaseper';
  stringgrid2.cells[15,0]:='Jendrik';
  stringgrid2.cells[16,0]:='Jonas';
  stringgrid2.cells[17,0]:='Konrad';
  stringgrid2.cells[18,0]:='Leewe';
  stringgrid2.cells[19,0]:='Leif';
  stringgrid2.cells[20,0]:='Lorenz';
  stringgrid2.cells[21,0]:='Max K.';
  stringgrid2.cells[22,0]:='Max S.';
  stringgrid2.cells[23,0]:='Michel';
  stringgrid2.cells[24,0]:='Nico';
  stringgrid2.cells[25,0]:='Niklas F.';
  stringgrid2.cells[26,0]:='Niklas H.';
  stringgrid2.cells[27,0]:='Phil';
  stringgrid2.cells[28,0]:='Philip R.';
  stringgrid2.cells[29,0]:='Philip S.';
  stringgrid2.cells[30,0]:='Sergej';
  stringgrid2.cells[31,0]:='Simon';
  stringgrid2.cells[32,0]:='Sören';
  stringgrid2.cells[33,0]:='Steffen';
  stringgrid2.cells[34,0]:='Stephan';
  stringgrid2.cells[35,0]:='Till';
  stringgrid2.cells[36,0]:='Tilmann';
  stringgrid2.cells[37,0]:='Torben';
  stringgrid2.cells[38,0]:='Yannik M.';
  stringgrid2.cells[39,0]:='Yannick Z.';
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var
  xzelle, yzelle :integer;
begin
  xzelle:=StringGrid1.Col;
  yzelle:=StringGrid1.Row;
  stringgrid1.cells[xzelle,yzelle]:=inttostr(strtoint(stringgrid1.cells[xzelle,yzelle])+1);
end;

procedure TForm1.StringGrid2Click(Sender: TObject);
var
  xzelle, yzelle :integer;
begin
  xzelle:=StringGrid2.Col;
  yzelle:=StringGrid2.Row;
  stringgrid2.cells[xzelle,yzelle]:=inttostr(strtoint(stringgrid2.cells[xzelle,yzelle])+1);
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  xzelle, yzelle :integer;
begin
  if Shift = [ssRight] then // nur rechte maustaste
  begin
    xzelle:=StringGrid1.Col;
    yzelle:=StringGrid1.Row;
    stringgrid1.cells[xzelle,yzelle]:=inttostr(strtoint(stringgrid1.cells[xzelle,yzelle])-1);
  end; // if Shift in [ssRight]
end;

procedure TForm1.StringGrid2MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  xzelle, yzelle :integer;
begin
  if Shift = [ssRight] then // nur rechte maustaste
  begin
    xzelle:=StringGrid2.Col;
    yzelle:=StringGrid2.Row;
    stringgrid2.cells[xzelle,yzelle]:=inttostr(strtoint(stringgrid2.cells[xzelle,yzelle])-1);
  end; // if Shift in [ssRight]
end;

Procedure Mischsortieren1 (links,rechts: Integer);
var Endelinks, Anfangrechts:Integer;


  Procedure Mischen1(I, J: integer);
  var
    Z, K: integer;
  begin
    if I < J then
    begin
      Mischvergleich:=Mischvergleich+1;
      if Liste[I] <= Liste[J] then
      begin
        Mischvergleich:=Mischvergleich+1;
        Mischen1(I + 1, J)
      end
      else
      begin
        Z := Liste[J];
        For K := J - 1 downto I do
        begin
          Liste[K + 1] := Liste[K];
          mischtausch:=mischtausch+1;

        end;
        Liste[I] := Z;
        mischtausch:=mischtausch+1;
        if J < rechts then
          begin
          Mischvergleich:=Mischvergleich+1;
          Mischen1(I + 1, J + 1);
          end;
      end;
    end;
  end;

begin
  Endelinks:=trunc((links+rechts)/2);
  Anfangrechts:=Endelinks+1;
  if links<Endelinks then
  begin
    Mischvergleich:=Mischvergleich+1;
    Mischsortieren1(links,Endelinks);
  end;
  if Anfangrechts<rechts then
  begin
    Mischvergleich:=Mischvergleich+1;
    Mischsortieren1(Anfangrechts,rechts);
  end;
  Mischen1(links,Anfangrechts);
end;

  procedure quicksort(erstes, letztes: integer);
    {Sortieren mittels Quicksort}
    var linker_merker, rechter_merker : integer;
    procedure zerlege (var links, rechts: integer);
      var pivot: integer;
      procedure tausche (var x, y: integer);
        var hilf: integer;
        begin
          hilf := x; x := y; y := hilf;
          vertausche := vertausche + 1;
        end; {of vertausche}
      begin {zerlege}
        pivot := ListeQuick[(links + rechts) DIV 2];
        repeat
          while ListeQuick[links] < pivot do begin
            links := links + 1;
            vergleiche := vergleiche + 1;
          end;
          while ListeQuick[rechts] > pivot do begin
            rechts := rechts - 1;
            vergleiche := vergleiche + 1;
          end;
          if links <= rechts then begin
            tausche (ListeQuick[links], ListeQuick[rechts]);
            links := links + 1; rechts := rechts - 1;
            vergleiche := vergleiche + 1;
          end;
        until links > rechts;
      end;{of zerlege}
    begin {quicksort}
      linker_merker := erstes; rechter_merker := letztes;
      zerlege (linker_merker, rechter_merker);
      if erstes < rechter_merker then
        quicksort (erstes, rechter_merker); {Rekursiver Selbstaufruf!}
      if linker_merker < letztes then
        quicksort (linker_merker, letztes); {Rekursiver Selbstaufruf!}
    end; {of quicksort}

procedure TForm1.Button1Click(Sender: TObject);
var q: integer;

begin
  For q:= 1 to 35 do
  begin
    For l:= 1 to 64 do
      begin
        Liste[l]:=strtoint(stringgrid1.cells[q+1,l]);
      end;
    Mischsortieren1(1,64);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var q: integer;

begin
  For q:= 1 to 35 do
  begin
    For l:= 1 to 64 do
      begin
        Liste[l]:=strtoint(stringgrid2.cells[q+1,l]);
      end;
    Mischsortieren1(1,64);
  end;
end;

end.
Danke für die Antworten!

Medium 3. Okt 2010 04:24

AW: Sortieren nach Liste
 
Zitat:

Leider funktioniert das ganze nicht...
Prima prima. Fehlermeldung? Was sollte passieren? Was passiert statt dessen? Ein paar Worte zur Funktionsweise? (Nicht jeder mag Semantik aus 5-6 Bildschirmseiten Code erknobeln.) Immer wieder das gleiche: LERNT FRAGEN verdammt noch mal! Sobald Gedankenlesen täglich Brot wird, ist's okay. Bis da hin ist mit "funktioniert nicht" einfach nichts erreicht. Insbesondere unter deiner zweiten Frage kann man sich mit den Bröckchen echt nicht viel vorstellen. Wat für ne obere Zeile!? Herrschaftszeiten...

JayAy 3. Okt 2010 10:00

AW: Sortieren nach Liste
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hab's jetzt nicht für so schwer gehalten... einfach zwei StrinGrids erstellen und zwei Button und der Großteil des Textes besteht aus dem Inhalt des StrinGrids bzw. einem Mischsortierquelltext, aber du bist wohl der Boss, daher im Anhang das Programm.

alzaimar 3. Okt 2010 10:12

AW: Sortieren nach Liste
 
Das nichts damit zu tun, wer hier der Boss ist.

Stell einfach deine Frage.
Sie darf nicht lauten 'Macht mir einer das mal richtig?' oder 'Es geht nicht'.
Das eine ist eine Zumutung und das andere keine Frage.

Sir Rufo 3. Okt 2010 10:28

AW: Sortieren nach Liste
 
Zitat:

Zitat von JayAy (Beitrag 1053445)
Sorry, hab's jetzt nicht für so schwer gehalten...

Wenn es nicht so schwer ist, wofür brauchst du dann uns?

JayAy 3. Okt 2010 10:33

AW: Sortieren nach Liste
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit dem schwer meinte ich das Verständnis des Programmes, denn so was haben wir seiner Zeit in der Schulinformatik gemacht und ja, ich gebe zu, dass ich nicht verstehe, warum Mischsortieren an der Stelle nicht einfach sortiert... vielleicht bin ich ja dumm oder so etwas in der Richtung

Ich kann mich da eigentlich nur wiederholen: Programm soll Stringgridinhalte sortieren, es sortiert jedoch nicht, ich finde meinen Fehler jedoch nicht, obwohl das ganze eigentlich ziemlich simpel nach Mischsortieren funktionieren sollte... Ich weiß nicht, wie ich das jetzt noch weiter in eine primitivere Sprache übersetzen sollte. Eine aktuelle Fassung (die davor war die nicht funktionierende Erstfassung, sorry) ist im Anhang.

idefix2 3. Okt 2010 12:04

AW: Sortieren nach Liste
 
Ich habe mir Dein Programm nur oberflächlich angeschaut, vielleicht irre ich mich, aber ich habe den Eindruck, dass Du zwar die Liste sortierst (ob das funktioniert, haber ich nicht nachgeprüft), aber dann mit der sortierten Liste nichts mehr machst. Speziell das Stringgrid wird nach dem Sortieren der Liste nicht mit den sortierten Daten befüllt.

Nebenbei:

1. Das Füllen des Stringgrids mit Konstanten würde ich als denkbar schlechte Programmierpraxis bezeichnen, diese Daten gehören z.B. in ein Ini-File, wo man sie bequem bearbeiten kann, ohne bei jeder Änderung das Programm neu zu kompilieren.

2. Wenn genau das gleiche mehrmals passiert, dann sollte das in einer Prozedur nur einmal geschrieben werden. So sollten beispielsweise die Prozeduren Button1Click und Button2Click eine Prozedur
Delphi-Quellcode:
SortiereStringGrid (Sg: TStringgrid)
mit dem Parameter Stringgrid1 bzw. Stringgrid2 aufrufen, schliesslich passiert in beiden Fällen exakt das gleiche.

3. Was soll in der letzten Version das Quicksort - wird nirgends aufgerufen

4. Wozu sind die riesigen Integer-Arrays?


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