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łkiwskaznik–>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
- 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); }
Ćwiczenia
- zaimplementuj funkcję o nazwie
wyswietl
, która wypisuje na standardowym wyjściu wartości wszystkich pól zmiennej strukturalnej typustruct osoba
. - zaimplementuj funkcję
wczytaj
, która zwraca zmienną typustruct 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 danychdodaj
- dodanie nowego rekordu do bazy danychusun
- usunięcie rekordu z bazy danych wskazanego przez numerzamien
- modyfikacja zawartości rekordu wskazanego przez numerzamknij
- 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: 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 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