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 (zobacz też Wikipedia). 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 listy dynamicznej jednokierunkowej. Po zakończeniu czytania zamknij plik. Przyjmij, że dane w pliku są zawsze poprawne, tj. wiersz zawsze zawiera czwórkę prawidłowych napisów w tej samej kolejności.
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;
};
Następnie rozdziel elementy z wczytanej listy na cztery listy dynamiczne jednokierunkowe, po jednej liście dla każdego z czujników. W tym celu zadeklaruj cztery nowe głowy list, tj. wskaźniki typu struct pomiar*
, po czym przejrzyj kolejno wszystkie elementy, sprawdź z jakiego czujnika pochodzi pomiar i przenieś ten element do listy właściwej dla tego czujnika. Nie alokuj nowych zmiennych dynamicznych reprezentujących pomiary i nie kopiuj żadnych danych, a jedynie wyjmuj elementy z jednej listy i dodawaj do jednej z pozostałych czterech. Na koniec działania lista źródłowa powinna być pusta.
Wypisz w oknie konsoli, ile pomiarów pochodzi z każdego z czujników, tj. jakie są rozmiary każdej z list.
Zapisz powstałe cztery listy do czterech plików o nazwach zaczynających się od tego samego ciągu znaków. W tym celu najpierw pobierz od użytkownika początek nazwy plików do zapisu, następnie dla każdego z plików dodaj do jego nazwy na jej końcu cyferkę odpowiadają numerowi czujnika i dodaj „.txt” (przykład: użytkownik podał „abc”, pliki nazywają się „abc1.txt”, abc2.txt”, „abc3.txt” i „abc4.txt”). Zapisz do każdego z plików zawartość odpowiadającej mu listy w takim samym formacie jaki miał plik wejściowy.
Po zakończeniu zapisywania zamknij pliki, usuń elementy z list i zakończ działanie programu.
Pobierz plik tekstowy z danymi wejściowymi i umieść go we właściwym katalogu. Do obsługi plików wykorzystaj funkcje fopen
, fclose
, fprintf
, fscanf
i feof
(lub odpowiadających im wersji bezpiecznych). Wszystkie z biblioteki: stdio.h
.
Hint: Przypominam o samodzielnym pisaniu programów stanowiących rozwiązania zadań. Programy mające zbyt duże podobieństwo będą oceniane na zero punktów bez rozstrzygania, kto był prawdziwym autorem, a kto chciał tylko skorzystać z jego życzliwości. Zapraszam do obejrzenia raportu z MOSS (Measure Of Software Similarity) dla programów nadesłanych jako rozwiązania zadania nr 5 poziom I. Pliki zostały zanonimizowane, ale myślę, że mimo to autorzy rozpoznają swoje programy.