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 <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 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 - Zapis i odczyt bazy danych

Rozszerz działanie programu z zajęć realizującego prostą 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żdorazowym 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 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 z zajęć baza.c zawierający rozwiązanie ćwiczenia baza danych.

Rozwiązanie umieść w Moodle pod adresem: https://moodle.umk.pl/WFAIIS/mod/assign/view.php?id=7594