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ć).