![]() |
Mein Sortierprogramm funktioniert nicht!!!
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute... ich habe ein sehr großes Problem.. Wir sollen bis morgen ein Delphi-Projekt erstellen, welches die vier Sortieralgorithmen BubbleSort, InsertionSort, QuickSort und HeapSort ausführen kann... Also es soll ein Memo-Feld geben, dass die mit dem Array erstellten Zufallszahlen ausgibt und dann eben vier weitere Memofelder, für jedes Sortierverfahren eins... und wenn man auf den Button Sortieren unterhalb jedes memofeldes klickt, wird das jeweilige Sortierverfahren angewandt... naja und mein Delphi streikt total... also er meldet total komische Fehler... am besten kopier ich hier mal den gesamten Quelltext:
Delphi-Quellcode:
Ich füge auch nochmal das ganze Projekt als rar-datei unten hinzu... aber delphi meldet mir folgende Fehler, wenn ich das Projekt starten will:
unit USort;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) mZahlenGeneriert: TMemo; mBubbleSort: TMemo; mInsertionSort: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; btnBubbleSort: TButton; btnInsertionSort: TButton; edZeitBubble: TEdit; Label4: TLabel; Label5: TLabel; edZeitInsert: TEdit; Label6: TLabel; edDurchgaengeBubble: TEdit; edDurchgaengeInsert: TEdit; Label7: TLabel; Label8: TLabel; Panel1: TPanel; btnZahlengenerieren: TButton; edAnzahl: TEdit; Label9: TLabel; Label10: TLabel; Panel2: TPanel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Button1: TButton; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; mQuickSort: TMemo; Label25: TLabel; mHeapSort: TMemo; Label26: TLabel; btnHeapSort: TButton; Label27: TLabel; Label28: TLabel; edZeitQuick: TEdit; Label29: TLabel; Label30: TLabel; edDurchgaengeQuick: TEdit; Label31: TLabel; edZeitHeap: TEdit; Label32: TLabel; Label33: TLabel; edDurchgaengeHeap: TEdit; btnQuickSort: TButton; procedure btnZahlengenerierenClick(Sender: TObject); procedure btnBubbleSortClick(Sender: TObject); procedure btnInsertionSortClick(Sender: TObject); procedure btnQuickSortClick(Sender: TObject); procedure btnHeapSortClick(Sender: TObject); procedure edAnzahlChange(Sender: TObject); procedure Button1Click(Sender: TObject); procedure HeapSort(var A: array of Integer); procedure QuickSort(var A: array of Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; a: array[1..1000] of integer; b: array[1..1000] of integer; c: array[1..1000] of integer; d: array[1..1000] of integer; Zahl:integer; implementation {$R *.dfm} procedure TForm1.btnZahlengenerierenClick(Sender: TObject); var i: integer; begin mBubbleSort.Clear; mInsertionSort.Clear; mQuickSort.Clear; mHeapSort.Clear; mZahlenGeneriert.Clear; Zahl:=strtoint(edAnzahl.text); randomize(); for i := 1 to 1000 do begin a[i]:=random(Zahl+1); b[i]:=a[i]; c[i]:=a[i]; d[i]:=a[i]; mZahlenGeneriert.lines.Add(inttostr(a[i])); btnBubbleSort.Enabled:=true; btnInsertionSort.Enabled:=true; btnQuickSort.Enabled:=true; btnHeapSort.Enabled:=true; end; end; procedure TForm1.btnBubbleSortClick(Sender: TObject); var d,n,k,i, speicher : integer; ZeitBubble: Cardinal; begin ZeitBubble:= GetTickCount; d:= 0; for k := 1 to 1000 do begin for n := 1 to 999 do begin if a[n] > a[n+1] then begin speicher:= a[n+1]; a[n+1]:= a[n]; a[n]:= speicher; d:=d+1; end; end; end; for i:= 1 to 1000 do mBubbleSort.Lines.Add(inttostr(a[i])); edZeitBubble.text:= IntToStr(GetTickCount - ZeitBubble); edDurchgaengeBubble.text:=IntToStr(d); btnBubbleSort.Enabled:= false; end; procedure TForm1.btnInsertionSortClick(Sender: TObject); var e,i,j,v, p : Integer; ZeitInsert: Cardinal; begin ZeitInsert:= GetTickCount; e:=0; for i:= 1 to 1000 do begin if a[i] < a[i-1] then begin j := i; v := a[i]; while (v < a[j-1]) AND (j > 0) do begin a[j] := a[j-1]; dec(j); end; a[j] := v; e:=+1; end; edZeitInsert.text:= IntToStr(GetTickCount - ZeitInsert); end; for p:=1 to 1000 do mInsertionSort.Lines.Add(IntToStr(a[p])); edDurchgaengeInsert.Text:=InttoStr(e); btnInsertionSort.Enabled:= false; end; procedure TForm1.btnQuickSortClick(Sender: TObject); procedure QSort(LoIndex, HiIndex: Integer); var Lo, Hi: Integer; Pivot: Integer; Swap: Integer; begin // Wähle stets das mittlere Element als Pivot-Element Pivot := d[(LoIndex + HiIndex) div 2]; // Stelle die Ordnung bzgl. des Pivot-Elements her Lo := LoIndex; Hi := HiIndex; repeat while d[Lo] < Pivot do Inc(Lo); while d[Hi] > Pivot do Dec(Hi); if Lo <= Hi then begin Swap := d[Lo]; d[Lo] := d[Hi]; d[Hi] := Swap; Inc(Lo); Dec(Hi); end; until Lo > Hi; // ggf. linke Teilliste sortieren if LoIndex < Hi then QSort(LoIndex, Hi); // ggf. rechte Teilliste sortieren if Lo < HiIndex then QSort(Lo, HiIndex); end; begin QSort(Low(d), High(d)); end; procedure TForm1.btnHeapSortClick(Sender: TObject); procedure HeapSort(var A: array of Integer); procedure Swap(var X, Y: Integer); var Swp: Integer; begin Swp := X; X := Y; Y := Swp; end; procedure SiftDown(Current, MaxIndex: Integer); var Left, Right, Largest: Integer; begin Left := Low(A) + (2 * (Current - Low(A))) + 1; Right := Low(A) + (2 * (Current - Low(A))) + 2; Largest := Current; if (Left <= MaxIndex) and (A[Left] > A[Largest]) then Largest := Left; if (Right <= MaxIndex) and (A[Right] > A[Largest]) then Largest := Right; if (Largest <> Current) then begin Swap(A[Current], A[Largest]); SiftDown(Largest, MaxIndex); end; end; procedure Heapify(); var Middle: Integer; i: Integer; begin Middle := ((Low(A) + High(A) + 1) div 2) - 1; for i := Middle downto Low(A) do // Nur die Knoten, die Söhne haben! SiftDown(i, High(A)); end; var i: Integer; begin Heapify(); for i := High(A) downto Low(A) + 1 do begin Swap(A[i], A[Low(A)]); SiftDown(Low(A), i - 1); end; end; procedure TForm1.edAnzahlChange(Sender: TObject); begin if edAnzahl.text='' then begin MessageDlg('Bitte tragen Sie einen Höchstzahlenwert für die Zufallszahlen ein!', mtError, [mbOK], 0); edAnzahl.text:='1'; end; if ((strtoint(edAnzahl.text) < 1) or (strtoint(edAnzahl.text) > 1000)) then begin MessageDlg('Die Werte müssen zwischen "1" und "1000" liegen!', mtError, [mbOK], 0); edAnzahl.text :='1' end; end; procedure TForm1.Button1Click(Sender: TObject); var x: TForm; begin x:= Dialogs.CreateMessageDialog('Möchten Sie das Programm wirklich beenden?', dialogs.mtConfirmation, dialogs.mbOKCancel); if x.ShowModal = mrOK then close; end; end. in der Zeile bspw: procedure TForm1.edAnzahlChange(Sender: TObject); da meint Delphi: ";" erwartet, aber "." gefunden! aber was soll das? ich verstehs einfach nicht :-( es wäre echt lieb, wenn da einer ma kurz drübergucken könnte... ja ich weiß, dass das programm nicht grad sehr übersichtlich ist, aber wenn ihr fragen habt, dann fragt bitte einfach... achja und die oberfläche ist erstmal nur provisorisch... also nicht, dass ihr denkt, dass es so dann auch im fertigen prg. aussehen soll ;) aber erstmal ist halt wichtig, dass es überhaupt funzt... ;) |
Re: Mein Sortierprogramm funktioniert nicht!!!
Das ganze Ding ist eine ueble Baustelle. Sorry.
Du hast offenbar noch wenig Planung, was Programmierung angeht. [raeusper] Du hast Methoden lokal reingeschraubt, die im Form deklariert werden und da nie gefunden werden koennen und die gesamte Struktur ist vollkommen durcheinander. Ich koennte Dir das jetzt fixen, aber dann hast Du vermutlich auch nicht viel gelernt. Ich frage mich wie Du die Exe ueberhaupt zusammenbekommen hast, die da in dem Archiv liegt...??? Aber okay, jetzt habe ich es schon mal offen und werde es mir im Detail anschauen. Aber eines kann ich Dr gleich sagen: Um das zum Laufen zu bringen, muss man so viel aendern, dass der Lerneffekt fuer Dich bei Null sein duerfte. vielleicht solltest Du kleinere Broetchen backen. Eine Liste und ein Sortieralgo. Offenbar schiebst Du naemlich den Code per Cut and Paste sinnlos in der Gegend herum... Sorry, das soll keine Beleidigung sein, aber dieser Codefetzen ist schon Hardcore. |
Re: Mein Sortierprogramm funktioniert nicht!!!
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich finds ja eh arschig... unser lehrer wollte eigentlich nur, dass wir zwei Sortieralgorithmen, also Bubble und InsertionSort machen... naja und das hab ich super geil hinbekommen... aber dann meinte er, dass wir das programm erweitern müssen, also noch QuickSort und HeapSort hinzufügen sollen... naja und ihr könnt unten auch mein altes Programm downloaden... da könnt ihr mal sehen, was ich mir da für ne Mühe gemacht habe... Aber jetzt das neue bekomme ich einfach nicht auf die Reihe ... :( Und ja ich gebs zu, aber ich bin nicht so gut in Informatik... und den Quelltext hab ich auch nur per copy & paste eingefügt... aber ich steh halt voll unter zeitdruck und naja... da is dann halt so ein wirrwar draus geworden, bei dem ich selbst nich richtig durchblicke... |
Re: Mein Sortierprogramm funktioniert nicht!!!
Zitat:
Beachte, dass wir hier kein Hausaufgabenforum sind. Und deshalb erwarte nicht, dass dir hier einer kompletten Code postet... Dem hast du ![]() Aber als Anhaltspunkt kann ich dir aber mal das Sort-Demo-Projekt nennen, das bei deiner Delphi Installation mitinstalliert wurde. An das solltest du dich richten, auch wenn die Threadprogrammierung für dein Projekt wohl überdimensioniert ist. Aber wie die Sortieralgorythmen funktionieren, geht dort klar hervor. |
Re: Mein Sortierprogramm funktioniert nicht!!!
Zitat:
|
Re: Mein Sortierprogramm funktioniert nicht!!!
Schau mal unter {$Delphi}\Demos\Threads
|
Kein wunder, dass Dein Programm nicht funzt.
Zunaechst mal folgende Kardinalfehler:
globale Variablen und Lokale Variablen haben bei Dir den gleichen Namen. Das ist eine Katastrophe und fuehrt zu Fehlern, die man in einem nichttrivialen Programm kaum noch ausfindig machen kann. Am besten ueberhaupt keine globalen Variablen gar nie nicht verwenden! In Deinem code wird A,B,C,D global als Array deklariert und in dem Event 'Bubblesortclick': d,n,k,i, speicher : integer; ist wieder eine Variable "d" als integer.... :( Niemals identifier so benamsen, dass es Ueberschneidungen mit Prozedurnamen aus der VCL oder RTL gibt. (Hi und Lo sind Routinen der RTL, die das hoeherwertige bzw. niederwertige Byte eines Integers zurueckliefern. Warum hast Du vier Listen mit Zahlen (Arrays a,b,c,d) statt nur einer? Es ist doch ohnehin ueberall das selbe drin. |
Re: Kein wunder, dass Dein Programm nicht funzt.
Zitat:
und diese demo von delphi ist zwar cool, aber mir is das i-wie zu kompliziert... |
Re: Mein Sortierprogramm funktioniert nicht!!!
Zitat:
Ich kenne Systeme mit ueber einer Million Zeilen Code ... |
Re: Mein Sortierprogramm funktioniert nicht!!!
Zitat:
na ok... dann is meins halt net so riesig, aber dennoch riesig genug für mich :( ich bräuchte einfach mal nen gescheiten code für Quicksort und Heapsort... aber halt wirklich einen der vielleicht nicht so verwurschtelt ist und keine ahnung... denn mein programm is echt nich mehr zu retten... also ich lösch am besten den quelltext von quick und heapsort und dann bräuchte ich halt mal nen guten anderen... weil den, den ich da hab, der is sau lang und voll kompliziert find ich :( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 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