Witam. Mam prośbę, czy mógłby ktoś pomóc, napisać co tutaj mam zmienić aby osiągnąć taki efekt:
Bufor cykliczny na jednowymiarowej tablicy
Najprostszy bufor cykliczny o stałym rozmiarze można zrealizować na bazie tablicy jednowymiarowej.
Z tablicą związane będą dwa indeksatory "in" oraz "out". Ten pierwszy wskazuje w które miejsca należy wpisać nowy element, ten drugi z której pozycji możemy odczytać element.
Gdy "in"="out" oznacza, że bufor jest pusty. Kiedy dodajemy element przesuwamy indeksator "in" o jeden dalej. Gdybyśmy doszli do końca tablicy należy wrócić na jej początek (obliczyć modulo).
"In" powinien wskazywać zawsze na puste miejsce. Jeżeli "Out" byłby tylko o jeden dalej (uwzględniając modulo czyli "zapętlenie" w tablicy) niż "In" oznaczałoby to zapełnioną tablicę.
W takiej sytuacji nie powinniśmy dodawać elementów, gdyż indeksator "In" musiałby się zrównać z "out", co oznaczałoby pusty bufor.Należy napisać program bazujący na 8 elementowym buforze cyklicznym.
Program powinien posiadać menu, w którym użytkownik wybiera sobie rodzaj działania, zakolejkowanie lub zdjęcie z kojki jednego elementu lub wszystkich.Za każdą operacją wyświetlić zawartość bufora oraz indeksatory in oraz out. Gdy element jest zdejmowany z kolejki, także wyświetlić ten element.
W przypadku, gdy podczas dodawania kolejka jest pełna, należy zdjąć 4 elementy naraz a następnie dodać żądany element.Elementy będą typu char.
program zadanie1;
uses crt;
const
max = 8;
type
queue = record
element: array[1 .. max] of char;
first, last:byte;
end;
var
kolejka: queue;
ne: byte;
znak: char;
function addone(i: byte):byte;
begin
addone := i mod max + 1;
end;
procedure makenil(var q: queue);
begin
q.first := 1;
q.last := max;
end;
function empty(const q: queue):boolean;
begin
if addone(q.last) = q.first then
empty := true
else
empty:=false;
end;
function firstone(const q: queue):char;
begin
firstone:=' ';
if empty(q) then
exit
else
firstone := q.element[q.first];
end;
procedure dequeue(var q: queue);
begin
if empty(q) then
exit
else
q.first := addone(q.first);
end;
procedure enqueue(var q: queue; a: char);
var
i: byte;
begin
if addone(addone(q.last)) = q.first then
begin
for i := 0 to 3 do
dequeue(q);
end;
q.last := addone(q.last);
q.element[q.last] := a;
end;
procedure wyswietl(q: queue);
var
i: byte;
begin
{
writeln('first: ', q.first, 'last: ', q.last);
for i := 1 to 9 do
begin
write(q.element[i], i, ' ');
end;
for i:=q.first to q.last do
begin
write(q.element[i], i, ' ');
end;
}
write('kolejka ->');
while not empty(q) do
begin
znak := firstone(q);
//zdejmij(kolejka,znak);
dequeue(q);
write(znak, #32);
//wyswietl(kolejka);
end;
writeln;
write('indeksatory ->');
for i := 0 to 8 do
begin
if i = q.first then
begin
write('o ')
end
else
if i = q.last then
write('i ')
else
write(' ');;
end;
writeln;
end;
procedure dodaj(var q: queue; a: char);
var
i: byte;
begin
if addone(addone(q.last)) = q.first then
begin
for i := 0 to 3 do
dequeue(q);
end;
q.last := addone(q.last);
q.element[q.last] := a;
end;
procedure zdejmij(var q: queue; var a: char);
begin
a := firstone(q);
if empty(q) then
exit
else
q.first := addone(q.first);
end;
begin
clrscr;
makenil(kolejka);
writeln('Ile elementów umieścić w kolejce: ');
readln(ne);
while ne > 0 do
begin
readln(znak);
enqueue(kolejka, znak);
dec(ne);
wyswietl(kolejka);
end;
clrscr;
writeln('Elementy umieszczone w kolejce: ');
while not empty(kolejka) do
begin
znak := firstone(kolejka);
//zdejmij(kolejka,znak);
dequeue(kolejka);
write(znak, #32);
//wyswietl(kolejka);
end;
readln;
end.
Ten kod jest naprawdę "pomieszany" ale sporo różnych kombinacji tutaj robiłem i taki jest efekt.
Szczerze powiedziawszy, tyle zrobiłem ale nie mam pojęcia co tutaj napisałem i co mam zmienić.
Proszę bardzo o pomoc, sprawa bardzo pilna.