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 wartość 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 folderze.
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 zapisu. 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” tematu 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. Dobre słowa kluczowe dla wyszukiwarki 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 okna VC++ i sprawdzając, jak naprawdę działa.
Hint:
Przygotowując się na lab. 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 lab. 4 mogą mieć wspólne fragmenty z zadaniami poziomu 2 lab. 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).