Professional Documents
Culture Documents
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
Spis treci
Wstp ................................................................................................................................11
Organizacja ksiki................................................................................................................... 12
Omwienie rozdziaw ............................................................................................................ 12
Uwagi dotyczce trzeciej edycji ............................................................................................... 15
Zastosowane style czcionki ...................................................................................................... 16
FTP ........................................................................................................................................... 17
Cz I
Rozdzia 2.
Spis treci
Spis treci
Cz II
Spis treci
Spis treci
Cz III
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
Spis treci
Cz IV
Dodatek A
Dodatek B
Dodatek C
Dodatek D
12
Typy zoone
Wielki majestat wielkiego gmachu,
Wybrany przez inkwizytora struktur.
Wallace Stevens
196
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;
/*
/*
/*
/*
nazwa czesci */
liczba czesci w skrzyni */
cena pojedynczej czesci (w groszach) */
miejsce przechowywania kabli do drukarki */
Unie
197
name[30];
quantity;
cost;
/* nazwa czesci */
/* liczba czesci w skrzyni */
/* cena pojedynczej czesci (w groszach) */
Na przykad jeli nagle okae si, e cena kabli wzrosa do 12.95 zotych, musisz wykona
nastpujc instrukcj:
printer_cable_bin.cost = 1295;
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
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;
};
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 */
/*
/*
/*
/*
/*
struct open_msg {
char name[30];
};
/* Nazwa tasmy */
struct read_msg {
int length;
};
struct write_msg {
int length;
char data[DATA_MAX];
};
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
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;
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);
}
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};
201
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;
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;
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.
202
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);
/*
/*
/*
unsigned int number; /*
};
jesli
jesli
wtedy
numer
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).
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;
Tablice struktur
203
/* wtedy ma ono wartosc true */
/* numer pozycji */
framing_error:1;
parity_error:1;
carrier_lost:1;
channel_down:1;
};
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
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 */
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.