PO2020: Wejściówka na Lab.7

Przeprowadzono pomiary temperatury w terenie za pomocą czterech czujników temperatury w okresie od 10 lutego do 12 marca. Pomiary były wykonywane przez każdy z czujników co około 5 min. Mierzone wartości zostały zapisane w pliku ( [do pobrania] aby zapisać plik na dysk lokalny użyj prawego przycisku myszki i wybierz opcję „Zapisz element docelowy jako..” lub „zapisz link jako..”). Plik zawiera listę rekordów, gdzie rekord to kolekcja kilku dowolnych wartości, każda ściśle określonego typu, występujących w ustalonej, zawsze tej samej kolejności. Każdy rekord w pliku reprezentuje pojedynczy pomiar i składa się z czterech wartości zapisanych w jednym wierszu pliku: nr pomiaru, nr czujnika, data i czas, oraz zmierzona temperatura, które rozdzielone są znakiem spacji.

W funkcji main pobierz od użytkownika nazwę pliku z danymi, otwórz ten plik w trybie do odczytu, a następnie wczytaj zawartość pliku do czterech list dynamicznych dwukierunkowych, po jednej liście dla każdego z czterech czujników. Kod ma działać następująco: po odczytaniu z pliku każdego kolejnego rekordu sprawdza, z którego czujnika pochodzi pomiar i zapisuje go do odpowiedniej listy, tak aby w każdej z list znalazły się rekordy pochodzące od tylko jednego czujnika.

Typ danych do przechowywania jednego rekordu ma następującą budowę:

struct pomiar {
	unsigned int nr_pomiaru;
	unsigned int nr_czujnika;
	char data_i_czas[20];
	double temp;
	struct pomiar *nast;
	struct pomiar *poprz;
};

Zadeklaruj też typ strukturalny zawierający cztery wskaźniki typu struct pomiar*. W zmiennej strukturalnej takiego typu zapisz głowy czterech tych list. Po zakończeniu czytania zamknij plik wejściowy. Przyjmij, że dane w pliku są zawsze poprawne, tj. wiersz zawsze zawiera czwórkę prawidłowych napisów w tej samej kolejności.

Wypisz w oknie konsoli, ile pomiarów pochodzi z każdego z czujników, tj. jakie są rozmiary każdej z list oraz jakie są wartości najwyższej i najniższej zmierzonej temperatury dla każdego z czujników.

Następnie scal elementy z wczytanych czterech list w jedną listę dynamiczną dwukierunkową. W tym celu zadeklaruj wskaźnik typu struct pomiar* do przechowywania głowy nowej listy. Przeglądaj kolejno pierwsze elementy z czterech list i przenoś element o najwcześniejszym czasie odczytu do listy wspólnej. Sprawdzanie i przenoszenie powtarzaj aż do wyczerpania wszystkich elementów z czterech list. Nie alokuj nowych zmiennych dynamicznych reprezentujących pomiary i nie kopiuj żadnych danych, a jedynie wyjmuj elementy z jednej listy i dodawaj do drugiej poprzez działanie na wartościach pól nast i poprz. Na koniec działania programu cztery listy utworzone na początku powinny być puste.

Zapisz powstałą wspólną listę w takim samym formacie, jaki miał plik wejściowy, do pliku o nazwie pobranej od użytkownika, ale innej niż nazwa pliku wejściowego.

Po zakończeniu zapisywania zamknij pliki, usuń elementy z listy wspólnej i zakończ działanie programu. Po zakończeniu sprawdź plik wynikowy, tj. otwórz i porównaj jego zawartość z plikiem wejściowym. Kolejność rekordów w obydwu plikach powinna być identyczna.

Do obsługi plików wykorzystaj funkcje fopen, fclose, fprintf, fscanf i feof (lub odpowiadających im wersji bezpiecznych). Wszystkie z biblioteki: stdio.h.