AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warteschlange realisieren

Ein Thema von hotkey · begonnen am 13. Mai 2012 · letzter Beitrag vom 14. Mai 2012
Antwort Antwort
Seite 5 von 8   « Erste     345 67     Letzte »    
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#41

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 12:21
Ich hatte eben noch editiert. BTW: Du solltest das {$R *.dfm} direkt hinter das implementation verschieben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#42

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 12:22
[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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#43

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 12:24
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.
Felix
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#44

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 12:53
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#45

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 12:58
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

Bis später.
Felix
  Mit Zitat antworten Zitat
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#46

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 13:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#47

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 13:22
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#48

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 13:38
Beim Einfügen soll automatisch rotiert werden? Das hätte einem aber auch gesagt werden können (oder ich habe es überlesen).
Du hast da garnichts übersehen.

Die Id wird also vom Programm vergeben, zum Einfügen gibt man nur den Namen ein.
Die ID wir ausserhalb des Programmes zur identifikation der Person benötigt, darum ist dieser Vorschlag nicht verwendbar.


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#49

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 14:49
Beim Einfügen soll automatisch rotiert werden? Das hätte einem aber auch gesagt werden können (oder ich habe es überlesen).
Du hast da garnichts übersehen.
Ich hatte den Eindruck gewonnen, dass es hotkey bisher hauptsächlich um das Vorrücken in der Schlange ging. Wenn dies nicht automatisch geschehen soll, dann muss er eben den Teil unter else in eine eigene Prozedur "Aufrücken" umwandeln.


Die Id wird also vom Programm vergeben, zum Einfügen gibt man nur den Namen ein.
Die ID wir ausserhalb des Programmes zur identifikation der Person benötigt, darum ist dieser Vorschlag nicht verwendbar.
Davon war bisher m.E. nicht die Rede. Sie soll laut #1 lediglich zur Identifikation dienen - und hotkey hat beim bisher vorgestellten Code auch nur eine Eingabeprozedur für den Namen präsentiert. Soll die ID auch eingegeben werden, so würde ich ein 2. Edit-Feld vorschlagen und entsprechenden Code für die Übernahme.
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#50

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 16:28
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:
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.
Ich weiß , das im Button ist doppelt gemooppelt , ist aber irgendwie Gewöhnungssache geworden bei mir , hoffe , das macht keine Fehler.

Wenn ich jetzt für x.Name und x.Id 2 Edit-Felder habe , wie rufe ich die Funktion auf ?

So hier :

 einfuegen(x.id;x.name) , geht das so ?
Felix
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 8   « Erste     345 67     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.
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