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;
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);
}
  • 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)

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:

  1. wyswietl - wyświetlenie całej bazy danych
  2. dodaj - dodanie nowego rekordu do bazy danych
  3. usun - usunięcie rekordu z bazy danych wskazanego przez numer
  4. zamien - modyfikacja zawartości rekordu wskazanego przez numer
  5. 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