You are on page 1of 19

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Jzyk C.
Programowanie
Autor: Steve Oualline
Tumaczenie: Piotr Pilch
ISBN: 83-7197-914-2
Tytu oryginau: Practical C Programming
Format: B5, stron: 460
Przykady na ftp: 216 kB

Programowanie w jzyku C jest czym wicej ni tylko wprowadzaniem kodu zgodnego


z reguami skadni; styl i wykrywanie bdw odgrywaj rwnie istotn rol w procesie
tworzenia oprogramowania. Istotnie przyczyniaj si do prawidowego dziaania
programw oraz uatwiaj ich konserwacj. W ksice omwiono wic nie tylko
dziaanie jzyka C, ale rwnie cay proces tworzenia programu w tym jzyku
(uwzgldniajc zaoenia projektowe programu, kodowanie, metody wykrywania
bdw, dokumentacj, konserwacj oraz aktualizacj).
Wbrew powszechnemu przekonaniu wikszo programistw nie spdza caego
swojego czasu przy pisaniu kodu. Powicaj oni wiele czasu na wprowadzanie zmian
i poprawek do aplikacji napisanych przez kogo innego. Po przeczytaniu tej ksiki
bdziesz w stanie tworzy programy, z ktrymi inni programici nie bd musieli
stacza bojw. Posidziesz rwnie umiejtno analizowania kodu napisanego przez
innego programist.
Ksika Jzyk C. Programowanie omawia take popularne zintegrowane rodowiska
programistyczne dla systemu Windows (Borland C++, Turbo C++ oraz Microsoft Visual
C++) oraz narzdzia programistyczne dla systemu UNIX (cc i gcc). Zawarto w niej
rwnie kod programu generujcego statystyki, ktry ma za zadanie zademonstrowanie
zagadnie omwionych w ksice. Ksika jest przeznaczona dla osb, ktre nie miay
dotd dowiadczenia w programowaniu oraz dla programistw znajcych ju jzyk C,
a pragncych poprawi swj styl i czytelno tworzonego kodu. Jeli chcesz sprawnie
posugiwa si C, Jzyk C. Programowanie to idealny podrcznik dla Ciebie.

Spis treci

Wstp ................................................................................................................................11
Organizacja ksiki................................................................................................................... 12
Omwienie rozdziaw ............................................................................................................ 12
Uwagi dotyczce trzeciej edycji ............................................................................................... 15
Zastosowane style czcionki ...................................................................................................... 16
FTP ........................................................................................................................................... 17

Cz I

Podstawy programowania .............................................19

Rozdzia 1. Czym jest jzyk C ........................................................................... 21


Na czym polega sztuka programowania ................................................................................. 22
Krtka historia jzyka C........................................................................................................... 25
Jak dziaa jzyk C ..................................................................................................................... 25
Jak uczy si jzyka C .............................................................................................................. 27

Rozdzia 2.

Tworzenie programu podstawy................................................. 29

Program od pomysu do realizacji ...................................................................................... 30


Tworzenie prawdziwego programu ........................................................................................ 31
Tworzenie programu przy uyciu kompilatora trybu wiersza polece .................................. 31
Tworzenie programu przy uyciu zintegrowanego rodowiska programowania IDE............. 35
Uzyskanie pomocy w systemie UNIX ..................................................................................... 49
Uzyskanie pomocy w zintegrowanym rodowisku programowania IDE............................... 50
Lista polece rodowiska IDE.................................................................................................. 50
wiczenia z programowania.................................................................................................... 52

Spis treci

Rozdzia 3. Styl programowania ....................................................................... 53


Popularne style programowania.............................................................................................. 58
Rne szkoy programowania.................................................................................................. 60
Wcicia oraz formatowanie kodu rdowego ........................................................................ 61
Przejrzysto ............................................................................................................................ 62
Prostota .................................................................................................................................... 62
Podsumowanie......................................................................................................................... 63

Rozdzia 4. Deklaracje i wyraenia................................................................... 65


Elementy programu ................................................................................................................. 66
Podstawowa struktura programu............................................................................................ 66
Wyraenia proste ..................................................................................................................... 68
Zmienne i ich zakres ................................................................................................................ 69
Deklaracja zmiennych .............................................................................................................. 70
Typ cakowity........................................................................................................................... 70
Instrukcja przypisania .............................................................................................................. 71
Funkcja printf ........................................................................................................................... 72
Typ zmiennoprzecinkowy........................................................................................................ 74
Porwnanie dzielenia liczb zmiennoprzecinkowych i dzielenia liczb cakowitych................. 75
Typ znakowy............................................................................................................................ 76
Odpowiedzi.............................................................................................................................. 78
wiczenia z programowania.................................................................................................... 79

Rozdzia 5. Tablice, kwalifikatory oraz wprowadzanie znakw .................... 81


Tablice ...................................................................................................................................... 82
acuchy .................................................................................................................................. 83
Wprowadzanie acuchw....................................................................................................... 85
Tablice wielowymiarowe ......................................................................................................... 88
Wprowadzanie liczb................................................................................................................. 89
Inicjalizacja zmiennych............................................................................................................. 91
Typ cakowity........................................................................................................................... 92
Typ zmiennoprzecinkowy........................................................................................................ 94
Deklaracje staych..................................................................................................................... 95
Stae szesnastkowe i semkowe............................................................................................... 96
Operatory specjalne ................................................................................................................. 96
Efekty uboczne......................................................................................................................... 97
++x czy x++.............................................................................................................................. 98
Jeszcze o efektach ubocznych................................................................................................... 99
Odpowiedzi............................................................................................................................ 100
wiczenia z programowania.................................................................................................. 101

Rozdzia 6. Instrukcje sterujce i warunkowe ................................................ 103


Instrukcja if............................................................................................................................. 104
Instrukcja else......................................................................................................................... 105

Spis treci

Jak unikn stosowania funkcji strcmp .................................................................................. 106


Ptle........................................................................................................................................ 106
Instrukcja while ...................................................................................................................... 107
Instrukcja break...................................................................................................................... 109
Instrukcja continue ................................................................................................................. 110
Zastosowanie instrukcji przypisania a efekt uboczny ........................................................... 111
Odpowiedzi............................................................................................................................ 112
wiczenia z programowania.................................................................................................. 112

Rozdzia 7. Proces tworzenia programu.......................................................... 115


Przygotowanie ....................................................................................................................... 117
Specyfikacja ............................................................................................................................ 118
Projekt programu ................................................................................................................... 119
Prototyp ................................................................................................................................. 120
Plik Makefile .......................................................................................................................... 122
Testowanie ............................................................................................................................. 124
Wykrywanie bdw .............................................................................................................. 125
Konserwacja ........................................................................................................................... 127
Aktualizacja............................................................................................................................ 127
Elektroniczna archeologia ...................................................................................................... 128
Redagowanie kodu programu ............................................................................................... 128
Zastosowanie debugera ......................................................................................................... 129
Edytor tekstu jako przegldarka ............................................................................................ 129
Umieszczanie komentarzy ..................................................................................................... 129
wiczenia z programowania.................................................................................................. 132

Cz II

Programowanie proste.................................................. 133

Rozdzia 8. Dodatkowe instrukcje sterujce................................................... 135


Instrukcja for .......................................................................................................................... 135
Instrukcja switch .................................................................................................................... 138
Instrukcja switch, break oraz continue................................................................................... 143
Odpowiedzi............................................................................................................................ 144
wiczenia z programowania.................................................................................................. 145

Rozdzia 9. Zakres zmiennych i funkcje .......................................................... 147


Zakres i klasa zmiennej .......................................................................................................... 147
Funkcje ................................................................................................................................... 151
Funkcje bez parametrw........................................................................................................ 154
Programowanie strukturalne ................................................................................................. 155
Rekurencja.............................................................................................................................. 157
Odpowiedzi............................................................................................................................ 158
wiczenia z programowania.................................................................................................. 159

Spis treci

Rozdzia 10. Preprocesor jzyka C .................................................................... 161


Instrukcja #define ................................................................................................................... 162
Kompilacja warunkowa ......................................................................................................... 167
Pliki doczane ....................................................................................................................... 170
Makra parametryzowane ....................................................................................................... 171
Funkcje zaawansowane.......................................................................................................... 173
Podsumowanie....................................................................................................................... 173
Odpowiedzi............................................................................................................................ 173
wiczenia z programowania.................................................................................................. 176

Rozdzia 11. Operacje na bitach ........................................................................ 177


Operatory bitowe ................................................................................................................... 179
Koniunkcja bitowa and (&) .................................................................................................... 179
Bitowa alternatywa (|)........................................................................................................... 182
Rnica symetryczna (^) ........................................................................................................ 182
Negacja bitowa not (~) ........................................................................................................... 183
Operatory przesunicia (<<, >>)............................................................................................ 183
Ustawianie, usuwanie i testowanie bitw.............................................................................. 185
Grafika bitmapowa ................................................................................................................ 188
Odpowiedzi............................................................................................................................ 193
wiczenia z programowania.................................................................................................. 194

Rozdzia 12. Typy zoone ................................................................................. 195


Struktury ................................................................................................................................ 196
Unie ........................................................................................................................................ 197
Instrukcja typedef .................................................................................................................. 200
Typ wyliczeniowy enum........................................................................................................ 201
Konwersja typw (rzutowanie).............................................................................................. 201
Struktury upakowane oraz pola bitowe ................................................................................ 202
Tablice struktur ...................................................................................................................... 203
Podsumowanie....................................................................................................................... 205
wiczenia z programowania.................................................................................................. 205

Rozdzia 13. Wskaniki proste .......................................................................... 207


Wskaniki jako argumenty funkcji......................................................................................... 212
Wskaniki staych................................................................................................................... 215
Wskaniki i tablice ................................................................................................................. 215
Jak nie uywa wskanikw .................................................................................................. 220
Uycie wskanikw do podziau acucha ............................................................................ 221
Wskaniki i struktury............................................................................................................. 225
Argumenty wiersza polece .................................................................................................. 225
wiczenia z programowania.................................................................................................. 230
Odpowiedzi............................................................................................................................ 230

Spis treci

Rozdzia 14. Pliki operacje wejcia-wyjcia................................................ 233


Funkcje konwersji................................................................................................................... 237
Pliki binarne i tekstowe (ASCII)............................................................................................. 239
Znak koca wiersza................................................................................................................ 240
Binarne operacje wejcia-wyjcia ........................................................................................... 242
Problemy z buforowaniem..................................................................................................... 243
Niebuforowane operacje wejcia-wyjcia............................................................................... 244
Tworzenie formatw pliku .................................................................................................... 248
Odpowiedzi............................................................................................................................ 250
wiczenia z programowania.................................................................................................. 251

Rozdzia 15. Wykrywanie bdw oraz optymalizacja.................................... 253


Wykrywanie bdw .............................................................................................................. 253
Debugery interaktywne ......................................................................................................... 263
Algorytm binarnego wyszukiwania wykrywanie bdw ................................................ 267
Bdy wykonania.................................................................................................................... 277
Opowiadana metoda wykrywania bdw............................................................................ 278
Optymalizacja......................................................................................................................... 279
Odpowiedzi............................................................................................................................ 286
wiczenia z programowania.................................................................................................. 287

Rozdzia 16. Liczby zmiennoprzecinkowe......................................................... 289


Format liczb zmiennoprzecinkowych .................................................................................... 290
Dodawanie-odejmowanie liczb zmiennoprzecinkowych....................................................... 291
Mnoenie liczb zmiennoprzecinkowych ................................................................................ 292
Dzielenie liczb zmiennoprzecinkowych................................................................................. 292
Przepenienie i niedomiar ...................................................................................................... 293
Bd zaokrglenia ................................................................................................................... 294
Dokadno............................................................................................................................. 294
Minimalizacja bdu zaokrglenia.......................................................................................... 295
Pomiar dokadnoci................................................................................................................ 296
Dokadno i szybko ........................................................................................................... 297
Szereg potgowy.................................................................................................................... 298
wiczenia z programowania.................................................................................................. 300

Cz III

Programowanie zaawansowane .................................. 301

Rozdzia 17. Zaawansowane wskaniki ........................................................... 303


Wskaniki i struktury............................................................................................................. 304
Funkcja free ............................................................................................................................ 307
Lista dowiza ....................................................................................................................... 308
Operator wskanika struktury............................................................................................... 311
Uporzdkowane listy dowiza ............................................................................................ 311

Spis treci
Lista podwjnych dowiza .................................................................................................. 314
Drzewa ................................................................................................................................... 316
Wywietlanie zawartoci drzewa........................................................................................... 320
Pozostaa cz programu...................................................................................................... 321
Struktury danych programu do gry w szachy ....................................................................... 324
Odpowiedzi............................................................................................................................ 326
wiczenia z programowania.................................................................................................. 327

Rozdzia 18. Programowanie modularne .......................................................... 329


Moduy................................................................................................................................... 330
Sekcja publiczna i prywatna................................................................................................... 330
Modyfikator extern ................................................................................................................ 331
Nagwek ............................................................................................................................... 333
Ciao moduu ......................................................................................................................... 335
Program wykorzystujcy tablice nieograniczone................................................................... 336
Plik Makefile dla wielu plikw .............................................................................................. 338
Zastosowanie tablicy nieograniczonej.................................................................................... 341
Podzia projektu na moduy................................................................................................... 347
Przykad podziau na moduy: edytor tekstu ........................................................................ 348
Kompilator ............................................................................................................................. 349
Arkusz kalkulacyjny............................................................................................................... 350
Zasady tworzenia moduu ..................................................................................................... 351
wiczenia z programowania.................................................................................................. 352

Rozdzia 19. Starsze typy kompilatorw.......................................................... 355


Funkcje zgodne ze stylem K&R ............................................................................................. 356
Zmiana biblioteki ................................................................................................................... 358
Brakujce funkcje ................................................................................................................... 359
Zmiany funkcji free/malloc ................................................................................................... 359
Program lint ........................................................................................................................... 360
Odpowiedzi............................................................................................................................ 360

Rozdzia 20. Problemy z przenoszeniem ........................................................... 363


Modularno .......................................................................................................................... 364
Dugo sowa ........................................................................................................................ 364
Problem z kolejnoci bajtw................................................................................................. 365
Problem z wyrwnywaniem .................................................................................................. 366
Problem ze wskanikiem pustym .......................................................................................... 367
Problemy z nazw pliku ........................................................................................................ 368
Typy plikw ........................................................................................................................... 369
Podsumowanie....................................................................................................................... 369
Odpowiedzi............................................................................................................................ 369

Spis treci

Rozdzia 21. Zapomniane zakamarki jzyka C ................................................ 371


Instrukcja do/while................................................................................................................ 371
Instrukcja skoku goto............................................................................................................. 372
Konstrukcja ?:......................................................................................................................... 373
Operator , ............................................................................................................................... 373
Kwalifikator volatile............................................................................................................... 374
Odpowiedzi............................................................................................................................ 374

Rozdzia 22. Podsumowanie .............................................................................. 375


Analiza wymaga................................................................................................................... 376
Specyfikacja ............................................................................................................................ 376
Projekt programu ................................................................................................................... 378
Kodowanie ............................................................................................................................. 383
Opis funkcjonalny .................................................................................................................. 383
Rozszerzalno ....................................................................................................................... 385
Testowanie ............................................................................................................................. 386
Aktualizacje............................................................................................................................ 386
Kocowe uwagi...................................................................................................................... 387
Pliki programu ....................................................................................................................... 387
wiczenia z programowania.................................................................................................. 406

Rozdzia 23. Rady dla programisty................................................................... 407


Oglne zalecenia .................................................................................................................... 407
Projektowanie......................................................................................................................... 408
Deklaracje............................................................................................................................... 408
Instrukcja switch .................................................................................................................... 409
Preprocesor ............................................................................................................................ 409
Styl.......................................................................................................................................... 409
Kompilacja.............................................................................................................................. 410
Ostatnia rada .......................................................................................................................... 410
Odpowiedzi............................................................................................................................ 410

Cz IV

Inne cechy jzyka .......................................................... 411

Dodatek A

Tabela kodw ASCII..................................................................... 413

Dodatek B

Zakresy i wzory konwersji parametrw przekazywanych ........ 417

Dodatek C

Zasady dotyczce priorytetu operatorw ................................... 419

Dodatek D

Program wyznaczajcy warto funkcji sinus


przy uyciu szeregu potgowego .................................................. 421

Sownik terminw............................................................................................... 425


Skorowidz ..................................................................................................................... 449

12
Typy zoone
Wielki majestat wielkiego gmachu,
Wybrany przez inkwizytora struktur.
Wallace Stevens

W tym rozdziale zostan poruszone nastpujce zagadnienia:


Struktury
Unie
Instrukcja typedef
Typ wyliczeniowy enum
Konwersja typw (rzutowanie)
Struktury upakowane ora pola bitowe
Tablice struktur
Podsumowanie
wiczenia z programowania
Jzyk C daje programicie do dyspozycji bogaty zestaw typw danych. Poprzez zastosowanie struktur, unii oraz typw wyliczeniowych programista moe rozszerzy jzyk o nowe
typy danych.

196

Rozdzia 12. Typy zoone

Struktury
Zamy, e piszemy program obsugujcy magazyn. W magazynie znajduj si skrzynie,
ktre zawieraj rne czci. Wszystkie czci znajdujce si w jednej skrzyni s jednakowe,
dlatego te nie musimy si martwi o to, e zawarto skrzy zostanie wymieszana.
Na temat kadej skrzyni znane s nastpujce informacje:
Nazwa czci w niej przechowywanej (acuch o dugoci 30 znakw).
Liczba czci okrelona rcznie (liczba cakowita).
Cena (grosze liczba cakowita).
W poprzednich rozdziaach do przechowywania grupy podobnych typw danych byy stosowane tablice. Jednak w tym przykadzie mamy do czynienia z mieszank dwch liczb
cakowitych i tekstu.
Zamiast stosowa tablic zostanie uyty nowy typ danych okrelany terminem struktury.
W przypadku tablicy wszystkie elementy s tego samego typu i s ponumerowane.
W strukturze kady element lub pole posiada nazw oraz wasny typ danych.
Oglna definicja struktury ma nastpujc posta:
struct nazwa_struktury {
typ_pola nazwa_pola;
typ_pola nazwa_pola;
...
} nazwa_zmiennej;

/* komentarz */
/* komentarz */

Na przykad zdefiniujemy skrzyni, ktra bdzie przechowywa kable do drukarki. Definicja struktury ma nastpujc posta:
struct bin {
char
name[30];
int
quantity;
int
cost;
} printer_cable_bin;

/*
/*
/*
/*

nazwa czesci */
liczba czesci w skrzyni */
cena pojedynczej czesci (w groszach) */
miejsce przechowywania kabli do drukarki */

Powysza definicja informuje jzyk C o dwch rzeczach. Pierwsza z nich okrela format
instrukcji struct bin. Instrukcja ta definiuje nowy typ danych, ktry moe posuy do
deklaracji innych zmiennych. Zmienna sprinter_cable_bin rwnie jest deklarowana
z uyciem tej instrukcji. Poniewa struktura bin zostaa zdefiniowana mona j zastosowa
w celu deklaracji dodatkowych zmiennych:
struct bin terminal_cable_box;

/* miejsce przechowywania kabli do terminala */

Cz definicji o nazwie nazwa_struktury moe by pominita:


struct {
char
name[30];
int
quantity;
int
cost;
} printer_cable_bin;

/*
/*
/*
/*

nazwa czesci */
liczba czesci w skrzyni */
cena pojedynczej czesci (w groszach) */
miejsce przechowywania kabli do drukarki */

Unie

197

Zmienna printer_cable_bin zostaa zdefiniowana, ale nie zosta utworzony aden


typ danych. Innymi sowy, zmienna ta bdzie jedyn zmienn w programie zdeklarowan
w powyszej strukturze. Typem danych takiej zmiennej jest struktura anonimowa (ang. anonymous structure).
Cz nazwa_zmiennej moe rwnie by pominita. Poniszy przykad definiuje struktur typu nie zawierajc zmiennych:
struct bin {
char
int
int
};

name[30];
quantity;
cost;

/* nazwa czesci */
/* liczba czesci w skrzyni */
/* cena pojedynczej czesci (w groszach) */

Mona teraz w celu deklaracji zmiennych, takich jak printer_cable_bin, zastosowa


nowy typ danych (struct bin).
W skrajnym przypadku zarwno cz nazwa_zmiennej, jak i cz nazwa_struktury mog by
pominite. Czci te s pod wzgldem skadni poprawne, ale zupenie nieprzydatne.
Zdeklarowalimy zmienn printer_cable_bin zawierajc trzy pola o nazwach: name,
quantity i cost. Aby uzyska do nich dostp, uyj poniszej instrukcji:
zmienna.pole

Na przykad jeli nagle okae si, e cena kabli wzrosa do 12.95 zotych, musisz wykona
nastpujc instrukcj:
printer_cable_bin.cost = 1295;

/* 12.95 zlotych jest nowa cena */

Aby obliczy warto caej zawartoci skrzyni, wykonaj ponisz instrukcj:


total_cost = printer_cable_bin.cost * printer_cable_bin.quantity;

Struktury mog by inicjalizowane w chwili deklaracji poprzez umieszczenie listy elementw w nawiasach klamrowych ({}):
/*
* Kable do drukarki
*/
struct bin {
char
name[30];
int
quantity;
int
cost;
} printer_cable_bin = {
"Kable do drukarki",
0,
1295
};

/* nazwa czesci */
/* liczba czesci w skrzyni */
/* cena pojedynczej czesci (w groszach) */
/* nazwa czesci znajdujacej sie w skrzyni */
/* na poczatku skrzynia jest pusta */
/* cena -- 12.95 zlotych */

Unie
Struktura jest stosowana do definicji typu danych zawierajcego kilka pl. Kade pole ma
przydzielon oddzieln przestrze, ktr zajmuje. Przykadowo ponisza struktura:

198

Rozdzia 12. Typy zoone


struct rectangle {
int
width;
int
height;
};

jest przechowywana w pamici. Unia jest podobna do struktury, ale ma przydzielone jedno
wsplne miejsce, w ktrych jest przechowywanych wiele rnych nazw pl:
union value {
long int i_value;
float f_value;
};

/* zmienna typu calkowitego */


/* zmienna typu zmiennoprzecinkowego */

Pole i_value oraz f_value dziel t sam przestrze pamici.


Struktur mona sobie wyobrazi jako wielkie pudo podzielone na kilka rnych komrek,
z ktrych kada ma inn nazw. Unia jest te takim pudem, ale tylko z jedn komrk i kilkoma rnymi etykietami umieszczonymi w jej wntrzu.
Rysunek 12.1 przedstawia struktur z dwoma polami. Kademu polu jest przypisana inna
cz struktury. Unia zawiera tylko jedn komrk, do ktrej s przypisane rne nazwy.

Rysunek 12.1. Struktura i unia

W przypadku struktury pola nie oddziauj wzajemnie na siebie. Modyfikacja jednego pola
nie wpywa na pozostae. W przypadku unii wszystkie pola zajmuj t sam przestrze,
a wic tylko jedno z nich w danej chwili moe by aktywne. Innymi sowy, jeli jaka warto zostanie przypisana zmiennej i_value, przypisanie wartoci zmiennej f_value
spowoduje usunicie starej wartoci, ktr przechowuje zmienna i_value.
W wydruku 12.1 pokazano przykad zastosowania unii.
Wydruk 12.1. Zastosowanie unii
/*
* Deklaracja zmiennej przechowujacej liczbe calkowita
* lub rzeczywista (ale nie obydwie)
*/

Unie

199
union value {
long int i_value;
float f_value;
} data;
int i;
float f;
main()
{
data.f_value = 5.0;
data.i_value = 3;
i = data.i_value;
f = data.f_value;
data.f_value = 5.5;
i = data.i_value;
return(O);
}

/* Liczba rzeczywista */
/* Liczba zmiennoprzecinkowa */
/* Losowa liczba calkowita */
/* Losowa liczba zmiennoprzecinkowa */

/*
/*
/*
/*
/*

nadpisana wartosc data.f_value */


prawidlowo */
nieprawidlowo, wywola nieprzewidywalne wyniki */
przypisanie jakiejs wartosci f-value/i-value */
nieprawidlowo, wywola nieprzewidywalne wyniki */

Unie s czsto wykorzystywane w brany telekomunikacyjnej. Zamy, e posiadamy


tam umieszczon w innym miejscu i chcemy wysa do niej cztery komunikaty: otwrz,
zamknij, przeczytaj oraz zapisz. Dane zawarte w tych czterech komunikatach zmieniaj si w szerokim zakresie zalenie od samych komunikatw.
Komunikat otwrz musi zawiera nazw tamy, natomiast komunikat zapisz musi
przenosi dane, ktre zostan zapisane. Komunikat przeczytaj musi zawiera jak najwiksz liczb znakw, ktre zostan odczytane, natomiast komunikat zamknij nie zawiera adnych dodatkowych informacji.
#define DATA_MAX 1024

/* Maksymalna ilosc danych do zapisu i odczytu */

struct open_msg {
char name[30];
};

/* Nazwa tasmy */

struct read_msg {
int length;
};

/* Maksymalna predkosc odczytu */

struct write_msg {
int length;
char data[DATA_MAX];
};

/* Ilosc bajtow do zapisania */


/* Zapisywane dane */

struct close_msg {
};
const
const
const
const

int
int
int
int

OPEN_CODE=0;
READ_CODE=1;
WRITE_CODE=2
CLOSE_CODE=3;

/*
/*
/*
/*

Kod
Kod
Kod
Kod

otwieranego komunikatu */
odczytywanego komunikatu */
zapisywanego komunikatu */
zamykanego komunikatu */

struct msg {
int msg;
/* Typ komunikatu */
union {
struct open_msg open_data;
struct read_msg read_data;
struct write_msg write_data;
struct close_msg close_data
} msg_data;
};

200

Rozdzia 12. Typy zoone

Instrukcja typedef
Jzyk C umoliwia programicie zdefiniowanie swoich wasnych typw danych poprzez
zastosowanie instrukcji typedef. Instrukcja ta jest rodkiem, dziki ktremu program moe
rozszerzy podstawowe typy danych jzyka C. Oglna posta instrukcji typedef jest nastpujca,
typedef deklaracja_typu;

gdzie deklaracja_typu jest identyczna jak deklaracja zmiennej, poza tym e zamiast nazwy_
zmiennej jest uyta nazwa typu. Na przykad instrukcja
typedef int count;

definiuje nowy typ count, ktry jest taki sam jak typ cakowity.
Tak wic ponisza deklaracja
count flag;

jest identyczna jak ta deklaracja


int flag;

Na pierwszy rzut oka powysza instrukcja niewiele rni si od tej:


#define count int
count flag;

Jednak instrukcje typedef mog by stosowane do definiowania bardziej zoonych


obiektw, co wykracza poza zakres moliwoci prostej instrukcji #define. Oto przykad:
typedef int group[10];

Zosta teraz zdefiniowany nowy typ danych o nazwie group okrelajcy tablic dziesiciu
liczb cakowitych:
main()
{
typedef int group[10];
group totals;
for (i = 0; i < 10; i++)
totals[i] = 0;
return (0);
}

/* Utworzenie nowego typu 'group' */


/* Przypisanie nowego typu danych zmiennej */

Czstym przykadem uycia instrukcji typedef jest definiowanie nowej struktury. Oto
przykad:
struct complex_struct {
double real;
double imag;
};
typedef struct complex_struct complex;
complex voltag1 = {3.5, 1.2};

Konwersja typw (rzutowanie)

201

Typ wyliczeniowy enum


Wyliczeniowy typ danych zosta stworzony dla zmiennych, ktre przechowuj tylko ograniczony zbir wartoci. Dostp do tych wartoci odbywa si poprzez nazw (etykiet). Kompilator wewntrznie przypisuje kadej takiej nazwie liczb cakowit. Rozwamy przykad
aplikacji, w ktrej zmienna bdzie przechowywa dni tygodnia. Aby utworzy wartoci
odpowiadajce kolejnym dniom tygodnia w typie danych week_days, moemy zastosowa
deklaracj const. Ma ona nastpujc posta:
typedef int week_day;
/* definicja typu week_days */
const int SUNDAY
=0;
const int MONDAY
=1;
const int TUESDAY
=2;
const int WEDNESDAY =3;
const int THURSDAY =4;
const int FRIDAY
=5;
const int SATURDAY =6;
/* zastosowanie typu */
week_day today = TUESDAY;

Taka metoda jest niewygodna. Lepsza metoda polega na zastosowaniu typu wyliczeniowego enum:
enum week_day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY};
/* zastosowanie typu */
enum week_day today = TUESDAY;

Oglna posta instrukcji enum jest nastpujca:


enum nazwa_typu { etykieta-1, etykieta-2, ... }nazwa_zmiennej

Podobnie jak w przypadku struktur, cz nazwa_typu lub nazwa_zmiennej moe by pominita. Etykiety mog by dowolnymi identyfikatorami dopuszczalnymi w jzyku C, ale
zazwyczaj zawieraj same mae litery.
Jzyk C implementuje typ wyliczeniowy enum jako zgodny z typem cakowitym, dlatego
te cakowicie poprawne jest nastpujce okrelenie,
today = 5;

/* 5 nie jest typu week_day */

chocia niektre kompilatory po napotkaniu takiej instrukcji wywietl ostrzeenie. W jzyku C++ typ wyliczeniowy enum jest oddzielnym typem i nie jest kompatybilny z typem
cakowitym.

Konwersja typw (rzutowanie)


Czasem konieczna jest zamiana jednego typu zmiennej na inny. Zadanie to jest realizowane poprzez operacj rzutowania (ang. typecast operation). Oglna posta rzutowania jest
nastpujca:
(typ) wyraenie

202

Rozdzia 12. Typy zoone

Operacja rzutowania nakazuje jzykowi C obliczenie wartoci wyraenia, a nastpnie konwersj jej typu na okrelony przez element typ. Rzutowanie jest szczeglnie przydatne przy
przetwarzaniu liczb cakowitych i zmiennoprzecinkowych:
int won, lost;
/* liczba gier dotad wygranych/przegranych */
float ratio;
/* wspolczynnik wygrane/przegrane */
won = 5;
lost = 3;
ratio = won / lost; /* wspolczynnik ma wartosc 1.0 (niepoprawna wartosc) */
/* Ponizsze wyrazenie obliczy prawidlowa wartosc wspolczynnika */
ratio = ((float) won) / ((float) lost);

Kolejnym powszechnym zastosowaniem operacji rzutowania jest konwersja wskanikw


z jednego typu na inny.

Struktury upakowane oraz pola bitowe


Struktury upakowane umoliwiaj deklarowanie struktur w taki sposb, e zajmuj one
minimaln ilo miejsca. Na przykad ponisza struktura zajmuje 6 bajtw (na platformie 16-bitowej).
struct item {
unsigned int list;
unsigned int seen;

/*
/*
/*
unsigned int number; /*
};

jesli
jesli
wtedy
numer

pozycja jest na liscie, pole ma wartosc true */


pozycja zostala przypisana polu,
ma ono wartosc true */
pozycji */

Na rysunku 12.2 zosta pokazany schemat przechowywania zmiennych struktury upakowanej. Kada struktura zajmuje sze bajtw dostpnej przestrzeni (dwa bajty dla kadego
pola typu cakowitego).

Rysunek 12.2. Struktura zwyka

Pola list oraz seen mog przechowywa tylko dwie wartoci 0 i 1 tak wic do ich
reprezentacji jest wymagany tylko jeden bit. Nie planujemy nigdy przekroczy granicy
16383 pozycji (0x3fff lub 14 bitw). W takim razie mona zmodyfikowa definicj
struktury przy uyciu pl bitowych, co polega na umieszczeniu na kocu kadego pola
znaku dwukropka oraz liczby okrelajcej liczb bitw, ktre zostan przypisane polu.
W efekcie struktura bdzie zajmowa tylko dwa bajty przestrzeni. Struktura ma posta:
struct item {
unsigned int list:1;
unsigned int seen:1;

/* jesli pozycja jest na liscie */


/* wtedy pole ma wartosc true */
/* jesli pozycja zostala przypisana polu,*/

Tablice struktur

203
/* wtedy ma ono wartosc true */
/* numer pozycji */

unsigned int number:14;


};

W tym przykadzie poinstruujemy kompilator, aby wykorzysta po jednym bicie dla pl


list i seen oraz 14 bitw dla pola number. Tym sposobem dane mog by upakowane na
obszarze tylko dwch bajtw. Zostao to pokazane na rysunku 12.3.

Rysunek 12.3. Struktura upakowana

Struktury upakowane powinny by stosowane z umiarem. Wynikowy kod, ktry wykonuje


operacj rozpakowania danych przechowywanych przez pola bitowe, ma stosunkowo du
objto i dziaa wolno. Jeli nie wystpuje problem z brakiem wolnej przestrzeni, struktury
upakowane nie powinny by stosowane.
W rozdziale 10., Preprocesor jzyka C, konieczne byo zapisanie danych tekstowych oraz
piciu znacznikw statusu liczcych cznie 8000 znakw. W takim przypadku zastosowanie
dla kadego znacznika oddzielnego bajta pochonoby spor cz przestrzeni (pi bajtw
dla kadego wprowadzonego znaku). Aby pomieci pi znacznikw w jednym bajcie,
zastosowano operacje bitowe. Inna metoda polegaaby na wykorzystaniu struktury upakowanej. Zostao to pokazane poniej:
struct char_and_status {
char character;
int error:1;
int
int
int
int

framing_error:1;
parity_error:1;
carrier_lost:1;
channel_down:1;

/* Znak przekazany przez urzadzenie */


/* Po wystapieniu dowolnego bledu przyjmuje wartosc
true */
/* Wystapil blad ramki */
/* Znak mial nieprawidlowa parzystosc */
/* Sygnal nosny zanikl */
/* Urzadzenie komunikacyjne stracilo zasilanie */

};

Zastosowanie struktur upakowanych w przypadku znacznikw jest bardziej czytelne


i generuje mniej bdw ni przy uyciu operatorw bitowych. Jednak operatory bitowe
daj programicie wiksz elastyczno, dlatego te sam powiniene zdecydowa, jak
metod zastosowa w zalenoci od tego, ktra z nich jest dla Ciebie bardziej zrozumiaa
i przystpna.

Tablice struktur
Struktury i tablice mog by ze sob czone. Zamy, e chcemy zarejestrowa czas, jaki
potrzebuje biegacz na jedno okrenie w biegu skadajcym si z czterech rund. Aby zapisa
czas, naley zdefiniowa nastpujc struktur:

204

Rozdzia 12. Typy zoone


struct time {
int hour;
/*godzina (zegar 24-godzinny ) */
int minute; /* 0-59 */
int second; /* 0-59 */
};
const int MAX_LAPS = 4; /* tylko cztery okrazenia */
/* najlepszy czas okrazenia w ciagu dnia */
struct time lap[MAX_LAPS];

Zastosujemy powysz struktur w taki oto sposb:


/*
* Biegacz wlasnie minal punkt pomiarowy
*/
lap[count].hour = hour;
lap[count].minute = minute;
lap[count].second = second;
++count;

Powysza tablica moe by zainicjalizowana przy uruchomieniu programu.


Inicjalizacja tablicy struktur jest podobna do inicjalizacji tablic wielowymiarowych. Ma ona
nastpujc posta:
struct time start_stop[2] = {
{10, 0, 0},
{12, 0, 0}
};

Zamy, e chcemy napisa program obsugujcy list wysykow. Etykiety kopert skadaj
si z 5 wierszy i maj szeroko 60 znakw. Naley zdefiniowa struktur suc do przechowywania nazwisk i adresw. Lista wysykowa dla wikszoci wydrukw bdzie sortowana wedug nazwiska, natomiast na potrzeby samej listy zostanie zastosowane sortowanie
wedug kodu pocztowego. Struktura takiej listy wysykowej ma nastpujc posta:
struct mailing {
char
name[60];
char
address1[60];
char
address2[60];
char
city[40];
char
state[2];
long int zip;
};

/* nazwisko, imie */
/* dwa wiersze zawierajace ulice */

/* dwuliterowy skrot */
/* kod pocztowy */

Mona teraz zdeklarowa tablic przechowujc zawarto listy wysykowej:


/* Lista wysylkowa */
struct mailing list[MAX_ENTRIES];

Pole state skada si z dwch elementw, poniewa zostao przewidziane do przechowywania dwch znakw. Pole to nie jest typu acuchowego, poniewa nie zostaa przydzielona wystarczajca ilo miejsca dla znaku koca acucha ('\0').

wiczenia z programowania

205

Podsumowanie
Struktury i unie s zaliczane do grupy bardziej efektywnych elementw jzyka C. Dziki
nim nie jeste ju ograniczony tylko do wbudowanych typw danych jzyka C moesz
definiowa wasne typy. Jak si okae w nastpnych rozdziaach, w celu tworzenia bardzo
zoonych i wydajnych struktur danych struktury mog by czone ze wskanikami.

wiczenia z programowania
wiczenie 12.1. Zaprojektuj struktur przechowujc dane listy wysykowej. Napisz funkcj
wywietlajc dane.
wiczenie 12.2. Zaprojektuj struktur przechowujc dat i czas. Napisz funkcj znajdujc
przesunicie w minutach pomidzy dwoma czasami.
wiczenie 12.3. Zaprojektuj struktur danych dla celw obsugi rezerwacji biletw lotniczych, ktra zawiera nastpujce dane:
Numer lotu
Kod lotniska odlotu (trzy znaki)
Kod lotniska przylotu (trzy znaki)
Czas odlotu
Czas przylotu
wiczenie 12.4. Napisz program, ktry generuje list zawierajc wszystkie samoloty
odlatujce z dwch lotnisk okrelonych przez uytkownika.

You might also like