Temat: Kolejka FIFO 1 Wstęp teoretyczny

Transkrypt

Temat: Kolejka FIFO 1 Wstęp teoretyczny
Instrukcja
Podstawy programowania 2
laboratoryjna
Temat: Kolejka FIFO
3
Przygotował: mgr inż. Tomasz Michno
1 Wstęp teoretyczny
Kolejki są strukturami, które działają jak bufory – zapamiętują dane na pewien czas,
a następnie pozwalają na ich pobranie w odpowiedniej kolejności. Dostęp do danych jest
ograniczony, udostępniane są jedynie funkcje odkładające i pobierające dane.
Kolejki możemy podzielić m. in. na:
•
LIFO (Last In, First Out – ostatni przyszedł, pierwszy wyszedł) – są to kolejki, w których
ostatnio odłożony element jest pierwszym który możemy pobrać, przykładem jest
omawiany na poprzednich laboratoriach stos.
•
FIFO (First In, First Out – pierwszy przyszedł, pierwszy wyszedł) – kolejki, w których dane
są pobierane w kolejności ich odkładania.
1.1 Kolejka FIFO
Kolejki FIFO działają w sposób identyczny jak kolejki np. w marketach – osoba znajdująca
się na początku kolejki zostanie obsłużona jako pierwsza. W przeciwieństwie do stosu, do obsługi
kolejki FIFO potrzebujemy dwóch wskaźników: na początek i na koniec kolejki. Zwyczajowo
początek nazywany jest głową (head), a koniec ogonem (tail).
głowa
1
ogon
2
3
4
Wskaźnik na
początek
5
6
Wskaźnik na
koniec
Przykład 1.
Kolejka przechowująca znaki. W celu zwiększenia wygody obsługi, wskaźniki na początek i koniec
zostały zebrane w rekordzie o nazwie KOLEJKAFIFO.
type
PTRELEMENT = ^ELEMENT;
ELEMENT
=
record
znak
: char;
nastepny
: PTRELEMENT;
end;
KOLEJKAFIFO = record
glowa : PTRELEMENT;
ogon
: PTRELEMENT;
end;
var
kolejka : KOLEJKAFIFO;
procedure dodaj(var k:KOLEJKAFIFO; znak : char);
var
el : PTRELEMENT;
begin
New(el);
el^.znak:=znak;
el^.nastepny:=nil;
if(k.glowa=nil) then
begin
k.glowa:=el;
writeln('Tworze kolejke');
end
else
begin
k.ogon^.nastepny:=el;
end;
k.ogon:=el;
writeln('Odlozono w kolejce znak ', znak);
end;
procedure obsluz(var k:KOLEJKAFIFO; var znak : char);
var
tmp : PTRELEMENT;
begin
if(k.glowa=nil) then
begin
writeln('Kolejka jest pusta');
exit;
end;
tmp:=k.glowa^.nastepny;
znak:=k.glowa^.znak;
Dispose(k.glowa);
k.glowa:=tmp;
writeln('Obsluzono w kolejce znak ', znak);
end;
2 Zadania
1. Zasymuluj pracę działania marketu, rozbudowując załączony program market.pas.
Założenia:
–
każdy z produktów jest reprezentowany jako typ rekordowy składający się z nazwy
produktu i jego ceny
–
każdy z klientów jest reprezentowany jako rekord składający się z:
płci, wieku, tablicy zakupionych produktów oraz liczby zakupionych produktów
–
przy kasie tworzy się kolejka (FIFO) 50-ciu klientów, każdy z klientów jest obsługiwany
w następujący sposób: wyświetlany jest jego wiek, płeć oraz suma zakupionych produktów
2. Dodaj obsługę następującej sytuacji:
W markecie została otworzona druga kasa i kolejka 50-ciu klientów podzieliła się na dwie
kolejki po 20 i po 30 osób. Po pewnym czasie jedna z kas uległa uszkodzeniu i obie kolejki
są obecnie obsługiwane na przemian przez działającą kasę (jedna osoba z pierwszej kolejki,
następnie jedna osoba z drugiej itd.). Dodaj do rekordu klienta pole określające do której
kolejki należy, a następnie wyświetl je podczas obsługi przez kasjerkę.
3. Dodaj do programu wyświetlanie utargu po obsłużeniu wszystkich klientów oraz listę 3
najczęściej kupowanych produktów.
4. * W markecie został ogłoszony konkurs polegający na wrzuceniu kuponu do specjalnej
skrzynki, w której co 5-ty klient wygrywa. Po zapłaceniu za zakupy w kasie losowa liczba
klientów ustawia się w kolejce do skrzynki. Program powinien przy obsłudze kolejki FIFO
wyświetlić informację czy klient wygrał (jeśli tak, powinien podać również jego wiek
i płeć).