![]() |
Warteschlange realisieren
Hallo,
als Übung für die kommende Informatik-LK-Klausur möchte ich mich mit der Warteschlange beschäftigen. Also ich habe 10 Personen , die anstehen , diese 10 Personen sind in einem Array vom Typ person (record) gespeichert , so sieht mein Quellcode bisher aus : So hatten wir in der Schule damit angefangen.
Delphi-Quellcode:
Im Record haben wir noch die Id hinzugefügt , also es können ja Personen anstehen , die den gleichen Namen und sogar den gleichen Nachnamen haben ( Peter Müller etc) , deswegen eine eindeutige ID.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) 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; implementation constructor tschlange.create; begin next :=0; max := 10; end; function tschlange.einfuegen(x:person):boolean; begin schlange[next] := x; end; {$R *.dfm} end. So , auf dem Formular habe ich erstmal GARNIX. Und ich weiß auch nicht mehr weiter , bei der
Delphi-Quellcode:
.
function einfuegen(x:person):boolean
Kriege ich hier einen Tipp , wie ich eine Person jetzt einfügen kann ? Also z.b , wo ich ein edit-feld habe und wo dann sich eine Person einfügen kann. Danke schon im Voraus. |
AW: Warteschlange realisieren
Delphi-Quellcode:
schlange : array [1..10] of person;
Delphi-Quellcode:
... next:=0;
Delphi-Quellcode:
Das wird wohl 'n Fehler geben.
schlange[next] := x;
Ich pers würde ein dyn. Array oder eine TList nutzen. Zitat:
Zitat:
|
AW: Warteschlange realisieren
Danke erstmal fr deine Antwort.
Aber warum muss der Zähler der Warteschlange erhöht werden ? |
AW: Warteschlange realisieren
Damit man weis wann die Warteschlange voll ist. Das kann man auch anders realisieren, ist aber, ich sag mal logisch einfacher.
|
AW: Warteschlange realisieren
Schalte in den Projektoptionen die Bereichsprüfung an. :!:
Delphi-Quellcode:
Auf was wird "next" wohl stehen, beim Einfügen?
schlange : array [1..10] of person;
constructor tschlange.create; begin next :=0; max := 10; end; function tschlange.einfuegen(x:person):boolean; begin schlange[next] := x; PS: Wozu hast du dir "max" nochmals gespeichert? (das kann man ja aus dem Array auslesen) Mit einem dynamischen Array oder einer Liste würde man sich nicht speichern müssen, wo man grade ist, da man dort einfach immer die letzte Position als die Aktuelle ansehn könnte. Eine Liste währe für einen Queue/FiFo ( ![]() Ein Array ist mehr für einen Stack/FiLo ( ![]() |
AW: Warteschlange realisieren
Also danke erstmal für die Antworten , will aber kurz logisch was klargestellt haben :
Wenn ich jetzt eine Person einfüge in Schlange[1] , dann ist das erste Feld im Array voll , die erste Person muss aber sozusagen an die Kasse , denn das 10.Array Feld , also das letzte , ist ja eigentlich die Stelle , wo die erste Peron steht. Also muss man ja immer +1 rechnen , oder ? Damit die erte Person bis schlange[10] vorrückt , und dann immer so weiter , oder ? |
AW: Warteschlange realisieren
Ja?
Sollte doch wohl auch logisch sein, oder wieso bist du eigentlich auf die Idee mit der next-Variable gekommen? Irgendwie mußt du ja auch wissen wo du grade bist. OK, man könnte alle Felder mit NIL initialisiert halten und wirde jedesmal nachsehn, aber ein NEXT/CURRENT währe bestimmt einfacher. Ein dynamisches Array oder eine Liste ginge auch, da man dort immer den letzten Eintrag als den aktuellen betrachten könnte. Und nochmals, schalte besser zukünftig immer die Bereichsprüfung an, denn damit währe dieser Fehler sofort aufgefallen, wobei man sich auch über ein bissl Debuggen dem Problem hätte annehmen können. :roll: |
AW: Warteschlange realisieren
Naja , das hat der Lehrer hinprogrammiert , konnte aber nicht fragen , was next heißen soll , weil ich grade an etwas anderem programmiert habe xD.
Also , trotzdem danke für die Antwort. Also , wir haben jetzt den Code , hab diesen [0] Befehl korrigiert :
Delphi-Quellcode:
Wenn ich jetzt ein Edit-Feld habe , und ich gebe dort zum Beispiel Peter ein , das ist ja ein String , also :
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) 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; implementation constructor tschlange.create; begin next :=1; max := 10; end; function tschlange.einfuegen(x:person):boolean; begin schlange[next] := x; end; {$R *.dfm} end.
Delphi-Quellcode:
Das geht ja nicht wegen den Datentypen , wie behebe ich diesen Fehler ?
....
// schlange[1] := form1.edit1.text; 2. Denkansatz von mir :
Delphi-Quellcode:
Geht das hier ?
...
// schlange.name[1]:= form1.edit1.text; Wie setze ich das um , dass ich einen Namen ins Array speichern kann. Der record heißt person , ich bin ein bisschen durcheiannder , wie ihr seht , bin aber eifrig am Überlegen , also bitte nciht denken , dass ich nix mache oder so. |
AW: Warteschlange realisieren
Stattdessen im Unterricht besser zuhören?
Zitat:
Und vergiß nicht das Next zu setzen. Frage dazu: Was passiert wohl, wenn du mehrmals nacheinander "einfuegen" aufrufst? |
AW: Warteschlange realisieren
Hab ja zugehört , aber das Programmieren hatte mich grad in den Bann gezogen und ich saß vor dem Rechner like this : *-* xd
Also wenn ich mehrmals einfügen drücke , geht er sozusagen aus dem Array raus , ich muss es begrenzen , deswegen max , und max ist ja 10. Wenn ich ne for-schleife hätte müsste ich
Delphi-Quellcode:
schreiben.
...to max do
Also das Array heißt ja Schlange. Aber wenn ich einfach schlange[1]:=form1.edit1.text; schreibe , geht das nicht. Ich muss ihm ja sagen , dass er , wenn auf das Record zugreift , den "Namen" im Record , der auf String ist , aufgreifen. Also ins Array einfügen , aber im Record dann mit "Name" ansprechen lassen. Vielleicht schlange[1].name:=form1.edit1.text; Bin mir aber nicht sicher :( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 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