Zadeklaruj strukturalny typ danych 'struct para’ zdefiniowany tak, że zmienna takiego typu może przechowywać dwie wartości: napis oraz liczbę. W funkcji 'main’ zadeklaruj lokalną tablicę o długości 5, zawierającą elementy typu 'struct para’. Następnie napisz funkcję 'wiersz’, która będzie odczytywała dane z poszczególnych wierszy pliku. W pojedynczym wierszu zapisane są kolejno: nr indeksu studenta, nazwisko i ocena. Funkcja odczytuje dane z jednego wiersza, następnie ignoruje odczytany nr indeksu a do komórki tablicy wpisuje w odpowiednich polach tylko nazwisko i ocenę. Przyjmij, że w pliku może być dowolna liczba wierszy (jest możliwe również, że plik jest pusty), ale nie większa niż rozmiar tablicy. Przyjmij też, że dane w pliku są zawsze poprawne, tj. wiersz zawsze zawiera trójkę prawidłowych napisów w tej samej kolejności: numer, nazwisko i ocena.
Nagłówek funkcji ma wyglądać tak:
int wiersz(FILE* f, struct para *p)
gdzie 'f’ to wskaźnik do otwartego pliku, natomiast 'p’ to wskaźnik do komórki tablicy, do której mają zostać zapisane dane z jednego odczytanego wiersza pliku. Funkcja zwraca wartość zero, jeżeli odczyt zakończył się pomyślnie, a 1, jeżeli nie udało się odczytać kolejnej porcji danych ze względu na koniec pliku.
Przygotuj sobie odpowiedni plik tekstowy z prawidłowymi danymi w kilku wierszach i umieść go we właściwym katalogu.
W funkcji 'main’ pobierz od użytkownika nazwę pliku z danymi oraz nazwę pliku wyjściowego. Otwórz plik z danymi w trybie do odczytu, a plik wynikowy w trybie do odczytu. Następnie w pętli za pomocą funkcji 'wiersz’ odczytaj kolejne wiersze pliku zapisując dane w kolejnych komórkach tablicy. Każdą odczytaną komórkę tablicy zapisz od razu do pliku wynikowego tak, aby w kolejnych wierszach pliku znalazły się pary: nazwisko i ocena. Jeżeli nie cała tablica została zapełniona danymi, zapisz tylko tyle, ile zostało odczytanych z pliku wejściowego. Po zakończeniu pętli zamknij pliki, wyświetl w oknie konsoli zawartość tablicy i zakończ działanie programu.
Do obsługi plików wykorzystaj funkcje: 'fopen’, 'fclose’, 'fprintf’, 'fscanf’ i 'feof’. Wszystkie z biblioteki: 'stdio.h’.
Przetestowany, działający program uploaduj do systemu moodle jako rozwiązanie zadania „wejściówka” ćwiczenia nr 4.
Różne przykłady zadań i problemów dotyczących tego rodzaju zastosowań można znaleźć w podręcznikach lub na forach, których tematem jest programowanie w ANSI C. Wujek gugiel wspiera szukających. Dobre słowa kluczowe na najbliższy tydzień to: 'fopen’, 'fclose’, 'fprintf’, 'fscanf’ i 'feof’ w połączeniu z 'ansi c’. Oczywiście niczego nie należy brać bezkrytycznie, każdy kawałek kodu warto zweryfikować wklejając do visuala i sprawdzając, jak naprawdę działa.
Hint:
Przygotowując się na ćwiczenia nr 4 warto przypomnieć sobie jak skonstruowany jest C-napis, oraz zapoznać się z funkcjami:
int isalpha(int c)
int islower(int c)
int isupper(int c)
int tolower(int c)
int toupper(int c)
Funkcje znajdują się w bibliotece ctype.h
i służą do sprawdzania, czy dany znak jest literą i jakiego rodzaju (dużą czy małą) oraz do zamiany dużych liter na małe i małych na duże. Zadania pierwszego poziomu na ćwiczeniach 4 będą miały wspólne fragmenty z zadaniami poziomu 2 ćwiczeń nr 3, tj. będą dotyczyły konwertowania napisów do postaci zaszyfrowanych wg różnych reguł, oraz oczywiście będą dotyczyły pracy na plikach tekstowych (materiał ostatnio omawiany na wykładzie).