![]() |
Austausch-Sortieralgorithmus mit Prozeduren
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag,
wir sind jetzt im Unterricht etwas weiter und sind jetzt auch endlich bei den Routinen angekommen. Bis jetzt haben wir nur die Prozeduren kennengelernt, dir wir mit dem Austausch-Sortieralgorithmus in Verbindung bringen sollen. Es ist zwar keine Hausaufgabe, aber dennoch habe ich mir ein bisschen Zeit genommen, um den Quelltext neu zu formulieren. Und genau dort liegt das Problem, ich bin soweit fertig, das Programm startet auch, doch ich erhalte immer, wenn ich den Sortieren-Button klicke eine Zugriffsverletzung. Gut, ich poste euch mal meinen Quelltext und hänge die Projektdateien als Anhang an. Bedanke mich schon einmal im Voraus.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; Type TFeld = Array [1..100] of Integer; var Form1: TForm1; x: Integer; Feld: TFeld; implementation {$R *.dfm} procedure Beenden(); begin Application.Terminate; end; procedure Generieren(var Feld: TFeld; x: Integer); var i: Integer; begin for i := 1 to x do begin Feld[i] := Random(x) + 1; Form1.ListBox1.Items.Add(IntToStr(Feld[i])); end; end; procedure Ausgabe(x: Integer); var i, j: Integer; begin for i := 1 to x do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; procedure Tauschen(var Feld: TFeld); var i, j, Temp: Integer; begin if (Feld[i] > Feld[j]) then begin Temp := Feld[i]; Feld[i] := Feld[j]; Feld[j] := Temp; end; Ausgabe(StrToInt(Form1.Edit1.Text)); end; procedure Sortieren(var Feld: TFeld; x: Integer); var i, j: Integer; begin for i := 1 to x - 1 do for j := i + 1 to x do Tauschen(Feld); end; procedure TForm1.Button1Click(Sender: TObject); begin Beenden(); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Button3Click(Sender: TObject); begin ListBox1.Clear; Generieren(Feld, StrToInt(Form1.Edit1.Text)); end; procedure TForm1.Button2Click(Sender: TObject); begin Ausgabe(StrToInt(Form1.Edit1.Text)); end; end. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Eiei, jede Menge Fehler sehe ich da...
Die Funktion Sortieren wird gar nicht aufgerufen, warum? Warum sind die Funktionen Sortieren, Tauschen, Ausgabe & Co nicht deklariert? Auch wenn man eine Deklaration weglassen kann, wenn die aufgerufene Funktion vor dem Aufruf steht, so sollte man sich angewöhnen, immer eine Deklaration vorzunehmen.
Delphi-Quellcode:
Öhm, die Schleife benutzt i als Laufvariable, aber der Feldindex benutzt j? Das kann nicht funktionieren und wird wahrscheinlich auch der Grund für die AV sein.
procedure Ausgabe(x: Integer);
var i, j: Integer; begin for i := 1 to x do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; Und wäre es nicht besser, das
Delphi-Quellcode:
durch ein
var Feld: TFeld;
Delphi-Quellcode:
zu ersetzen? Bin mir nicht ganz sicher, ob hier dasselbe zutrifft wie bei Objekten, deren Adresse ja durch das const geschützt wird und nicht deren Inhalt.
const Feld: TFeld;
Noch ein paar Kleinigkeiten:
MfG Dalai |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
Delphi-Quellcode:
deklariert werden.
forward
Zitat:
Delphi-Quellcode:
Nun steht es dem Compiler offen, ob er "xyz" wie "Result" wertet (TP-Abwärtskompatibilität) oder als Selbstaufruf, der Ausdruck ist nicht eindeutig. Aber zugegeben - rekursive Funktionen haben ja meist Parameter, daher kommt's selten vor.
function xyz: Integer;
begin // do smthng a := xyz; // do smthng end; |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Danke für die bisherigen Antworten, aber an einigen Stellen verstehe ich nicht, was gemeint ist. Vielleicht könnte jemand mir in meinem Quelltext Erklärungen bzw. noch nähere Erläuterungen reinschreiben, was zu ändern ist, oder den Quelltext einmal überarbeiten, sodass das Sortieren auch funktioniert. Mein Problem liegt eigentlich nur bei den Prozeduren.
MfG |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Nein. Du musst genauer werden!
Dein Problem liegt nicht nur bei Proceduren. Du hast da einige andere Fehler. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
MfG Dalai |
AW: Austausch-Sortieralgorithmus mit Prozeduren
So..
habe noch einmal die Fehler überarbeitet, die mir hier genannt wurden, das Programm läuft auch, doch beim Sortieren wieder eine Zugriffsverletzung. Vielleicht könnte sich jemand den Quelltext noch mal anschauen oder mir auch noch einmal kurz erläutern, wie man dieses Programm mit Prozeduren umsetzen kann. MfG
Delphi-Quellcode:
Type TFeld = Array [1..100] of Integer;
var Form1: TForm1; Feld: TFeld; implementation {$R *.dfm} procedure Beenden(); begin Application.Terminate; end; procedure Generieren(var Feld: TFeld); var i: Integer; begin for i := 1 to 100 do begin Feld[i] := Random(100) + 1; Form1.ListBox1.Items.Add(IntToStr(Feld[i])); end; end; procedure Ausgabe(j: Integer); var i: Integer; begin for i := 1 to 100 do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; procedure Tauschen(var Feld: TFeld; i, j: Integer); var Temp: Integer; begin if (Feld[i] > Feld[j]) then begin Temp := Feld[i]; Feld[i] := Feld[j]; Feld[j] := Temp; end; Ausgabe(j); end; procedure Sortieren(var Feld: TFeld); var i, j: Integer; begin for i := 1 to 100 - 1 do for j := i + 1 to 100 do Tauschen(Feld, i, j); end; procedure TForm1.Button1Click(Sender: TObject); begin Beenden(); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Button3Click(Sender: TObject); begin ListBox1.Clear; Generieren(Feld); end; procedure TForm1.Button2Click(Sender: TObject); var j: Integer; begin Ausgabe(j); end; end. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Das hier ist unfug:
Delphi-Quellcode:
Du lässt nur das j.te Element ausgeben.. und das 100 x
procedure Ausgabe(j: Integer);
var i: Integer; begin for i := 1 to 100 do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; Edit: + j ist nicht initialisiert so wie du ihn aufrufst (himitsu) |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
Selbst Schuld, wenn du nicht auf die Compilermeldungen hörst, denn da steht bestimmt garantiert was vonwengen "j sei nicht initialisiert". Wenn du mal in den Projektoptionen die Bereichsprüfung aktivierst, dann wirst du direkt informiert wo und vorallem warum es da knallt. Es kann auch nicht schaden sich mal mit dem Debugger vertraut zu machen. Erstmal um uns genau die Fehlerstelle zu nennen. ( wurde dir denn keine Fehlerzeile gezeigt? ) Und auserdem hättest du im Debuger selber erkennen können warum es knallt, indem du dir an der Fehlerstelle mal die Variablen ansiehst (speziell das j :roll: ) |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
So, habe mir Zeit genommen mich nochmal mit den Routinen zu beschäftigen und habe den "Austausch-Algorithmus" noch einmal neu in Quelltext verfasst, jedoch sortiert mir mein Programm nun Namen oder Wörter in einer ListBox. Vielleicht könnte jemand einmal drüber schauen. Bis jetzt funktioniert das Programm ;)
Delphi-Quellcode:
const n = 100;
var Form1: TForm1; Feld: Array[1..n] of String; Zaehler: Integer; implementation {$R *.dfm} procedure Hinzufuegen(Name: String); begin Feld[Zaehler] := Name; inc(Zaehler); end; procedure Tausche(var Str1, Str2: String); var Temp: String; begin Temp := Str1; Str1 := Str2; Str2 := Temp; end; procedure Sortieren; var i, j: Integer; begin for i := 1 to n - 1 do for j := i + 1 to n do if (Uppercase(Feld[i]) > Uppercase(Feld[j])) then Tausche(Feld[i], Feld[j]); end; procedure TForm1.FormCreate(Sender: TObject); begin Zaehler := Zaehler + 1; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin Hinzufuegen(Edit1.Text); ListBox1.Clear; for i := 1 to n do if (Feld[i] <> '') then ListBox1.Items.Add(Feld[i]); Edit1.Clear; end; procedure TForm1.Button2Click(Sender: TObject); begin Application.Terminate; end; procedure TForm1.Button3Click(Sender: TObject); var i: Integer; begin Sortieren; ListBox1.Clear; for i := 1 to n do if (Feld[i] <> '') then ListBox1.Items.Add(Feld[i]); end; end. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Ja sieht nun viel ordentlicher aus.
Es gibt aber immernoch Probleme, wenn auch nur kleine: 1. deine Zählervariable: - es findet keine Initialisierung statt - nirgendswo bekommt Zähler einen Anfangswert (1?) verpasst. Im FormCreate wird sie "erhöht" (inkrementiert) - sie hat aber einen zufälligen Wert (davon ist auszugehen, wenn nichts zugewiesen wurde bei globalen Variablen). - die Procedure "hinzufügen" ist fehleranfällig: wenn du es nämlich genau 100x ausführst und noch ein weiteres Mal. Da wird dann versucht, auf einen Index zuzugreifen, der außerhalb des Bereiches liegt (Bereichsfehler). Besser wäre es, wenn du ne Kontrolle einbaust ~ (Zähler <= n) 2. der "Schließknopf" - Application.Terminate funktioniert zwar, aber dies gibt deiner Anwendung nicht die Möglichkeit, Deinitialitsierungen durchzuführen (Speicherfreigaben usw). Besser ist es, wenn du einfach ein Close; aufrufst. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Was, zum Teufel, ist der "Austausch-Sortieralgorithmus"?
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Google, zum Teufel, mal.
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
Den "Austausch-Sortieralgorithmus" gibt mit dieser Bezeichnung (derzeit sonst) nicht, zumal (aus)tauschen eine essentielle Operation allgemeiner Sortieralgorithmen gibt, was demnach eine solche Bezeichnung sehr unglücklich dastehen ließe. Wenn ich "exchange sort" suche, komme ich auf Lösungen, die an manchem Simplesort (sicher auch keine selbsterklärende Bezeichnung) auf sortieralgorithmen.de zu entsprechen scheint. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
"Selection Sort" (wenn man sicht die diversen Sortieralgorithmen auf Wikipedia ansieht und von der Logik (nicht Code) her vergleicht, so kommt man zu diesem Entschluss =P)
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Manche Lehrer scheinen Bubble-Sort auch so zu bezeichnen (sagt zumindest Google), es scheint aber wirklich Selection-Sort zu sein.
Aber eigentlich ist das egal, der nächste arme Hund, dem der Lehrer den richtigen Namen des Algorithmus nicht verrät, wird diese Thema mit der Überschrift finden. Wenn du über die Qualität des Info-Unterichts diskutieren willst, kannst du ja ein Thema in K&T aufmachen :mrgreen: |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Da gibts nichts zum Diskutieren; soetwas wie Qualität gibt es im Info Unterricht (zumindest in der Oberstufe) nicht!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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