Struktury ( zwane w innych językach programowania rekordami) stanowią typ służący do przetwarzania informacji powiązanych ze sobą. Definicja typu strukturowego ma następującą postać struct nazwatypu { typpola1 nazwapola1; }; typpola2 nazwapola2;.. typpolan nazwapolan; Tak więc definicja typu strukturowego składa się ze słowa kluczowego struct, po którym następuje nazwa danego typu strukturowego ( czasami określana jako etykieta), po czym po nawiasie otwierającym występują typy poszczególnych składowych struktury oraz ich nazwy. Składowe typu strukturowego zwane są polami struktury.
Definicja typu strukturowego kończy się nawiasem zamykającym i średnikiem. W typie strukturowym mogą wystąpić pola, które same mogą być typu strukturowego, mówimy wtedy o tzw. typie strukturowym zagnieżdżonym. Nazwy pól muszą być różne w ramach jednego typu strukturowego, jednak można stosować te same nazwy w ramach innych typów strukturowych. Nazwa pola struktury może być taka sama jak nazwa danego typu strukturowego czy też zmiennej strukturowej.
Przykład. W ramach jednego typu danych chcemy przechowywać pewne informacje o pracownikach. Zdefiniujemy uproszczony typ strukturowy pozwalający na przechowywanie takich informacji ( w rzeczywistych sytuacjach może być konieczne stosowanie nawet kilkudziesięciu pól). struct pracownik { char nazwisko [20]; char imie [20]; int wiek; double dochod; } rek1, rek2; rek1, rek2 są zmiennymi typu pracownik. Zmienne strukturowe można też zdefiniować w sposób następujący: struct pracownik rek3, rek4, rek5;
Język ANSI C-pliki Można też zdefiniować tablicę struktur struct pracownik pracownicy [20]; Zmienna pracownicy jest tablicą struktur składającą się z 20 struktur typu pracownik. Dla realizacji dostępu do pól typu strukturowego wprowadzono w języku C specjalny operator dostępu do pól struktury operator "." ( kropka). Operator ten jest stosowany w sposób następujący: jeśli mamy zmienną strukturową rek1 typu pracownik, to możemy wprowadzić wartość do jej pola dochod w sposób następujący: rek1.dochod=1500; W ogólnym przypadku, polami zmiennych strukturowych możemy posługiwać się jak zmiennymi takiego typu, jak typ danego pola struktury.
Wprowadzanie/wyprowadzanie informacji z /do pól zmiennych strukturowych cz. 1 Jak zaznaczono powyżej, pola takie można stosować, jako zmienne danego typu rek2.dochod=1000; rek2.wiek=25; pracownicy[0].dochod=1200; pracownicy [0].wiek=24; scanf("%f",&rek3.dochod); scanf("%d",&rek3.wiek); 1. Pola typu numerycznego ( typy całkowite i typy rzeczywiste) scanf ("%lf",&pracownicy[1].dochod); scanf ("%d", &pracownicy[1].wiek);
Wprowadzanie/wyprowadzanie informacji z /do pól zmiennych strukturowych cz. 2 2. Pola typu tablica znaków strcpy (rek1.nazwisko,"kowalski"); scanf("%s",rek2.nazwisko); gets( rek3.nazwisko); Wyprowadzanie informacji odbywa się podobnie jak dla innych zmiennych. printf ("\n %d ", rek1.dochod); printf("\n %s ", rek1.nazwisko);
Inicjalizacja tablic struktur Przykład. Inicjalizacja tablicy struktur typu student struct student { char nazwisko[20]; char imie [20]; int rok studiow; char wydzial[20]; }; struct student studenci[3]=\ { {"Kowalski","Marcin",2, "EiA"}, {"Iksiński","Andrzej",2,"EiA"}, {"Malinowski","Dariusz,2,"EiA"} };
Przykład. Program rekordy1 wczytujący i drukujący pojedyncze struktury. (cz.1) #include <stdio.h> #include <string.h> // program rekordy1 wczytuje dane do struktur i drukuje int main(int argc, char **argv) { struct student { char nazwisko[20]; char imie [20]; int rokstudiow; char wydzial[20]; }; struct student student1, student2; /* Bezpośrednie nadawanie wartości polom struktur */ strcpy(student1.nazwisko,"kowalski"); strcpy(student1.imie,"jan"); student1.rokstudiow=2; strcpy(student1.wydzial,"eia");
// Program rekordy1 cz. II /* Do wczytywania pól struktury student 2 z klawiatury zastosowano trzy różne funkcje wczytywania pól typu tablica znaków, by pokazać różne sposoby wczytywania takich pól */ printf ("\n Podaj dane 2-go studenta "); printf ("\n Nazwisko: "); scanf("%s",student2.nazwisko); printf ("\n Imie: "); fflush(stdin); fgets(student2.imie,15,stdin); printf("\n Rok studiow :"); scanf("%d",&student2.rokstudiow); printf ("\n Wydział: "); scanf("%s",student2.wydzial);
// program rekordy1 cz. III /* Drukowanie struktur student1 i student2 */ printf("\n\n Dane studenta 1 "); printf("\n Nazwisko :%s", student1.nazwisko); printf("\n Imie :%s", student1.imie); printf("\n Rok studiow :%d", student1.rokstudiow); printf("\n Wydzial :%s", student1.wydzial); printf("\n\n\n Dane studenta 2 "); printf("\n Nazwisko :%s", student2.nazwisko); printf("\n Imie :%s", student2.imie); printf(" Rok studiow :%d", student2.rokstudiow); printf("\n Wydzial :%s", student2.wydzial); getch(); return 0; }
Struktury zagnieżdżone Struktury zagnieżdżone to takie struktury w których przynajmniej jedno z pól jest typu strukturowego. struct nazwatypu { typpola1 nazwapola1; struct nazwatypustrukturowego nazwapola2; typpolan } ;.. nazwapolan;
Przykład. Definicja typu strukturowego zagnieżdżonego. struct data { int dzien; int miesiac; int rok; }; struct danestudenta { char nazwisko[20]; char imie [20]; struct data dataur ; int rokstudiow; char wydzial[20]; }; struct danestudenta danestudenta1, danestudenta2;
Przykład. Program rekordy2 wczytujący dane do tablicy struktur i drukujący tablicę struktur. int main(int argc, char **argv) { struct data { int dzien; int miesiac; int rok; }; struct dane_studenta { char nazwisko[20]; char imie [20]; struct data dataur; int rokstudiow; char wydzial[20]; }; struct danestudenta studenci[4];
// Program rekordy2 cz. II int i; /* Bezpośrednie nadawanie wartości polom tablicy struktur */ strcpy(studenci[0].nazwisko,"kowalski"); strcpy(studenci[0].imie,"jan"); studenci[0].rokstudiow=2; studenci[0].dataur.dzien=2; studenci[0].dataur.miesiac=5; studenci[0].dataur.rok=1990; strcpy(studenci[0].wydzial,"eia"); strcpy(studenci[1].nazwisko,"nowak"); strcpy(studenci[1].imie,"andrzej"); studenci[1].rokstudiow=2; studenci[1].dataur.dzien=2; studenci[1].dataur.miesiac=6; studenci[1].dataur.rok=1991; strcpy(studenci[1].wydzial,"eia");
// program rekordy2 cz. III for (i=2;i<4;i++) { printf ("\n Podaj dane studenta %i",i+1); printf ("\n Nazwisko: "); scanf("%s",studenci[i].nazwisko); fflush(stdin); printf ("\n Imie: "); scanf("%s",studenci[i].imie); fflush(stdin); printf("\n Podaj date urodzenia "); printf("\n dzien :"); scanf ("%d",&studenci[i].dataur.dzien); printf("\n miesiac :"); scanf ("%d",&studenci[i].dataur.miesiac); printf("\n rok :"); scanf ("%d",&studenci[i].dataur.rok); printf("\n Rok studiow :"); scanf("%d",&studenci[i].rokstudiow); printf ("\n Wydział: "); scanf("%s",studenci[i].wydzial); fflush(stdin);
// Program rekordy2 cz. IV /* Drukowanie tablicy struktur */ for (i=0;i<4;i++) { printf("\n\n Dane studenta %d ", i+1); printf("\n Nazwisko :%s", studenci[i].nazwisko); printf("\n Imie :%s", studenci[i].imie); printf(" data urodzenia :%d.%d.%d ",\ studenci[i].dataur.dzien,\ studenci[i].dataur.miesiac,studenci[i].dataur.rok); printf("\n Rok studiow :%d", studenci[i].rokstudiow); printf("\n Wydzial :%s", studenci[i].wydzial); } getchar(); return 0; }