Delphi-PRAXiS
Seite 1 von 8  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Warteschlange realisieren (https://www.delphipraxis.net/168288-warteschlange-realisieren.html)

hotkey 13. Mai 2012 18:59

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:
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.
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.

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.

turboPASCAL 13. Mai 2012 19:24

AW: Warteschlange realisieren
 
Delphi-Quellcode:
schlange : array [1..10] of person;
Delphi-Quellcode:
... next:=0;
Delphi-Quellcode:
schlange[next] := x;
Das wird wohl 'n Fehler geben.

Ich pers würde ein dyn. Array oder eine TList nutzen.


Zitat:

Zitat von hotkey (Beitrag 1166346)
So , auf dem Formular habe ich erstmal GARNIX.

Muss man ja auch nicht unbedingt. ;)

Zitat:

Zitat von hotkey (Beitrag 1166346)
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 ?

Na, mach dir ein Editfeld und einen butten auf das Formular. Im ButtonXClick -Ereignis machst du deine Einfügen function erin und erhöst den Zähler der Warteschlange.

hotkey 13. Mai 2012 19:30

AW: Warteschlange realisieren
 
Danke erstmal fr deine Antwort.

Aber warum muss der Zähler der Warteschlange erhöht werden ?

turboPASCAL 13. Mai 2012 19:45

AW: Warteschlange realisieren
 
Damit man weis wann die Warteschlange voll ist. Das kann man auch anders realisieren, ist aber, ich sag mal logisch einfacher.

himitsu 13. Mai 2012 19:47

AW: Warteschlange realisieren
 
Schalte in den Projektoptionen die Bereichsprüfung an. :!:

Delphi-Quellcode:
    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;
Auf was wird "next" wohl stehen, beim Einfügen?

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 (Bei Google suchenfirst in first out) eh besser geeignet, da er Möglichkeiten bietet, um die Lsite zu bearbeiten (Einfügen und Löschen).
Ein Array ist mehr für einen Stack/FiLo (Bei Google suchenfirst in last out) geeignet.

hotkey 13. Mai 2012 20:01

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 ?

himitsu 13. Mai 2012 20:03

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:

hotkey 13. Mai 2012 20:10

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:
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.
Wenn ich jetzt ein Edit-Feld habe , und ich gebe dort zum Beispiel Peter ein , das ist ja ein String , also :

Delphi-Quellcode:
....
//
schlange[1] := form1.edit1.text;
Das geht ja nicht wegen den Datentypen , wie behebe ich diesen Fehler ?

2. Denkansatz von mir :

Delphi-Quellcode:
...
//
schlange.name[1]:= form1.edit1.text;
Geht das hier ?
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.

himitsu 13. Mai 2012 20:14

AW: Warteschlange realisieren
 
Stattdessen im Unterricht besser zuhören?

Zitat:

Delphi-Quellcode:
schlange.name[1] :=
Geht das hier ?
Gegenfrage: Was ist wohl das Array, Schlange oder Name?


Und vergiß nicht das Next zu setzen.
Frage dazu: Was passiert wohl, wenn du mehrmals nacheinander "einfuegen" aufrufst?

hotkey 13. Mai 2012 20:17

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:
...to max do
schreiben.

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 14:10 Uhr.
Seite 1 von 8  1 23     Letzte »    

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