Kolejka — ustawianie, usuwanie i zapisywanie do plików

0

Miałby, ktoś pomysł, aby usprawnić bardziej ten kod, oraz jeszcze jedno pytanie czy jest jakaś możliwość do przewijania w dół wierszy zapisanych w 2 TEdicie

unit Unit7;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm7 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public

  end;

var
  Form7: TForm7;

type
 TWskaznik = ^TElement;
 TElement = record
 Liczba : Byte;
 Nast,Ost : TWskaznik;
 end;

var
 Kolejka:TWskaznik;
 Liczba:Byte;
 Znak:Char;

implementation



{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
 procedure Ustaw (Liczba: Byte);

var
E, Pop, Nast : TWskaznik;
begin
New(E);
E^.Liczba := Liczba;
E^.Nast := Nil;
if (Kolejka = nil) then
begin
E^.Nast := Kolejka; Kolejka := E;
end
else
begin
Pop := Kolejka; Nast := Kolejka^.Nast;
while (Nast <> nil) do
begin
Pop := Nast;
Nast := Nast^.Nast;
end;
E^.Nast := Nast;
Pop^.Nast := E;
end;
end;
  var
 x : String;
begin

     while Liczba > 0 do
     begin
     Liczba := Edit1.Text;
     Ustaw(Liczba);
     Edit2.Text := Liczba;
     end;
end;

procedure TForm7.Button4Click(Sender: TObject);
function Obsluz: Byte;
var
E : TWskaznik;
begin
if (Kolejka = nil) then
Obsluz := 0
else
begin
E := Kolejka;
Obsluz := E^.Liczba;
Kolejka := E^.Nast;
end;
end;

begin
  Obsluz(Liczba)
end;

end.
3

@Shiffter:

aby usprawnić bardziej ten kod

po pierwsze, sformatuj kod wstawiając go w znaczniki
po drugie , trudno usprawnić kod który się nie kompiluje, poniżej kilka błędów ...
po trzecie, nikt nie będzie zgadywał co ma ten kod robić

var
   Liczba:Byte;

Liczba := Edit1.Text; // <- error , niezgodne typy 


procedure TForm3.Button4Click(Sender: TObject);
  function Obsluz: Byte; 
  var
    E: TWskaznik;
  begin
    if (Kolejka = nil) then
      Obsluz := 0
    else
    begin
      E := Kolejka;
      Obsluz := E^.Liczba;
      Kolejka := E^.Nast;
    end;
  end;

begin
  Obsluz(Liczba)   ///<-- error funkcja obsłuż jest bezparametrowa 
end;


EDT...
W temacie postu wspominasz o plikach ale w kodzie nie widać żadnych operacji na plikach.
Do tego nie zainicjowane zmienne...
W sumie masa błędów

4

@Shiffter, wywal ten kod i napisz od początku, tak się nie da tego pisać. Kolejka powinna być zaimplementowana zupełnie poza jakikolwiek kodem dotyczącym UI, a wrzucanie jej kodu do zdarzeń komponentów wizualnych formularza to wręcz tragedia godna potępienia. Jak chcesz mieć kolejkę, to pisz kolejkę, nie UI. Stwórz sobie osobny moduł i w nim zaprogramuj tylko i wyłącznie kolejkę.

type
 TWskaznik = ^TElement;
 TElement = record
 Liczba : Byte;
 Nast,Ost : TWskaznik;
 end;

Pisz kod po angielsku, bo i tak słowa kluczowe języka i domyślne identyfikatory są po angielsku. Poza tym te nazwy są niezgodne z powszechnymi praktykami pisania kodu — wskaźnik powinien mieć prefiks P, a T tylko typy danych:

type
  PElement = ^TElement;
  TElement = record
    Next: PElement;
    Prev: PElement;
    Data: Integer;
  end;

Teraz przyda się mieć jakiś typ danych, który zgrupuje wszystkie dane dotyczące kolejki — choć to co robisz to nie kolejka, a zwykła lista dwukierunkowa. Takim typem może być zwykły rekord, który przechowa wskaźnik na głowę listy i na ogon, ew. dodatkowo liczbę węzłów, aby uprościć proces modyfikacji listy:

type
  TList = record
    Head: PElement;
    Tail: PElement;
    Count: Integer;
  end;

Wskaźnik na głowę listy jest obowiązkowy, a ten na ogon listy jest przydatny podczas dodawania węzła na koniec listy — dzięki niemu nie trzeba iterować po całej liście za każdym razem. Rozmiar listy jest przydatny w celu określenia ile elementów posiada — dzięki temu znów można uniknąć iterowania po węzłach listy.

Mając już podstawowe typy danych, teraz Twoim zadaniem jest napisanie pojedynczych procedur i funkcji, które będą operowały na liście — jedna służąca do dodania elementu, inna do usunięcia elementu, jeszcze inna do czyszczenia listy, ładowania danych z pliku itd. Każda z tych procedur/funkcji powinna w pierwszym parametrze przyjąć listę (tu: rekord) i na tej liście operować. Nie mogą one używać zmiennych globalnych, bo takiego kodu nie da się użyć do większej ilości list, a więc to bez sensu.

1

Słuchajcie, jest na tym forum parę osób które mają dużo do powiedzenie w temacie poprawnego pisania kodu. Nie będę teraz przytaczał Nicków bo nie o to chodzi a poza tym i tak wszyscy wiedzą o kogo chodzi.

Nie myśleliście nigdy o jakimś kursie, czy to video na specjalnych do tego platformach (np. Udemy) czy jakiejś książce (np. pdf w formie spersonalizowanej dla każdego odbiorcy)?
Szkoda żeby wasza duża wiedza nie służyła innym, szczególnie że takich materiałów w zasadzie nie ma (a na pewno nie w języku polskim).

Wiem że majątku na tym nie będzie, niestety jest nas coraz mniej.
Z mojej strony zapewniam że będę waszym klientem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1