Bufor cykliczny – przechowywanie danych i ich późniejszy zapis do pliku

0

Hej,
Otrzymałem ostatnio na laboratoriach z programowania w C takie zadanie do zrobienia w domu:
"Napisz program, który wygeneruje wartości temperatury w skali Celsjusza i zapisze te dane w buforze cyklicznym, a dane usuwane z bufora zapisze do pliku tekstowego."

Zapis do pliku jest dla mnie do zrobienia, jednak nie mam zielonego pojęcia o co chodzi w buforze cyklicznym, ani jak te dane w takim buforze zapisywać. Byłby ktoś na tyle miły i mi wyjaśnił lub chociaż pomógł zrozumieć, w jaki sposób powinienem to zadanie zrobić? Nie wiem również jak do końca zabrać się za wygenerowanie wartości :/
Na zadanie mam jeszcze ponad tydzień, jednak chciałbym ruszyć to wcześniej. Niestety najbliższe konsultacje u prowadzącego mam dopiero w przyszłym tygodniu.

Pozdrawiam :)

2

Bufor cykliczny to taki kontener, który nie ma ostatniego elementu (ani pierwszego) – jest zapętlony, stąd nazwa (cykliczny). Taki bufor jednak można reprezentować zwykłą tablicą – wpisujesz dane i inkrementujesz indeks bieżącego elementu. Jeśli indeks przekroczy zakres tablicy to ustawiasz go na 0 (czyli na pierwszy element) i tu właśnie następuje zapętlenie.

Może on być też zaimplementowany z wykorzystaniem innego kontenera, np. listy jednokierunkowej (wtedy taka zapętlona lista zwie się listą wiązaną). Dzięki temu można bez końca przechodzić do kolejnego węzła.

Natomiast bufor cykliczny ma swój z góry określony rozmiar. Jeśli przyjmiemy, że posiada 32 komórki na dane, to do takiego bufora można zapisać faktycznie 32 dane. Jeśli wrzucisz pod rząd więcej danych, to te wcześniejsze zostaną nadpisane nowymi (takie jest założenie).

Jeśli jeszcze mowa o usuwaniu danych, to faktycznie dane nie są usuwane. Podczas odczytu danych z bufora, pobiera się dane z bieżącej komórki i inkrementuje indeks. Tak więc fizycznego usuwania przeprowadzać nie trzeba, bo nie ma to sensu i szkoda na to czasu procesora.

Najłatwiejszy sposób to użycie tablicy o stałym rozmiarze i dwóch liczb przechowujących indeksy (jeden używany podczas zapisu, a drugi podczas odczytu). Możesz sobie zadeklarować strukturkę i te trzy zmienne w niej zgrupować, coby czytelniej było.

0

Hmm, to raczej popróbuję cokolwiek z tego zrobić z użyciem listy jednokierunkowej. Myślę, że użycie pętli warunkowej if będzie dobrym pomysłem (kiedy element będzie usuwany, to zostanie on zapisany do pliku). Co do generowania wartości - właśnie wpadłem na to, że przecież mogę wygenerować pseudolosowe liczby z pewnego zakresu na podstawie zegara. Z kolei ilość generowanych wartości będzie określona przez użytkownika.
Jak się pomyśli chwilę, to nie wydaje się to takie złe. Dzięki wielkie za pomoc, bo nie potrafiłem zrozumieć samej idei bufora cyklicznego :)

0
Roberto Benigni napisał(a):

Hmm, to raczej popróbuję cokolwiek z tego zrobić z użyciem listy jednokierunkowej.

Trudniejsza opcja, ale ciekawsza. ;)

Myślę, że użycie pętli warunkowej if będzie dobrym pomysłem […]

A po co? Przy liście jednokierunkowej jest o tyle łatwo, że tworzysz sobie z góry np. 32 węzły, ostatni spinasz z pierwszym i gotowe. Teraz wystarczy wskaźnik na głowę listy wpisać do dodatkowych dwóch wskaźników i możesz korzystać z listy. Czyli potrzebujesz trzech zmiennych:

  • head – pointer na głowę listy (lub dowolny inny węzeł, bo to nie ma znaczenia w liście wiązanej),
  • toRead – pointer na bieżący węzeł do odczytu,
  • toWrite – pointer na bieżący węzeł do zapisu.

Przy zapisie danych do bufora, wpisujesz dane do węzła toWrite i ustawiasz mu wskaźnik na kolejny. Przy odczycie pobierasz dane z węzła toRead i też ustawiasz mu wskaźnik na kolejny. Nic trudnego.

Przyda się też dodać zabezpieczenia, aby nie można było odczytać więcej danych niż faktycznie znajduje się w buforze. Możesz sobie zadeklarować dodatkową liczbową zmienną z licznikiem, ale możesz też sprawdzać wskaźniki toRead i toWrite – jeśli ich adresy są sobie równe, to bufor jest pusty.

[…] (kiedy element będzie usuwany, to zostanie on zapisany do pliku).

Pamiętaj, że usunięcie danych to nic innego jak ich odczytanie.

Z kolei ilość generowanych wartości będzie określona przez użytkownika.

Jeśli tak sobie to zrobisz, to rozmiar bufora będzie liczbą podaną przez użytkownika.

0

Pamiętaj, że usunięcie danych to nic innego jak ich odczytanie.

A racja, zapomniałem o tym. Dzisiaj już robiłem listę dwukierunkową, na której również dane mi się usuwały przy odczytywaniu. Wtedy też zapomniałem, że takie coś ma miejsce. Można powiedzieć, że dopiero zaczynam programować i nie zawsze jeszcze orientuję się, co w danej chwili się dzieje, a czasem najprostsze fakty mi z głowy uciekają.

0

A i jeszcze jedno – jeśli sprawdzanie stanu bufora (pusty/niepusty) chcesz przeprowadzić na podstawie porównania adresów wskaźników, to jeden węzeł trzeba zarezerwować.

W takim przypadku, jeśli n to rozmiar podany przez użytkownika, to musisz stworzyć n+1 węzłów. Czyli dla bufora o rozmiarze 10 (aby móc przechować 10 liczb) musisz zadeklarować 11 węzłów.

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