====== 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
struct student
{
char nazwisko[30];
char imie[30];
int indeks;
float ocena;
};
==== Tworzenie i używanie zmiennej strukturalnej ====
Definicja zmiennej o nazwie ''stefan'', która jest typu ''struct student''
struct student stefan;
Przypisanie wartości 4.5 do pola ''ocena''
stefan.ocena = 4.5;
Odczyt wartości z pola ''indeks''
x = stefan.indeks;
==== 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''.
typedef struct student STUDENT;
Deklaracja nowej zmiennej ''zenon'' typu ''struct student'' może teraz wyglądać w taki sposób:
STUDENT zenon;
===== Przykład =====
#include
#include
#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);
}
===== Ć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