Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Struktury ===== * struktura zawiera w sobie zbiór zmiennych dowolnego typu * składowe struktury (pola) identyfikowane są za pomocą nazwy * dostęp do pola zmiennej strukturalnej możliwy jest za pomocą operatora . (kropka) ''zmienna.pole''. \\ W przypadku wskaźnika pokazującego strukturę w tym samym celu używa się strzałki ''wskaznik-->pole'' * struktura stanowi jednolity obiekt, np. strukturę można kopiować za pomocą operatora przypisania (''a=b''). Struktura może być argumentem funkcji oraz wartością zwracaną z funkcji ==== Deklaracja typu strukturalnego ==== Poniższy fragment kodu deklaruje nowy typ o nazwie ''struct student'' składający się z 4 pól <code C> struct student { char nazwisko[30]; char imie[30]; int indeks; float ocena; }; </code> ==== Tworzenie i używanie zmiennej strukturalnej ==== Definicja zmiennej o nazwie ''stefan'', która jest typu ''struct student'' <code C> struct student stefan; </code> Przypisanie wartości 4.5 do pola ''ocena'' <code C> stefan.ocena = 4.5; </code> Odczyt wartości z pola ''indeks'' <code C> x = stefan.indeks; </code> ==== Instrukcja typedef ==== Za pomocą **typedef** możemy zdefiniować nową nazwę typu. Przykładowo, pozwala ona skrócić nazwę typu strukturalnego. Poniższa instrukcja definiuje typ o nazwie ''STUDENT'', który jest od teraz równoważny typowi ''struct student''. <code C> typedef struct student STUDENT; </code> Deklaracja nowej zmiennej ''zenon'' typu ''struct student'' może teraz wyglądać w taki sposób: <code C> STUDENT zenon; </code> ===== Przykład ===== <file C struct.c> #include <stdio.h> #include <string.h> #define MAX 256 // deklaracja typu struct osoba struct osoba { char nazwisko[MAX]; char imie[MAX]; int wiek; }; typedef struct osoba DANE; int main() { struct osoba agent; DANE student; struct osoba *wsk; strcpy(agent.nazwisko, "Bond"); strcpy(agent.imie, "James"); agent.wiek = 33; strcpy(student.nazwisko, "Kowalski"); strcpy(student.imie, "Jan"); student.wiek = 21; printf("Imie %s\nNazwisko %s\nWiek %d\n\n", agent.imie, gent.nazwisko, agent.wiek); printf("Imie %s\nNazwisko %s\nWiek %d\n\n", student.imie, student.nazwisko, student.wiek); wsk = &agent; strcpy((*wsk).nazwisko, "Kloss"); strcpy(wsk->imie, "Hans"); wsk->wiek--; printf("Imie %s\nNazwisko %s\nWiek %d\n\n", agent.imie, agent.nazwisko, agent.wiek); } </file> ===== Ćwiczenia ==== * zaimplementuj funkcję o nazwie ''**wyswietl**'', która wypisuje na standardowym wyjściu wartości wszystkich pól zmiennej strukturalnej typu ''struct osoba''. * zaimplementuj funkcję ''**wczytaj**'', która zwraca zmienną typu ''struct osoba'' wypełnioną wartościami podanymi przez użytkownika na standardowym wejściu (terminalu) ===== Ćwiczenie: baza danych ===== Zaimplementuj prostą bazę danych osobowych składającą się z sekwencji rekordów zawierających dane osobowe: imię, nazwisko i wiek osób umieszczonych w bazie danych. Struktury zawierające dane przechowuj w odpowiedniej tablicy. Dla uproszczenia zakładamy, że maksymalna ilość rekordów nie przekroczy 1000. Program po uruchomieniu wypisuje menu z możliwymi akcjami do wykonania po podaniu liczby od 1 do 5: - ''wyswietl'' - wyświetlenie całej bazy danych - ''dodaj'' - dodanie nowego rekordu do bazy danych - ''usun'' - usunięcie rekordu z bazy danych wskazanego przez numer - ''zamien'' - modyfikacja zawartości rekordu wskazanego przez numer - ''zamknij'' - zamkniecie programu Zaimplementuj wszystkie funkcjonalności opisane w powyższym menu. Zadbaj o obsługę sytuacji wyjątkowych, np. gdy podczas usuwania rekordu użytkownik poda niepoprawny numer. Po wykonaniu akcji 1, 2, 3 lub 4 menu ponownie jest wyświetlane i użytkownik ponownie może wykonać jedną z akcji. Wybranie pozycji nr 5 kończy działanie programu. ==== Zadanie ==== Rozszerz działanie programu z zajęć realizującego prosta bazę danych osobowych (zob. ćwiczenie: [[https://www.is.umk.pl/~grochu/wiki/doku.php?id=13_struct#cwiczeniebaza_danych|baza danych]]) dodając następujące funkcjonalności: * przed zamknięciem programu (po wybraniu opcji 5 z menu) aktualny stan bazy danych (wszystkie rekordy) jest zapisywany w pliku znajdującym się w bieżącym katalogu programu. Dane mogą być zapisane w dowolnej postaci, ale w taki sposób, aby możliwe było na podstawie tego pliku późniejsze odtworzenie zawartości bazy danych w programie. * przy każdym uruchomieniu programu, przed wypisaniem menu, program sprawdza, czy w bieżącym katalogu znajduje się plik z zapisanym ostatnio stanem bazy danych. Jeżeli plik istnieje to baza danych w programie zostaje wypełniona zawartością tego pliku. Jeżeli plik nie istnieje to program rozpoczyna pracę z pusta listą rekordów. Do rozwiązania zadania można wykorzystać plik {{zajecia:pp1_2021_1:src:baza.c|baza.c}}, który zawiera program realizujący treść ćwiczenia z laboratorium. Rozwiązanie umieść w Moodle pod adresem: https://moodle.umk.pl/WFAIIS/mod/assign/view.php?id=2182