![]() |
AW: Warteschlange realisieren
Ich hatte eben noch editiert. BTW: Du solltest das {$R *.dfm} direkt hinter das implementation verschieben.
|
AW: Warteschlange realisieren
[OT] ich kann mich noch an meine erste Warteschlange erinnern, die war 64 Stellen lang, es gab einen Anfang, ein Ende und die Anzahl der gespeicherten Bytes.
Am Ende der Schlange wurde eingefügt, am Anfang gelesen. Beim Einfügen wurde die Anzahl und das Ende um 1 erhöht, beim Lesen Die Anzahl um 1 vermindert und der Anfang um 1 erhöht. war die warteschlage voll wurde nicht geschrieben, war sie leer wurde nicht gelesen. Der einzge Trick war, daß für den Datenindex i:=i and 63; verwendet wurde. (Es könnte sein, daß auf dieses Vorgehen IBM ein Copyright hat) [/OT] Gruß K-H |
AW: Warteschlange realisieren
So müsste es korrekt sein , oder nicht ?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; private { Private declarations } public { Public declarations } end; person = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of person; public function einfuegen(x:person):boolean; constructor create; end; var Form1: TForm1; myschlange:Tschlange; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: person):boolean; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end; end; end. |
AW: Warteschlange realisieren
Nach meinem Dafürhalten sollte das jetzt stimmen. Wenn nun also der erste (an Array-Position 10) durch die Kasse ist, müssen die anderen nachrücken. Dafür kannst Du dann wieder eine For-Schleife verwenden, musst aber herunterzählen (downto statt to).
|
AW: Warteschlange realisieren
Das versuche ich mal heute , wenn ich zu Hause bin und poste eventuell noch Fragen hier rein.
Vielen Dank an alle erstmal , ich bin mir sicher , da sind noch paar Unklarheiten , die wir dann hier hoffentlich klären können. Ich bedanke mich bei allen , die mir versucht haben , zu helfen , bzw. geholfen haben :D Bis später. |
AW: Warteschlange realisieren
Hallo,
ja, so funktioniert das Einfügen, d.h. du schreibst angegebene Namen immer auf den nächst niedrigeren Platz. Das ist aber erst die halbe Miete. Wie fügst du ein, wenn next = 0 ist, d.h. die Schlange voll ist? Dann musst du anfangen, die Elemente zu verschieben, und zwar erst verschieben und danach einfügen. Es sollte also irgendwie so weitergehen:
Code:
function tschlange.einfuegen(x: person):boolean;
begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else begin // next =0 // 9 auf 10 schieben, 8 auf 9 schieben usw. - For-Schleife dafür verwenden // an Stelle 1 das Neue einfügen end; end; Wie du die For-Schleife zum Verschieben programmierst, das wurde ja oben schon erwähnt (for i:=9 downto 1 do ... schlange[i+1]:=schlange[i]). Außerdem solltest du x.id eindeutig machen, z.B. erst im Constructor mit id:=1 initialisieren, dann beim Einfügen schlange[next].id:=id und danach mit inc(id) immer um eins erhöhen, sobald du eine Person eingefügt hast. Die Id wird also vom Programm vergeben, zum Einfügen gibt man nur den Namen ein. Ich würde daher der Einfüge-Funktion nur den Namen und nicht den ganzen Record übergeben, wie du es früher schon mal hattest, denn den kannst du aus dem Edit-Feld einfach übernehmen. Somit hast du im id der zuletzt eingefügten Person auch gleich die Anzahl der Leute, die insgesamt an der Kasse waren, um bei dem Beispiel zu bleiben. |
AW: Warteschlange realisieren
Beim Einfügen soll automatisch rotiert werden? Das hätte einem aber auch gesagt werden können (oder ich habe es überlesen). Ich frage mich dann nur, was die Boolean-Funktion in dem Fall zurückgeben soll, eigentlich kann es dann auch gleich eine Prozedur sein.
|
AW: Warteschlange realisieren
Zitat:
Zitat:
Gruß K-H |
AW: Warteschlange realisieren
Zitat:
Zitat:
|
AW: Warteschlange realisieren
Hallo,
da bin ich wieder. Also wollte kurz was klarstellen : Die Id haben wir deshalb benutzt , damit wir die Menschen eindeutig identifizieren können , denn wir haben nicht ausgeschlossen , dass eine Person den gleichen Namen hat , wie eine andere. Bevor ich noch verschiebe und so habe ich jetzt ein bisschen erweitert :
Delphi-Quellcode:
Ich weiß , das im Button ist doppelt gemooppelt , ist aber irgendwie Gewöhnungssache geworden bei mir , hoffe , das macht keine Fehler.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; person = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of person; public function einfuegen(x:person):boolean; constructor create; end; var Form1: TForm1; myschlange:Tschlange; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: person):boolean; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; x.Name:= form1.edit1.text; // ERWITERUNG x.id := strtoint(form1.edit2.text); // ERWEITERUNG if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); schlange[next].Name:=x.name; schlange[next].id := x.id; end; end; procedure TForm1.Button1Click(Sender: TObject); begin myschlange := tschlange.create; //myschlange.einfuegen() end; end. Wenn ich jetzt für x.Name und x.Id 2 Edit-Felder habe , wie rufe ich die Funktion auf ? So hier :
Delphi-Quellcode:
, geht das so ?
einfuegen(x.id;x.name)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 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