SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   Jêzyk C.
                                         Programowanie
           KATALOG KSI¥¯EK
                                         Autor: Steve Oualline
                      KATALOG ONLINE     T³umaczenie: Piotr Pilch
                                         ISBN: 83-7197-914-2
       ZAMÓW DRUKOWANY KATALOG           Tytu³ orygina³u: Practical C Programming
                                         Format: B5, stron: 460
                                         Przyk³ady na ftp: 216 kB
              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     Programowanie w jêzyku C jest czym wiêcej ni¿ tylko wprowadzaniem kodu zgodnego
                                         z regu³ami sk³adni; styl i wykrywanie b³êdów odgrywaj¹ równie istotn¹ rolê w procesie
                                         tworzenia oprogramowania. Istotnie przyczyniaj¹ siê do prawid³owego dzia³ania
         CENNIK I INFORMACJE             programów oraz u³atwiaj¹ ich konserwacjê. W ksi¹¿ce omówiono wiêc nie tylko
                                         dzia³anie jêzyka C, ale równie¿ ca³y proces tworzenia programu w tym jêzyku
                   ZAMÓW INFORMACJE      (uwzglêdniaj¹c za³o¿enia projektowe programu, kodowanie, metody wykrywania
                     O NOWO CIACH        b³êdów, dokumentacjê, konserwacjê oraz aktualizacjê).
                                         Wbrew powszechnemu przekonaniu wiêkszo æ programistów nie spêdza ca³ego
                       ZAMÓW CENNIK      swojego czasu przy pisaniu kodu. Po wiêcaj¹ oni wiele czasu na wprowadzanie zmian
                                         i poprawek do aplikacji napisanych przez kogo innego. Po przeczytaniu tej ksi¹¿ki
                                         bêdziesz w stanie tworzyæ programy, z którymi inni programi ci nie bêd¹ musieli
                 CZYTELNIA               staczaæ bojów. Posi¹dziesz równie¿ umiejêtno æ analizowania kodu napisanego przez
                                         innego programistê.
          FRAGMENTY KSI¥¯EK ONLINE       Ksi¹¿ka „Jêzyk C. Programowanie” omawia tak¿e popularne zintegrowane rodowiska
                                         programistyczne dla systemu Windows (Borland C++, Turbo C++ oraz Microsoft Visual
                                         C++) oraz narzêdzia programistyczne dla systemu UNIX (cc i gcc). Zawarto w niej
                                         równie¿ kod programu generuj¹cego statystyki, który ma za zadanie zademonstrowanie
                                         zagadnieñ omówionych w ksi¹¿ce. Ksi¹¿ka jest przeznaczona dla osób, które nie mia³y
                                         dot¹d do wiadczenia w programowaniu oraz dla programistów znaj¹cych ju¿ jêzyk C,
                                         a pragn¹cych poprawiæ swój styl i czytelno æ tworzonego kodu. Je li chcesz sprawnie
                                         pos³ugiwaæ siê C, „Jêzyk C. Programowanie” to idealny podrêcznik dla Ciebie.



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


Wstęp ................................................................................................................................11
       Organizacja książki................................................................................................................... 12
       Omówienie rozdziałów ............................................................................................................ 12
       Uwagi dotyczące trzeciej edycji ............................................................................................... 15
       Zastosowane style czcionki ...................................................................................................... 16
       FTP ........................................................................................................................................... 17


Część I                 Podstawy programowania .............................................19
Rozdział 1. Czym jest język C ........................................................................... 21
       Na czym polega sztuka programowania ................................................................................. 22
       Krótka historia języka C........................................................................................................... 25
       Jak działa język C ..................................................................................................................... 25
       Jak uczyć się języka C .............................................................................................................. 27

Rozdział 2.             Tworzenie programu — podstawy................................................. 29
       Program — od pomysłu do realizacji ...................................................................................... 30
       Tworzenie prawdziwego programu ........................................................................................ 31
       Tworzenie programu przy użyciu kompilatora trybu wiersza poleceń .................................. 31
       Tworzenie programu przy użyciu 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
4                                                                                                                                    Spis treści


Rozdział 3. Styl programowania ....................................................................... 53
     Popularne style programowania.............................................................................................. 58
     Różne szkoły programowania.................................................................................................. 60
     Wcięcia oraz formatowanie kodu źródłowego ........................................................................ 61
     Przejrzystość ............................................................................................................................ 62
     Prostota .................................................................................................................................... 62
     Podsumowanie......................................................................................................................... 63

Rozdział 4. Deklaracje i wyrażenia................................................................... 65
     Elementy programu ................................................................................................................. 66
     Podstawowa struktura programu............................................................................................ 66
     Wyrażenia proste ..................................................................................................................... 68
     Zmienne i ich zakres ................................................................................................................ 69
     Deklaracja zmiennych .............................................................................................................. 70
     Typ całkowity........................................................................................................................... 70
     Instrukcja przypisania .............................................................................................................. 71
     Funkcja printf ........................................................................................................................... 72
     Typ zmiennoprzecinkowy........................................................................................................ 74
     Porównanie dzielenia liczb zmiennoprzecinkowych i dzielenia liczb całkowitych................. 75
     Typ znakowy............................................................................................................................ 76
     Odpowiedzi.............................................................................................................................. 78
     Ćwiczenia z programowania.................................................................................................... 79

Rozdział 5. Tablice, kwalifikatory oraz wprowadzanie znaków .................... 81
     Tablice ...................................................................................................................................... 82
     Łańcuchy .................................................................................................................................. 83
     Wprowadzanie łańcuchów....................................................................................................... 85
     Tablice wielowymiarowe ......................................................................................................... 88
     Wprowadzanie liczb................................................................................................................. 89
     Inicjalizacja zmiennych............................................................................................................. 91
     Typ całkowity........................................................................................................................... 92
     Typ zmiennoprzecinkowy........................................................................................................ 94
     Deklaracje stałych..................................................................................................................... 95
     Stałe 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 sterujące i warunkowe ................................................ 103
     Instrukcja if............................................................................................................................. 104
     Instrukcja else......................................................................................................................... 105
Spis treści                                                                                                                                         5


     Jak uniknąć stosowania funkcji strcmp .................................................................................. 106
     Pętle........................................................................................................................................ 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 błędów .............................................................................................................. 125
     Konserwacja ........................................................................................................................... 127
     Aktualizacja............................................................................................................................ 127
     Elektroniczna archeologia ...................................................................................................... 128
     Redagowanie kodu programu ............................................................................................... 128
     Zastosowanie debugera ......................................................................................................... 129
     Edytor tekstu jako przeglądarka ............................................................................................ 129
     Umieszczanie komentarzy ..................................................................................................... 129
     Ćwiczenia z programowania.................................................................................................. 132


Część II              Programowanie proste.................................................. 133
Rozdział 8. Dodatkowe instrukcje sterujące................................................... 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 parametrów........................................................................................................ 154
     Programowanie strukturalne ................................................................................................. 155
     Rekurencja.............................................................................................................................. 157
     Odpowiedzi............................................................................................................................ 158
     Ćwiczenia z programowania.................................................................................................. 159
6                                                                                                                                     Spis treści


Rozdział 10. Preprocesor języka C .................................................................... 161
      Instrukcja #define ................................................................................................................... 162
      Kompilacja warunkowa ......................................................................................................... 167
      Pliki dołączane ....................................................................................................................... 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
      Różnica symetryczna (^) ........................................................................................................ 182
      Negacja bitowa not (~) ........................................................................................................... 183
      Operatory przesunięcia (<<, >>)............................................................................................ 183
      Ustawianie, usuwanie i testowanie bitów.............................................................................. 185
      Grafika bitmapowa ................................................................................................................ 188
      Odpowiedzi............................................................................................................................ 193
      Ćwiczenia z programowania.................................................................................................. 194

Rozdział 12. Typy złożone ................................................................................. 195
      Struktury ................................................................................................................................ 196
      Unie ........................................................................................................................................ 197
      Instrukcja typedef .................................................................................................................. 200
      Typ wyliczeniowy enum........................................................................................................ 201
      Konwersja typów (rzutowanie).............................................................................................. 201
      Struktury upakowane oraz pola bitowe ................................................................................ 202
      Tablice struktur ...................................................................................................................... 203
      Podsumowanie....................................................................................................................... 205
      Ćwiczenia z programowania.................................................................................................. 205

Rozdział 13. Wskaźniki proste .......................................................................... 207
      Wskaźniki jako argumenty funkcji......................................................................................... 212
      Wskaźniki stałych................................................................................................................... 215
      Wskaźniki i tablice ................................................................................................................. 215
      Jak nie używać wskaźników .................................................................................................. 220
      Użycie wskaźników do podziału łańcucha ............................................................................ 221
      Wskaźniki i struktury............................................................................................................. 225
      Argumenty wiersza poleceń .................................................................................................. 225
      Ćwiczenia z programowania.................................................................................................. 230
      Odpowiedzi............................................................................................................................ 230
Spis treści                                                                                                                                     7


Rozdział 14. Pliki — operacje wejścia-wyjścia................................................ 233
     Funkcje konwersji................................................................................................................... 237
     Pliki binarne i tekstowe (ASCII)............................................................................................. 239
     Znak końca wiersza................................................................................................................ 240
     Binarne operacje wejścia-wyjścia ........................................................................................... 242
     Problemy z buforowaniem..................................................................................................... 243
     Niebuforowane operacje wejścia-wyjścia............................................................................... 244
     Tworzenie formatów pliku .................................................................................................... 248
     Odpowiedzi............................................................................................................................ 250
     Ćwiczenia z programowania.................................................................................................. 251

Rozdział 15. Wykrywanie błędów oraz optymalizacja.................................... 253
     Wykrywanie błędów .............................................................................................................. 253
     Debugery interaktywne ......................................................................................................... 263
     Algorytm binarnego wyszukiwania — wykrywanie błędów ................................................ 267
     Błędy wykonania.................................................................................................................... 277
     Opowiadana metoda wykrywania błędów............................................................................ 278
     Optymalizacja......................................................................................................................... 279
     Odpowiedzi............................................................................................................................ 286
     Ćwiczenia z programowania.................................................................................................. 287

Rozdział 16. Liczby zmiennoprzecinkowe......................................................... 289
     Format liczb zmiennoprzecinkowych .................................................................................... 290
     Dodawanie-odejmowanie liczb zmiennoprzecinkowych....................................................... 291
     Mnożenie liczb zmiennoprzecinkowych ................................................................................ 292
     Dzielenie liczb zmiennoprzecinkowych................................................................................. 292
     Przepełnienie i niedomiar ...................................................................................................... 293
     Błąd zaokrąglenia ................................................................................................................... 294
     Dokładność............................................................................................................................. 294
     Minimalizacja błędu zaokrąglenia.......................................................................................... 295
     Pomiar dokładności................................................................................................................ 296
     Dokładność i szybkość ........................................................................................................... 297
     Szereg potęgowy.................................................................................................................... 298
     Ćwiczenia z programowania.................................................................................................. 300


Część III            Programowanie zaawansowane .................................. 301
Rozdział 17. Zaawansowane wskaźniki ........................................................... 303
     Wskaźniki i struktury............................................................................................................. 304
     Funkcja free ............................................................................................................................ 307
     Lista dowiązań ....................................................................................................................... 308
     Operator wskaźnika struktury............................................................................................... 311
     Uporządkowane listy dowiązań ............................................................................................ 311
8                                                                                                                                  Spis treści


     Lista podwójnych dowiązań .................................................................................................. 314
     Drzewa ................................................................................................................................... 316
     Wyświetlanie zawartości drzewa........................................................................................... 320
     Pozostała część programu...................................................................................................... 321
     Struktury danych programu do gry w szachy ....................................................................... 324
     Odpowiedzi............................................................................................................................ 326
     Ćwiczenia z programowania.................................................................................................. 327

Rozdział 18. Programowanie modularne .......................................................... 329
     Moduły................................................................................................................................... 330
     Sekcja publiczna i prywatna................................................................................................... 330
     Modyfikator extern ................................................................................................................ 331
     Nagłówek ............................................................................................................................... 333
     Ciało modułu ......................................................................................................................... 335
     Program wykorzystujący tablice nieograniczone................................................................... 336
     Plik Makefile dla wielu plików .............................................................................................. 338
     Zastosowanie tablicy nieograniczonej.................................................................................... 341
     Podział projektu na moduły................................................................................................... 347
     Przykład podziału na moduły: edytor tekstu ........................................................................ 348
     Kompilator ............................................................................................................................. 349
     Arkusz kalkulacyjny............................................................................................................... 350
     Zasady tworzenia modułu ..................................................................................................... 351
     Ćwiczenia z programowania.................................................................................................. 352

Rozdział 19. Starsze typy kompilatorów.......................................................... 355
     Funkcje zgodne ze stylem K&R ............................................................................................. 356
     Zmiana biblioteki ................................................................................................................... 358
     Brakujące funkcje ................................................................................................................... 359
     Zmiany funkcji free/malloc ................................................................................................... 359
     Program lint ........................................................................................................................... 360
     Odpowiedzi............................................................................................................................ 360

Rozdział 20. Problemy z przenoszeniem ........................................................... 363
     Modularność .......................................................................................................................... 364
     Długość słowa ........................................................................................................................ 364
     Problem z kolejnością bajtów................................................................................................. 365
     Problem z wyrównywaniem .................................................................................................. 366
     Problem ze wskaźnikiem pustym .......................................................................................... 367
     Problemy z nazwą pliku ........................................................................................................ 368
     Typy plików ........................................................................................................................... 369
     Podsumowanie....................................................................................................................... 369
     Odpowiedzi............................................................................................................................ 369
Spis treści                                                                                                                                            9


Rozdział 21. Zapomniane zakamarki języka 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
       Końcowe uwagi...................................................................................................................... 387
       Pliki programu ....................................................................................................................... 387
       Ćwiczenia z programowania.................................................................................................. 406

Rozdział 23. Rady dla programisty................................................................... 407
       Ogólne zalecenia .................................................................................................................... 407
       Projektowanie......................................................................................................................... 408
       Deklaracje............................................................................................................................... 408
       Instrukcja switch .................................................................................................................... 409
       Preprocesor ............................................................................................................................ 409
       Styl.......................................................................................................................................... 409
       Kompilacja.............................................................................................................................. 410
       Ostatnia rada .......................................................................................................................... 410
       Odpowiedzi............................................................................................................................ 410

Część IV                Inne cechy języka .......................................................... 411
Dodatek A               Tabela kodów ASCII..................................................................... 413

Dodatek B               Zakresy i wzory konwersji parametrów przekazywanych ........ 417

Dodatek C               Zasady dotyczące priorytetu operatorów ................................... 419

Dodatek D               Program wyznaczający wartość funkcji sinus
                        przy użyciu szeregu potęgowego .................................................. 421
Słownik terminów............................................................................................... 425

Skorowidz ..................................................................................................................... 449
12
                                                         Typy złożone

                                                       Wielki majestat wielkiego gmachu,
                                                     Wybrany przez inkwizytora struktur.
                                                                    — Wallace Stevens



W tym rozdziale zostaną poruszone następujące zagadnienia:
• Struktury
• Unie
• Instrukcja typedef
• Typ wyliczeniowy enum
• Konwersja typów (rzutowanie)
• Struktury upakowane ora pola bitowe
• Tablice struktur
• Podsumowanie
• Ćwiczenia z programowania

Język C daje programiście do dyspozycji bogaty zestaw typów danych. Poprzez zastoso-
wanie struktur, unii oraz typów wyliczeniowych programista może rozszerzyć język o nowe
typy danych.
196                                                                 Rozdział 12. Typy złożone


Struktury
Załóżmy, że piszemy program obsługujący magazyn. W magazynie znajdują się skrzynie,
które zawierają różne części. Wszystkie części znajdujące się w jednej skrzyni są jednakowe,
dlatego też nie musimy się martwić o to, że zawartość skrzyń zostanie wymieszana.

Na temat każdej skrzyni znane są następujące informacje:
• Nazwa części w niej przechowywanej (łańcuch o długości 30 znaków).
• Liczba części określona ręcznie (liczba całkowita).
• Cena (grosze — liczba całkowita).

W poprzednich rozdziałach do przechowywania grupy podobnych typów danych były sto-
sowane tablice. Jednak w tym przykładzie mamy do czynienia z mieszanką dwóch liczb
całkowitych i tekstu.

Zamiast stosować tablicę zostanie użyty nowy typ danych określany terminem struktury.
W przypadku tablicy wszystkie elementy są tego samego typu i są ponumerowane.
W strukturze każdy element lub pole posiada nazwę oraz własny typ danych.

Ogólna definicja struktury ma następującą postać:
      struct nazwa_struktury {
            typ_pola nazwa_pola;    /* komentarz */
            typ_pola nazwa_pola;    /* komentarz */
            ...
      } nazwa_zmiennej;

Na przykład zdefiniujemy skrzynię, która będzie przechowywać kable do drukarki. Defi-
nicja struktury ma następującą postać:
      struct bin {
             char    name[30];         /*   nazwa czesci */
             int     quantity;         /*   liczba czesci w skrzyni */
             int     cost;             /*   cena pojedynczej czesci (w groszach) */
      } printer_cable_bin;             /*   miejsce przechowywania kabli do drukarki */

Powyższa definicja informuje język C o dwóch rzeczach. Pierwsza z nich określa format
instrukcji struct bin. Instrukcja ta definiuje nowy typ danych, który może posłużyć do
deklaracji innych zmiennych. Zmienna sprinter_cable_bin również jest deklarowana
z użyciem tej instrukcji. Ponieważ struktura bin została zdefiniowana można ją zastosować
w celu deklaracji dodatkowych zmiennych:
      struct bin terminal_cable_box;        /* miejsce przechowywania kabli do terminala */

Część definicji o nazwie nazwa_struktury może być pominięta:
      struct {
             char  name[30];           /*   nazwa czesci */
             int     quantity;         /*   liczba czesci w skrzyni */
             int     cost;             /*   cena pojedynczej czesci (w groszach) */
      } printer_cable_bin;             /*   miejsce przechowywania kabli do drukarki */
Unie                                                                                 197


Zmienna printer_cable_bin została zdefiniowana, ale nie został utworzony żaden
typ danych. Innymi słowy, zmienna ta będzie jedyną zmienną w programie zdeklarowaną
w powyższej strukturze. Typem danych takiej zmiennej jest struktura anonimowa (ang. ano-
nymous structure).

Część nazwa_zmiennej może również być pominięta. Poniższy przykład definiuje struk-
turę typu nie zawierającą zmiennych:
       struct bin {
              char    name[30];      /* nazwa czesci */
              int       quantity;    /* liczba czesci w skrzyni */
              int       cost;        /* cena pojedynczej czesci (w groszach) */
       };

Można teraz w celu deklaracji zmiennych, takich jak printer_cable_bin, zastosować
nowy typ danych (struct bin).

W skrajnym przypadku zarówno część nazwa_zmiennej, jak i część nazwa_struktury mogą być
pominięte. Części te są pod względem składni poprawne, ale zupełnie nieprzydatne.

Zdeklarowaliśmy zmienną printer_cable_bin zawierającą trzy pola o nazwach: name,
quantity i cost. Aby uzyskać do nich dostęp, użyj poniższej instrukcji:
       zmienna.pole

Na przykład jeśli nagle okaże się, że cena kabli wzrosła do 12.95 złotych, musisz wykonać
następującą instrukcję:
       printer_cable_bin.cost = 1295;   /* 12.95 zlotych jest nowa cena */

Aby obliczyć wartość całej zawartości skrzyni, wykonaj poniższą instrukcję:
       total_cost = printer_cable_bin.cost * printer_cable_bin.quantity;

Struktury mogą być inicjalizowane w chwili deklaracji poprzez umieszczenie listy elemen-
tów w nawiasach klamrowych ({}):
       /*
       * Kable do drukarki
       */
       struct bin {
              char   name[30];           /* nazwa czesci */
              int      quantity;         /* liczba czesci w skrzyni */
              int      cost;             /* cena pojedynczej czesci (w groszach) */
       } printer_cable_bin = {
              "Kable do drukarki",       /* nazwa czesci znajdujacej sie w skrzyni */
              0,                         /* na poczatku skrzynia jest pusta */
              1295                       /* cena -- 12.95 zlotych */
       };



Unie
Struktura jest stosowana do definicji typu danych zawierającego kilka pól. Każde pole ma
przydzieloną oddzielną przestrzeń, którą zajmuje. Przykładowo poniższa struktura:
198                                                               Rozdział 12. Typy złożone

      struct rectangle {
             int   width;
             int    height;
      };

jest przechowywana w pamięci. Unia jest podobna do struktury, ale ma przydzielone jedno
wspólne miejsce, w których jest przechowywanych wiele różnych nazw pól:
      union value {
             long int i_value;          /* zmienna typu calkowitego */
             float f_value;             /* zmienna typu zmiennoprzecinkowego */
      };

Pole i_value oraz f_value dzielą tę samą przestrzeń pamięci.

Strukturę można sobie wyobrazić jako wielkie pudło podzielone na kilka różnych komórek,
z których każda ma inną nazwę. Unia jest też takim pudłem, ale tylko z jedną komórką i kil-
koma różnymi etykietami umieszczonymi w jej wnętrzu.

Rysunek 12.1 przedstawia strukturę z dwoma polami. Każdemu polu jest przypisana inna
część struktury. Unia zawiera tylko jedną komórkę, do której są przypisane różne nazwy.




Rysunek 12.1. Struktura i unia

W przypadku struktury pola nie oddziałują wzajemnie na siebie. Modyfikacja jednego pola
nie wpływa na pozostałe. W przypadku unii wszystkie pola zajmują tę samą przestrzeń,
a więc tylko jedno z nich w danej chwili może być aktywne. Innymi słowy, jeśli jakaś war-
tość zostanie przypisana zmiennej i_value, przypisanie wartości zmiennej f_value
spowoduje usunięcie starej wartości, którą przechowuje zmienna i_value.

W wydruku 12.1 pokazano przykład 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;         /* Liczba rzeczywista */
           float f_value;            /* Liczba zmiennoprzecinkowa */
       } data;
       int i;                        /* Losowa liczba calkowita */
       float f;                      /* Losowa liczba zmiennoprzecinkowa */
       main()
       {
           data.f_value = 5.0;
           data.i_value = 3;         /*   nadpisana wartosc data.f_value */
           i = data.i_value;         /*   prawidlowo */
           f = data.f_value;         /*   nieprawidlowo, wywola nieprzewidywalne wyniki */
           data.f_value = 5.5;       /*   przypisanie jakiejs wartosci f-value/i-value */
           i = data.i_value;         /*   nieprawidlowo, wywola nieprzewidywalne wyniki */
           return(O);
       }

Unie są często wykorzystywane w branży telekomunikacyjnej. Załóżmy, że posiadamy
taśmę umieszczoną w innym miejscu i chcemy wysłać do niej cztery komunikaty: „otwórz”,
„zamknij”, „przeczytaj” oraz „zapisz”. Dane zawarte w tych czterech komunikatach zmie-
niają się w szerokim zakresie zależnie od samych komunikatów.

Komunikat „otwórz” musi zawierać nazwę taśmy, natomiast komunikat „zapisz” musi
przenosić dane, które zostaną zapisane. Komunikat „przeczytaj” musi zawierać jak naj-
większą liczbę znaków, które zostaną odczytane, natomiast komunikat „zamknij” nie za-
wiera ż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;              /* Ilosc bajtow do zapisania */
            char data[DATA_MAX];     /* Zapisywane dane */
       };

       struct close_msg {
             };

       const   int   OPEN_CODE=0;    /*   Kod   otwieranego komunikatu */
       const   int   READ_CODE=1;    /*   Kod   odczytywanego komunikatu */
       const   int   WRITE_CODE=2    /*   Kod   zapisywanego komunikatu */
       const   int   CLOSE_CODE=3;   /*   Kod   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 złożone


Instrukcja typedef
Język C umożliwia programiście zdefiniowanie swoich własnych typów danych poprzez
zastosowanie instrukcji typedef. Instrukcja ta jest środkiem, dzięki któremu program może
rozszerzyć podstawowe typy danych języka C. Ogólna postać instrukcji typedef jest na-
stępująca,
      typedef deklaracja_typu;

gdzie deklaracja_typu jest identyczna jak deklaracja zmiennej, poza tym że zamiast nazwy_
zmiennej jest użyta nazwa typu. Na przykład instrukcja
      typedef int count;

definiuje nowy typ count, który jest taki sam jak typ całkowity.

Tak więc poniższa deklaracja
      count flag;

jest identyczna jak ta deklaracja
      int flag;

Na pierwszy rzut oka powyższa instrukcja niewiele różni się od tej:
      #define count int
      count flag;

Jednak instrukcje typedef mogą być stosowane do definiowania bardziej złożonych
obiektów, co wykracza poza zakres możliwości prostej instrukcji #define. Oto przykład:
      typedef int group[10];

Został teraz zdefiniowany nowy typ danych o nazwie group określający tablicę dziesięciu
liczb całkowitych:
      main()
      {
          typedef int group[10];      /* Utworzenie nowego typu 'group' */
          group totals;               /* Przypisanie nowego typu danych zmiennej */
          for (i = 0; i < 10; i++)
               totals[i] = 0;
          return (0);
      }

Częstym przykładem użycia instrukcji typedef jest definiowanie nowej struktury. Oto
przykład:
      struct complex_struct {
          double real;
          double imag;
      };
      typedef struct complex_struct complex;

      complex voltag1 = {3.5, 1.2};
Konwersja typów (rzutowanie)                                                           201


Typ wyliczeniowy enum
Wyliczeniowy typ danych został stworzony dla zmiennych, które przechowują tylko ograni-
czony zbiór wartości. Dostęp do tych wartości odbywa się poprzez nazwę (etykietę). Kom-
pilator wewnętrznie przypisuje każdej takiej nazwie liczbę całkowitą. Rozważmy przykład
aplikacji, w której zmienna będzie przechowywać dni tygodnia. Aby utworzyć wartości
odpowiadające kolejnym dniom tygodnia w typie danych week_days, możemy zastosować
deklarację const. Ma ona następującą 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 wylicze-
niowego enum:
    enum week_day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
            FRIDAY, SATURDAY};
    /* zastosowanie typu */
    enum week_day today = TUESDAY;

Ogólna postać instrukcji enum jest następująca:
    enum nazwa_typu { etykieta-1, etykieta-2, ... }nazwa_zmiennej

Podobnie jak w przypadku struktur, część nazwa_typu lub nazwa_zmiennej może być pomi-
nięta. Etykiety mogą być dowolnymi identyfikatorami dopuszczalnymi w języku C, ale
zazwyczaj zawierają same małe litery.

Język C implementuje typ wyliczeniowy enum jako zgodny z typem całkowitym, dlatego
też całkowicie poprawne jest następujące określenie,
    today = 5;       /* 5 nie jest typu week_day */

chociaż niektóre kompilatory po napotkaniu takiej instrukcji wyświetlą ostrzeżenie. W języ-
ku C++ typ wyliczeniowy enum jest oddzielnym typem i nie jest kompatybilny z typem
całkowitym.


Konwersja typów (rzutowanie)
Czasem konieczna jest zamiana jednego typu zmiennej na inny. Zadanie to jest reali-
zowane poprzez operację rzutowania (ang. typecast operation). Ogólna postać rzutowania jest
następująca:
    (typ) wyra enie
202                                                                Rozdział 12. Typy złożone


Operacja rzutowania nakazuje językowi C obliczenie wartości wyrażenia, a następnie kon-
wersję jej typu na określony przez element typ. Rzutowanie jest szczególnie przydatne przy
przetwarzaniu liczb całkowitych 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 wskaźników
z jednego typu na inny.


Struktury upakowane oraz pola bitowe
Struktury upakowane umożliwiają deklarowanie struktur w taki sposób, że zajmują one
minimalną ilość miejsca. Na przykład poniższa struktura zajmuje 6 bajtów (na platfor-
mie 16-bitowej).
       struct item {
         unsigned int list;   /*   jesli   pozycja jest na liscie, pole ma wartosc true */
         unsigned int seen;   /*   jesli   pozycja zostala przypisana polu,
                              /*   wtedy   ma ono wartosc true */
         unsigned int number; /*   numer   pozycji */
       };

Na rysunku 12.2 został pokazany schemat przechowywania zmiennych struktury upako-
wanej. Każda struktura zajmuje sześć bajtów dostępnej przestrzeni (dwa bajty dla każdego
pola typu całkowitego).




Rysunek 12.2. Struktura zwykła

Pola list oraz seen mogą przechowywać tylko dwie wartości — 0 i 1 — tak więc do ich
reprezentacji jest wymagany tylko jeden bit. Nie planujemy nigdy przekroczyć granicy
16383 pozycji (0x3fff lub 14 bitów). W takim razie można zmodyfikować definicję
struktury przy użyciu pól bitowych, co polega na umieszczeniu na końcu każdego pola
znaku dwukropka oraz liczby określającej liczbę bitów, które zostaną przypisane polu.
W efekcie struktura będzie zajmować tylko dwa bajty przestrzeni. Struktura ma postać:
      struct item {
          unsigned int list:1;             /* jesli pozycja jest na liscie */
                                           /* wtedy pole ma wartosc true */
          unsigned int seen:1;             /* jesli pozycja zostala przypisana polu,*/
Tablice struktur                                                                        203

                                         /* wtedy ma ono wartosc true */
          unsigned int number:14;        /* numer pozycji */
    };

W tym przykładzie poinstruujemy kompilator, aby wykorzystał po jednym bicie dla pól
list i seen oraz 14 bitów dla pola number. Tym sposobem dane mogą być upakowane na
obszarze tylko dwóch bajtów. Zostało to pokazane na rysunku 12.3.




Rysunek 12.3. Struktura upakowana

Struktury upakowane powinny być stosowane z umiarem. Wynikowy kod, który wykonuje
operację rozpakowania danych przechowywanych przez pola bitowe, ma stosunkowo dużą
objętość i działa wolno. Jeśli nie występuje problem z brakiem wolnej przestrzeni, struktury
upakowane nie powinny być stosowane.

W rozdziale 10., Preprocesor języka C, konieczne było zapisanie danych tekstowych oraz
pięciu znaczników statusu liczących łącznie 8000 znaków. W takim przypadku zastosowanie
dla każdego znacznika oddzielnego bajta pochłonęłoby sporą część przestrzeni (pięć bajtów
dla każdego wprowadzonego znaku). Aby pomieścić pięć znaczników w jednym bajcie,
zastosowano operacje bitowe. Inna metoda polegałaby na wykorzystaniu struktury upako-
wanej. Zostało to pokazane poniżej:
    struct char_and_status {
       char character;              /* Znak przekazany przez urzadzenie */
       int error:1;                 /* Po wystapieniu dowolnego bledu przyjmuje wartosc
                                         true */
         int   framing_error:1;     /* Wystapil blad ramki */
         int   parity_error:1;      /* Znak mial nieprawidlowa parzystosc */
         int   carrier_lost:1;      /* Sygnal nosny zanikl */
         int   channel_down:1;      /* Urzadzenie komunikacyjne stracilo zasilanie */
    };

Zastosowanie struktur upakowanych w przypadku znaczników jest bardziej czytelne
i generuje mniej błędów niż przy użyciu operatorów bitowych. Jednak operatory bitowe
dają programiście większą elastyczność, dlatego też sam powinieneś zdecydować, jaką
metodę zastosować w zależności od tego, która z nich jest dla Ciebie bardziej zrozumiała
i przystępna.


Tablice struktur
Struktury i tablice mogą być ze sobą łączone. Załóżmy, że chcemy zarejestrować czas, jaki
potrzebuje biegacz na jedno okrążenie w biegu składającym się z czterech rund. Aby zapisać
czas, należy zdefiniować następującą strukturę:
204                                                               Rozdział 12. Typy złożone


      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 powyższą strukturę w taki oto sposób:
      /*
      * Biegacz wlasnie minal punkt pomiarowy
      */
      lap[count].hour = hour;
      lap[count].minute = minute;
      lap[count].second = second;
      ++count;

Powyższa tablica może być zainicjalizowana przy uruchomieniu programu.

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

Załóżmy, że chcemy napisać program obsługujący listę wysyłkową. Etykiety kopert składają
się z 5 wierszy i mają szerokość 60 znaków. Należy zdefiniować strukturę służącą do prze-
chowywania nazwisk i adresów. Lista wysyłkowa dla większości wydruków będzie sorto-
wana według nazwiska, natomiast na potrzeby samej listy zostanie zastosowane sortowanie
według kodu pocztowego. Struktura takiej listy wysyłkowej ma następującą postać:
      struct mailing {
             char   name[60];             /* nazwisko, imie */
             char   address1[60];         /* dwa wiersze zawierajace ulice */
             char   address2[60];
             char   city[40];
             char   state[2];             /* dwuliterowy skrot */
             long int zip;                /* kod pocztowy */
      };

Można teraz zdeklarować tablicę przechowującą zawartość listy wysyłkowej:
      /* Lista wysylkowa */
      struct mailing list[MAX_ENTRIES];

Pole state składa się z dwóch elementów, ponieważ zostało przewidziane do przecho-
wywania dwóch znaków. Pole to nie jest typu łańcuchowego, ponieważ nie została przy-
dzielona wystarczająca ilość miejsca dla znaku końca łańcucha ('0').
Ćwiczenia z programowania                                                             205


Podsumowanie
Struktury i unie są zaliczane do grupy bardziej efektywnych elementów języka C. Dzięki
nim nie jesteś już ograniczony tylko do wbudowanych typów danych języka C — możesz
definiować własne typy. Jak się okaże w następnych rozdziałach, w celu tworzenia bardzo
złożonych i wydajnych struktur danych struktury mogą być łączone ze wskaźnikami.


Ćwiczenia z programowania
Ćwiczenie 12.1. Zaprojektuj strukturę przechowującą dane listy wysyłkowej. Napisz funkcję
wyświetlającą dane.

Ćwiczenie 12.2. Zaprojektuj strukturę przechowującą datę i czas. Napisz funkcję znajdującą
przesunięcie w minutach pomiędzy dwoma czasami.

Ćwiczenie 12.3. Zaprojektuj strukturę danych dla celów obsługi rezerwacji biletów lotni-
czych, która zawiera następujące dane:
• Numer lotu
• Kod lotniska odlotu (trzy znaki)
• Kod lotniska przylotu (trzy znaki)
• Czas odlotu
• Czas przylotu

Ćwiczenie 12.4. Napisz program, który generuje listę zawierającą wszystkie samoloty
odlatujące z dwóch lotnisk określonych przez użytkownika.

Weitere ähnliche Inhalte

Was ist angesagt?

Programuję W Delphi I C Builder
Programuję W Delphi I C BuilderProgramuję W Delphi I C Builder
Programuję W Delphi I C BuilderAdam
 
Thinking in C++. Edycja polska. Tom 2
Thinking in C++. Edycja polska. Tom 2Thinking in C++. Edycja polska. Tom 2
Thinking in C++. Edycja polska. Tom 2Wydawnictwo Helion
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówWydawnictwo Helion
 
Visual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawVisual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawWydawnictwo Helion
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaWydawnictwo Helion
 
C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanieWydawnictwo Helion
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuWydawnictwo Helion
 
darmowe ebooki Programuje W Delphi I C Builder
darmowe ebooki Programuje W Delphi I C Builderdarmowe ebooki Programuje W Delphi I C Builder
darmowe ebooki Programuje W Delphi I C Builderebooks
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...Wydawnictwo Helion
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyWydawnictwo Helion
 

Was ist angesagt? (20)

Programuję W Delphi I C Builder
Programuję W Delphi I C BuilderProgramuję W Delphi I C Builder
Programuję W Delphi I C Builder
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
 
Thinking in C++. Edycja polska. Tom 2
Thinking in C++. Edycja polska. Tom 2Thinking in C++. Edycja polska. Tom 2
Thinking in C++. Edycja polska. Tom 2
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
Visual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstawVisual C# 2005 Express Edition. Od podstaw
Visual C# 2005 Express Edition. Od podstaw
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowania
 
C++. Leksykon kieszonkowy
C++. Leksykon kieszonkowyC++. Leksykon kieszonkowy
C++. Leksykon kieszonkowy
 
C++ bez obaw
C++ bez obawC++ bez obaw
C++ bez obaw
 
C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanie
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniu
 
C++. Styl programowania
C++. Styl programowaniaC++. Styl programowania
C++. Styl programowania
 
darmowe ebooki Programuje W Delphi I C Builder
darmowe ebooki Programuje W Delphi I C Builderdarmowe ebooki Programuje W Delphi I C Builder
darmowe ebooki Programuje W Delphi I C Builder
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 
C++. Sztuka programowania
C++. Sztuka programowaniaC++. Sztuka programowania
C++. Sztuka programowania
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
 
C#. Ćwiczenia
C#. ĆwiczeniaC#. Ćwiczenia
C#. Ćwiczenia
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalisty
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalisty
 

Andere mochten auch

Analiza wyplacalnosci spolki bioton
Analiza wyplacalnosci spolki biotonAnaliza wyplacalnosci spolki bioton
Analiza wyplacalnosci spolki biotonTobiasz Maliński
 
Future of copyright for Wikimedia Polska
Future of copyright for Wikimedia PolskaFuture of copyright for Wikimedia Polska
Future of copyright for Wikimedia PolskaJarosław Lipszyc
 
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznych
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznychEkonomika portów lotniczych w Polsce a problem kosztów zewnętrznych
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznychInstytut Ekonomiki Miast i Regionów
 
Moje Poczatki W Pp
Moje Poczatki W PpMoje Poczatki W Pp
Moje Poczatki W Ppzed.seo
 
Dietetyk 321[11] o1.02_u
Dietetyk 321[11] o1.02_uDietetyk 321[11] o1.02_u
Dietetyk 321[11] o1.02_ugemix gemix
 
7bsq həndəsə
7bsq həndəsə7bsq həndəsə
7bsq həndəsəelnara78
 
instrukcja obsługi
instrukcja obsługiinstrukcja obsługi
instrukcja obsługiWenderSAD
 
JavaScript - przykłady. Biblia
JavaScript - przykłady. BibliaJavaScript - przykłady. Biblia
JavaScript - przykłady. BibliaWydawnictwo Helion
 
Geografia jest git
Geografia jest gitGeografia jest git
Geografia jest gitmartucha3617
 
Protest prezentacja
Protest  prezentacjaProtest  prezentacja
Protest prezentacjamilocinska
 
Projekt rynku mocy spotkanie konsultacyjne
Projekt rynku mocy   spotkanie konsultacyjneProjekt rynku mocy   spotkanie konsultacyjne
Projekt rynku mocy spotkanie konsultacyjneGrupa PTWP S.A.
 
Analiza kampanii na fb
Analiza kampanii na fbAnaliza kampanii na fb
Analiza kampanii na fbIRCenter
 
Innovation and its impact on the strategic management of it comapnies - Paweł...
Innovation and its impact on the strategic management of it comapnies - Paweł...Innovation and its impact on the strategic management of it comapnies - Paweł...
Innovation and its impact on the strategic management of it comapnies - Paweł...Pawel Lopatka
 
Case study Eyetracking Facebooka
Case study Eyetracking FacebookaCase study Eyetracking Facebooka
Case study Eyetracking FacebookaPaulina Makuch
 
Scalone dokumenty (38)
Scalone dokumenty (38)Scalone dokumenty (38)
Scalone dokumenty (38)gemix gemix
 
Ksiegowosc SpoldzieIni Socjalnej
Ksiegowosc SpoldzieIni SocjalnejKsiegowosc SpoldzieIni Socjalnej
Ksiegowosc SpoldzieIni SocjalnejBarka Foundation
 

Andere mochten auch (20)

Analiza wyplacalnosci spolki bioton
Analiza wyplacalnosci spolki biotonAnaliza wyplacalnosci spolki bioton
Analiza wyplacalnosci spolki bioton
 
Future of copyright for Wikimedia Polska
Future of copyright for Wikimedia PolskaFuture of copyright for Wikimedia Polska
Future of copyright for Wikimedia Polska
 
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznych
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznychEkonomika portów lotniczych w Polsce a problem kosztów zewnętrznych
Ekonomika portów lotniczych w Polsce a problem kosztów zewnętrznych
 
Moje Poczatki W Pp
Moje Poczatki W PpMoje Poczatki W Pp
Moje Poczatki W Pp
 
Dietetyk 321[11] o1.02_u
Dietetyk 321[11] o1.02_uDietetyk 321[11] o1.02_u
Dietetyk 321[11] o1.02_u
 
7bsq həndəsə
7bsq həndəsə7bsq həndəsə
7bsq həndəsə
 
instrukcja obsługi
instrukcja obsługiinstrukcja obsługi
instrukcja obsługi
 
JavaScript - przykłady. Biblia
JavaScript - przykłady. BibliaJavaScript - przykłady. Biblia
JavaScript - przykłady. Biblia
 
Geografia jest git
Geografia jest gitGeografia jest git
Geografia jest git
 
MySQL. Opis języka
MySQL. Opis językaMySQL. Opis języka
MySQL. Opis języka
 
Rośliny
RoślinyRośliny
Rośliny
 
Protest prezentacja
Protest  prezentacjaProtest  prezentacja
Protest prezentacja
 
Projekt rynku mocy spotkanie konsultacyjne
Projekt rynku mocy   spotkanie konsultacyjneProjekt rynku mocy   spotkanie konsultacyjne
Projekt rynku mocy spotkanie konsultacyjne
 
Analiza kampanii na fb
Analiza kampanii na fbAnaliza kampanii na fb
Analiza kampanii na fb
 
Innovation and its impact on the strategic management of it comapnies - Paweł...
Innovation and its impact on the strategic management of it comapnies - Paweł...Innovation and its impact on the strategic management of it comapnies - Paweł...
Innovation and its impact on the strategic management of it comapnies - Paweł...
 
Case study Eyetracking Facebooka
Case study Eyetracking FacebookaCase study Eyetracking Facebooka
Case study Eyetracking Facebooka
 
test
testtest
test
 
TMP Sept-Oct 2015
TMP Sept-Oct 2015TMP Sept-Oct 2015
TMP Sept-Oct 2015
 
Scalone dokumenty (38)
Scalone dokumenty (38)Scalone dokumenty (38)
Scalone dokumenty (38)
 
Ksiegowosc SpoldzieIni Socjalnej
Ksiegowosc SpoldzieIni SocjalnejKsiegowosc SpoldzieIni Socjalnej
Ksiegowosc SpoldzieIni Socjalnej
 

Ähnlich wie Język C. Programowanie

C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuWydawnictwo Helion
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQWydawnictwo Helion
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki startWydawnictwo Helion
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleWydawnictwo Helion
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyWydawnictwo Helion
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykWydawnictwo Helion
 
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejProjektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejWydawnictwo Helion
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyWydawnictwo Helion
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programistyWydawnictwo Helion
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Wydawnictwo Helion
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 

Ähnlich wie Język C. Programowanie (17)

C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQ
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
 
Prolog. Programowanie
Prolog. ProgramowanieProlog. Programowanie
Prolog. Programowanie
 
ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modele
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. Przykłady
 
C#. Wzorce projektowe
C#. Wzorce projektoweC#. Wzorce projektowe
C#. Wzorce projektowe
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
 
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejProjektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programisty
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programisty
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. Podstawy
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
C#. Programowanie
C#. ProgramowanieC#. Programowanie
C#. Programowanie
 
Po prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxGPo prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxG
 

Mehr von Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

Mehr von Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Język C. Programowanie

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Jêzyk C. Programowanie KATALOG KSI¥¯EK Autor: Steve Oualline KATALOG ONLINE T³umaczenie: Piotr Pilch ISBN: 83-7197-914-2 ZAMÓW DRUKOWANY KATALOG Tytu³ orygina³u: Practical C Programming Format: B5, stron: 460 Przyk³ady na ftp: 216 kB TWÓJ KOSZYK DODAJ DO KOSZYKA Programowanie w jêzyku C jest czym wiêcej ni¿ tylko wprowadzaniem kodu zgodnego z regu³ami sk³adni; styl i wykrywanie b³êdów odgrywaj¹ równie istotn¹ rolê w procesie tworzenia oprogramowania. Istotnie przyczyniaj¹ siê do prawid³owego dzia³ania CENNIK I INFORMACJE programów oraz u³atwiaj¹ ich konserwacjê. W ksi¹¿ce omówiono wiêc nie tylko dzia³anie jêzyka C, ale równie¿ ca³y proces tworzenia programu w tym jêzyku ZAMÓW INFORMACJE (uwzglêdniaj¹c za³o¿enia projektowe programu, kodowanie, metody wykrywania O NOWO CIACH b³êdów, dokumentacjê, konserwacjê oraz aktualizacjê). Wbrew powszechnemu przekonaniu wiêkszo æ programistów nie spêdza ca³ego ZAMÓW CENNIK swojego czasu przy pisaniu kodu. Po wiêcaj¹ oni wiele czasu na wprowadzanie zmian i poprawek do aplikacji napisanych przez kogo innego. Po przeczytaniu tej ksi¹¿ki bêdziesz w stanie tworzyæ programy, z którymi inni programi ci nie bêd¹ musieli CZYTELNIA staczaæ bojów. Posi¹dziesz równie¿ umiejêtno æ analizowania kodu napisanego przez innego programistê. FRAGMENTY KSI¥¯EK ONLINE Ksi¹¿ka „Jêzyk C. Programowanie” omawia tak¿e popularne zintegrowane rodowiska programistyczne dla systemu Windows (Borland C++, Turbo C++ oraz Microsoft Visual C++) oraz narzêdzia programistyczne dla systemu UNIX (cc i gcc). Zawarto w niej równie¿ kod programu generuj¹cego statystyki, który ma za zadanie zademonstrowanie zagadnieñ omówionych w ksi¹¿ce. Ksi¹¿ka jest przeznaczona dla osób, które nie mia³y dot¹d do wiadczenia w programowaniu oraz dla programistów znaj¹cych ju¿ jêzyk C, a pragn¹cych poprawiæ swój styl i czytelno æ tworzonego kodu. Je li chcesz sprawnie pos³ugiwaæ siê C, „Jêzyk C. Programowanie” to idealny podrêcznik dla Ciebie. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Spis treści Wstęp ................................................................................................................................11 Organizacja książki................................................................................................................... 12 Omówienie rozdziałów ............................................................................................................ 12 Uwagi dotyczące trzeciej edycji ............................................................................................... 15 Zastosowane style czcionki ...................................................................................................... 16 FTP ........................................................................................................................................... 17 Część I Podstawy programowania .............................................19 Rozdział 1. Czym jest język C ........................................................................... 21 Na czym polega sztuka programowania ................................................................................. 22 Krótka historia języka C........................................................................................................... 25 Jak działa język C ..................................................................................................................... 25 Jak uczyć się języka C .............................................................................................................. 27 Rozdział 2. Tworzenie programu — podstawy................................................. 29 Program — od pomysłu do realizacji ...................................................................................... 30 Tworzenie prawdziwego programu ........................................................................................ 31 Tworzenie programu przy użyciu kompilatora trybu wiersza poleceń .................................. 31 Tworzenie programu przy użyciu 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
  • 3. 4 Spis treści Rozdział 3. Styl programowania ....................................................................... 53 Popularne style programowania.............................................................................................. 58 Różne szkoły programowania.................................................................................................. 60 Wcięcia oraz formatowanie kodu źródłowego ........................................................................ 61 Przejrzystość ............................................................................................................................ 62 Prostota .................................................................................................................................... 62 Podsumowanie......................................................................................................................... 63 Rozdział 4. Deklaracje i wyrażenia................................................................... 65 Elementy programu ................................................................................................................. 66 Podstawowa struktura programu............................................................................................ 66 Wyrażenia proste ..................................................................................................................... 68 Zmienne i ich zakres ................................................................................................................ 69 Deklaracja zmiennych .............................................................................................................. 70 Typ całkowity........................................................................................................................... 70 Instrukcja przypisania .............................................................................................................. 71 Funkcja printf ........................................................................................................................... 72 Typ zmiennoprzecinkowy........................................................................................................ 74 Porównanie dzielenia liczb zmiennoprzecinkowych i dzielenia liczb całkowitych................. 75 Typ znakowy............................................................................................................................ 76 Odpowiedzi.............................................................................................................................. 78 Ćwiczenia z programowania.................................................................................................... 79 Rozdział 5. Tablice, kwalifikatory oraz wprowadzanie znaków .................... 81 Tablice ...................................................................................................................................... 82 Łańcuchy .................................................................................................................................. 83 Wprowadzanie łańcuchów....................................................................................................... 85 Tablice wielowymiarowe ......................................................................................................... 88 Wprowadzanie liczb................................................................................................................. 89 Inicjalizacja zmiennych............................................................................................................. 91 Typ całkowity........................................................................................................................... 92 Typ zmiennoprzecinkowy........................................................................................................ 94 Deklaracje stałych..................................................................................................................... 95 Stałe 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 sterujące i warunkowe ................................................ 103 Instrukcja if............................................................................................................................. 104 Instrukcja else......................................................................................................................... 105
  • 4. Spis treści 5 Jak uniknąć stosowania funkcji strcmp .................................................................................. 106 Pętle........................................................................................................................................ 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 błędów .............................................................................................................. 125 Konserwacja ........................................................................................................................... 127 Aktualizacja............................................................................................................................ 127 Elektroniczna archeologia ...................................................................................................... 128 Redagowanie kodu programu ............................................................................................... 128 Zastosowanie debugera ......................................................................................................... 129 Edytor tekstu jako przeglądarka ............................................................................................ 129 Umieszczanie komentarzy ..................................................................................................... 129 Ćwiczenia z programowania.................................................................................................. 132 Część II Programowanie proste.................................................. 133 Rozdział 8. Dodatkowe instrukcje sterujące................................................... 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 parametrów........................................................................................................ 154 Programowanie strukturalne ................................................................................................. 155 Rekurencja.............................................................................................................................. 157 Odpowiedzi............................................................................................................................ 158 Ćwiczenia z programowania.................................................................................................. 159
  • 5. 6 Spis treści Rozdział 10. Preprocesor języka C .................................................................... 161 Instrukcja #define ................................................................................................................... 162 Kompilacja warunkowa ......................................................................................................... 167 Pliki dołączane ....................................................................................................................... 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 Różnica symetryczna (^) ........................................................................................................ 182 Negacja bitowa not (~) ........................................................................................................... 183 Operatory przesunięcia (<<, >>)............................................................................................ 183 Ustawianie, usuwanie i testowanie bitów.............................................................................. 185 Grafika bitmapowa ................................................................................................................ 188 Odpowiedzi............................................................................................................................ 193 Ćwiczenia z programowania.................................................................................................. 194 Rozdział 12. Typy złożone ................................................................................. 195 Struktury ................................................................................................................................ 196 Unie ........................................................................................................................................ 197 Instrukcja typedef .................................................................................................................. 200 Typ wyliczeniowy enum........................................................................................................ 201 Konwersja typów (rzutowanie).............................................................................................. 201 Struktury upakowane oraz pola bitowe ................................................................................ 202 Tablice struktur ...................................................................................................................... 203 Podsumowanie....................................................................................................................... 205 Ćwiczenia z programowania.................................................................................................. 205 Rozdział 13. Wskaźniki proste .......................................................................... 207 Wskaźniki jako argumenty funkcji......................................................................................... 212 Wskaźniki stałych................................................................................................................... 215 Wskaźniki i tablice ................................................................................................................. 215 Jak nie używać wskaźników .................................................................................................. 220 Użycie wskaźników do podziału łańcucha ............................................................................ 221 Wskaźniki i struktury............................................................................................................. 225 Argumenty wiersza poleceń .................................................................................................. 225 Ćwiczenia z programowania.................................................................................................. 230 Odpowiedzi............................................................................................................................ 230
  • 6. Spis treści 7 Rozdział 14. Pliki — operacje wejścia-wyjścia................................................ 233 Funkcje konwersji................................................................................................................... 237 Pliki binarne i tekstowe (ASCII)............................................................................................. 239 Znak końca wiersza................................................................................................................ 240 Binarne operacje wejścia-wyjścia ........................................................................................... 242 Problemy z buforowaniem..................................................................................................... 243 Niebuforowane operacje wejścia-wyjścia............................................................................... 244 Tworzenie formatów pliku .................................................................................................... 248 Odpowiedzi............................................................................................................................ 250 Ćwiczenia z programowania.................................................................................................. 251 Rozdział 15. Wykrywanie błędów oraz optymalizacja.................................... 253 Wykrywanie błędów .............................................................................................................. 253 Debugery interaktywne ......................................................................................................... 263 Algorytm binarnego wyszukiwania — wykrywanie błędów ................................................ 267 Błędy wykonania.................................................................................................................... 277 Opowiadana metoda wykrywania błędów............................................................................ 278 Optymalizacja......................................................................................................................... 279 Odpowiedzi............................................................................................................................ 286 Ćwiczenia z programowania.................................................................................................. 287 Rozdział 16. Liczby zmiennoprzecinkowe......................................................... 289 Format liczb zmiennoprzecinkowych .................................................................................... 290 Dodawanie-odejmowanie liczb zmiennoprzecinkowych....................................................... 291 Mnożenie liczb zmiennoprzecinkowych ................................................................................ 292 Dzielenie liczb zmiennoprzecinkowych................................................................................. 292 Przepełnienie i niedomiar ...................................................................................................... 293 Błąd zaokrąglenia ................................................................................................................... 294 Dokładność............................................................................................................................. 294 Minimalizacja błędu zaokrąglenia.......................................................................................... 295 Pomiar dokładności................................................................................................................ 296 Dokładność i szybkość ........................................................................................................... 297 Szereg potęgowy.................................................................................................................... 298 Ćwiczenia z programowania.................................................................................................. 300 Część III Programowanie zaawansowane .................................. 301 Rozdział 17. Zaawansowane wskaźniki ........................................................... 303 Wskaźniki i struktury............................................................................................................. 304 Funkcja free ............................................................................................................................ 307 Lista dowiązań ....................................................................................................................... 308 Operator wskaźnika struktury............................................................................................... 311 Uporządkowane listy dowiązań ............................................................................................ 311
  • 7. 8 Spis treści Lista podwójnych dowiązań .................................................................................................. 314 Drzewa ................................................................................................................................... 316 Wyświetlanie zawartości drzewa........................................................................................... 320 Pozostała część programu...................................................................................................... 321 Struktury danych programu do gry w szachy ....................................................................... 324 Odpowiedzi............................................................................................................................ 326 Ćwiczenia z programowania.................................................................................................. 327 Rozdział 18. Programowanie modularne .......................................................... 329 Moduły................................................................................................................................... 330 Sekcja publiczna i prywatna................................................................................................... 330 Modyfikator extern ................................................................................................................ 331 Nagłówek ............................................................................................................................... 333 Ciało modułu ......................................................................................................................... 335 Program wykorzystujący tablice nieograniczone................................................................... 336 Plik Makefile dla wielu plików .............................................................................................. 338 Zastosowanie tablicy nieograniczonej.................................................................................... 341 Podział projektu na moduły................................................................................................... 347 Przykład podziału na moduły: edytor tekstu ........................................................................ 348 Kompilator ............................................................................................................................. 349 Arkusz kalkulacyjny............................................................................................................... 350 Zasady tworzenia modułu ..................................................................................................... 351 Ćwiczenia z programowania.................................................................................................. 352 Rozdział 19. Starsze typy kompilatorów.......................................................... 355 Funkcje zgodne ze stylem K&R ............................................................................................. 356 Zmiana biblioteki ................................................................................................................... 358 Brakujące funkcje ................................................................................................................... 359 Zmiany funkcji free/malloc ................................................................................................... 359 Program lint ........................................................................................................................... 360 Odpowiedzi............................................................................................................................ 360 Rozdział 20. Problemy z przenoszeniem ........................................................... 363 Modularność .......................................................................................................................... 364 Długość słowa ........................................................................................................................ 364 Problem z kolejnością bajtów................................................................................................. 365 Problem z wyrównywaniem .................................................................................................. 366 Problem ze wskaźnikiem pustym .......................................................................................... 367 Problemy z nazwą pliku ........................................................................................................ 368 Typy plików ........................................................................................................................... 369 Podsumowanie....................................................................................................................... 369 Odpowiedzi............................................................................................................................ 369
  • 8. Spis treści 9 Rozdział 21. Zapomniane zakamarki języka 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 Końcowe uwagi...................................................................................................................... 387 Pliki programu ....................................................................................................................... 387 Ćwiczenia z programowania.................................................................................................. 406 Rozdział 23. Rady dla programisty................................................................... 407 Ogólne zalecenia .................................................................................................................... 407 Projektowanie......................................................................................................................... 408 Deklaracje............................................................................................................................... 408 Instrukcja switch .................................................................................................................... 409 Preprocesor ............................................................................................................................ 409 Styl.......................................................................................................................................... 409 Kompilacja.............................................................................................................................. 410 Ostatnia rada .......................................................................................................................... 410 Odpowiedzi............................................................................................................................ 410 Część IV Inne cechy języka .......................................................... 411 Dodatek A Tabela kodów ASCII..................................................................... 413 Dodatek B Zakresy i wzory konwersji parametrów przekazywanych ........ 417 Dodatek C Zasady dotyczące priorytetu operatorów ................................... 419 Dodatek D Program wyznaczający wartość funkcji sinus przy użyciu szeregu potęgowego .................................................. 421 Słownik terminów............................................................................................... 425 Skorowidz ..................................................................................................................... 449
  • 9. 12 Typy złożone Wielki majestat wielkiego gmachu, Wybrany przez inkwizytora struktur. — Wallace Stevens W tym rozdziale zostaną poruszone następujące zagadnienia: • Struktury • Unie • Instrukcja typedef • Typ wyliczeniowy enum • Konwersja typów (rzutowanie) • Struktury upakowane ora pola bitowe • Tablice struktur • Podsumowanie • Ćwiczenia z programowania Język C daje programiście do dyspozycji bogaty zestaw typów danych. Poprzez zastoso- wanie struktur, unii oraz typów wyliczeniowych programista może rozszerzyć język o nowe typy danych.
  • 10. 196 Rozdział 12. Typy złożone Struktury Załóżmy, że piszemy program obsługujący magazyn. W magazynie znajdują się skrzynie, które zawierają różne części. Wszystkie części znajdujące się w jednej skrzyni są jednakowe, dlatego też nie musimy się martwić o to, że zawartość skrzyń zostanie wymieszana. Na temat każdej skrzyni znane są następujące informacje: • Nazwa części w niej przechowywanej (łańcuch o długości 30 znaków). • Liczba części określona ręcznie (liczba całkowita). • Cena (grosze — liczba całkowita). W poprzednich rozdziałach do przechowywania grupy podobnych typów danych były sto- sowane tablice. Jednak w tym przykładzie mamy do czynienia z mieszanką dwóch liczb całkowitych i tekstu. Zamiast stosować tablicę zostanie użyty nowy typ danych określany terminem struktury. W przypadku tablicy wszystkie elementy są tego samego typu i są ponumerowane. W strukturze każdy element lub pole posiada nazwę oraz własny typ danych. Ogólna definicja struktury ma następującą postać: struct nazwa_struktury { typ_pola nazwa_pola; /* komentarz */ typ_pola nazwa_pola; /* komentarz */ ... } nazwa_zmiennej; Na przykład zdefiniujemy skrzynię, która będzie przechowywać kable do drukarki. Defi- nicja struktury ma następującą postać: struct bin { char name[30]; /* nazwa czesci */ int quantity; /* liczba czesci w skrzyni */ int cost; /* cena pojedynczej czesci (w groszach) */ } printer_cable_bin; /* miejsce przechowywania kabli do drukarki */ Powyższa definicja informuje język C o dwóch rzeczach. Pierwsza z nich określa format instrukcji struct bin. Instrukcja ta definiuje nowy typ danych, który może posłużyć do deklaracji innych zmiennych. Zmienna sprinter_cable_bin również jest deklarowana z użyciem tej instrukcji. Ponieważ struktura bin została zdefiniowana można ją zastosować w celu deklaracji dodatkowych zmiennych: struct bin terminal_cable_box; /* miejsce przechowywania kabli do terminala */ Część definicji o nazwie nazwa_struktury może być pominięta: struct { char name[30]; /* nazwa czesci */ int quantity; /* liczba czesci w skrzyni */ int cost; /* cena pojedynczej czesci (w groszach) */ } printer_cable_bin; /* miejsce przechowywania kabli do drukarki */
  • 11. Unie 197 Zmienna printer_cable_bin została zdefiniowana, ale nie został utworzony żaden typ danych. Innymi słowy, zmienna ta będzie jedyną zmienną w programie zdeklarowaną w powyższej strukturze. Typem danych takiej zmiennej jest struktura anonimowa (ang. ano- nymous structure). Część nazwa_zmiennej może również być pominięta. Poniższy przykład definiuje struk- turę typu nie zawierającą zmiennych: struct bin { char name[30]; /* nazwa czesci */ int quantity; /* liczba czesci w skrzyni */ int cost; /* cena pojedynczej czesci (w groszach) */ }; Można teraz w celu deklaracji zmiennych, takich jak printer_cable_bin, zastosować nowy typ danych (struct bin). W skrajnym przypadku zarówno część nazwa_zmiennej, jak i część nazwa_struktury mogą być pominięte. Części te są pod względem składni poprawne, ale zupełnie nieprzydatne. Zdeklarowaliśmy zmienną printer_cable_bin zawierającą trzy pola o nazwach: name, quantity i cost. Aby uzyskać do nich dostęp, użyj poniższej instrukcji: zmienna.pole Na przykład jeśli nagle okaże się, że cena kabli wzrosła do 12.95 złotych, musisz wykonać następującą instrukcję: printer_cable_bin.cost = 1295; /* 12.95 zlotych jest nowa cena */ Aby obliczyć wartość całej zawartości skrzyni, wykonaj poniższą instrukcję: total_cost = printer_cable_bin.cost * printer_cable_bin.quantity; Struktury mogą być inicjalizowane w chwili deklaracji poprzez umieszczenie listy elemen- tów w nawiasach klamrowych ({}): /* * Kable do drukarki */ struct bin { char name[30]; /* nazwa czesci */ int quantity; /* liczba czesci w skrzyni */ int cost; /* cena pojedynczej czesci (w groszach) */ } printer_cable_bin = { "Kable do drukarki", /* nazwa czesci znajdujacej sie w skrzyni */ 0, /* na poczatku skrzynia jest pusta */ 1295 /* cena -- 12.95 zlotych */ }; Unie Struktura jest stosowana do definicji typu danych zawierającego kilka pól. Każde pole ma przydzieloną oddzielną przestrzeń, którą zajmuje. Przykładowo poniższa struktura:
  • 12. 198 Rozdział 12. Typy złożone struct rectangle { int width; int height; }; jest przechowywana w pamięci. Unia jest podobna do struktury, ale ma przydzielone jedno wspólne miejsce, w których jest przechowywanych wiele różnych nazw pól: union value { long int i_value; /* zmienna typu calkowitego */ float f_value; /* zmienna typu zmiennoprzecinkowego */ }; Pole i_value oraz f_value dzielą tę samą przestrzeń pamięci. Strukturę można sobie wyobrazić jako wielkie pudło podzielone na kilka różnych komórek, z których każda ma inną nazwę. Unia jest też takim pudłem, ale tylko z jedną komórką i kil- koma różnymi etykietami umieszczonymi w jej wnętrzu. Rysunek 12.1 przedstawia strukturę z dwoma polami. Każdemu polu jest przypisana inna część struktury. Unia zawiera tylko jedną komórkę, do której są przypisane różne nazwy. Rysunek 12.1. Struktura i unia W przypadku struktury pola nie oddziałują wzajemnie na siebie. Modyfikacja jednego pola nie wpływa na pozostałe. W przypadku unii wszystkie pola zajmują tę samą przestrzeń, a więc tylko jedno z nich w danej chwili może być aktywne. Innymi słowy, jeśli jakaś war- tość zostanie przypisana zmiennej i_value, przypisanie wartości zmiennej f_value spowoduje usunięcie starej wartości, którą przechowuje zmienna i_value. W wydruku 12.1 pokazano przykład zastosowania unii. Wydruk 12.1. Zastosowanie unii /* * Deklaracja zmiennej przechowujacej liczbe calkowita * lub rzeczywista (ale nie obydwie) */
  • 13. Unie 199 union value { long int i_value; /* Liczba rzeczywista */ float f_value; /* Liczba zmiennoprzecinkowa */ } data; int i; /* Losowa liczba calkowita */ float f; /* Losowa liczba zmiennoprzecinkowa */ main() { data.f_value = 5.0; data.i_value = 3; /* nadpisana wartosc data.f_value */ i = data.i_value; /* prawidlowo */ f = data.f_value; /* nieprawidlowo, wywola nieprzewidywalne wyniki */ data.f_value = 5.5; /* przypisanie jakiejs wartosci f-value/i-value */ i = data.i_value; /* nieprawidlowo, wywola nieprzewidywalne wyniki */ return(O); } Unie są często wykorzystywane w branży telekomunikacyjnej. Załóżmy, że posiadamy taśmę umieszczoną w innym miejscu i chcemy wysłać do niej cztery komunikaty: „otwórz”, „zamknij”, „przeczytaj” oraz „zapisz”. Dane zawarte w tych czterech komunikatach zmie- niają się w szerokim zakresie zależnie od samych komunikatów. Komunikat „otwórz” musi zawierać nazwę taśmy, natomiast komunikat „zapisz” musi przenosić dane, które zostaną zapisane. Komunikat „przeczytaj” musi zawierać jak naj- większą liczbę znaków, które zostaną odczytane, natomiast komunikat „zamknij” nie za- wiera ż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; /* Ilosc bajtow do zapisania */ char data[DATA_MAX]; /* Zapisywane dane */ }; struct close_msg { }; const int OPEN_CODE=0; /* Kod otwieranego komunikatu */ const int READ_CODE=1; /* Kod odczytywanego komunikatu */ const int WRITE_CODE=2 /* Kod zapisywanego komunikatu */ const int CLOSE_CODE=3; /* Kod 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; };
  • 14. 200 Rozdział 12. Typy złożone Instrukcja typedef Język C umożliwia programiście zdefiniowanie swoich własnych typów danych poprzez zastosowanie instrukcji typedef. Instrukcja ta jest środkiem, dzięki któremu program może rozszerzyć podstawowe typy danych języka C. Ogólna postać instrukcji typedef jest na- stępująca, typedef deklaracja_typu; gdzie deklaracja_typu jest identyczna jak deklaracja zmiennej, poza tym że zamiast nazwy_ zmiennej jest użyta nazwa typu. Na przykład instrukcja typedef int count; definiuje nowy typ count, który jest taki sam jak typ całkowity. Tak więc poniższa deklaracja count flag; jest identyczna jak ta deklaracja int flag; Na pierwszy rzut oka powyższa instrukcja niewiele różni się od tej: #define count int count flag; Jednak instrukcje typedef mogą być stosowane do definiowania bardziej złożonych obiektów, co wykracza poza zakres możliwości prostej instrukcji #define. Oto przykład: typedef int group[10]; Został teraz zdefiniowany nowy typ danych o nazwie group określający tablicę dziesięciu liczb całkowitych: main() { typedef int group[10]; /* Utworzenie nowego typu 'group' */ group totals; /* Przypisanie nowego typu danych zmiennej */ for (i = 0; i < 10; i++) totals[i] = 0; return (0); } Częstym przykładem użycia instrukcji typedef jest definiowanie nowej struktury. Oto przykład: struct complex_struct { double real; double imag; }; typedef struct complex_struct complex; complex voltag1 = {3.5, 1.2};
  • 15. Konwersja typów (rzutowanie) 201 Typ wyliczeniowy enum Wyliczeniowy typ danych został stworzony dla zmiennych, które przechowują tylko ograni- czony zbiór wartości. Dostęp do tych wartości odbywa się poprzez nazwę (etykietę). Kom- pilator wewnętrznie przypisuje każdej takiej nazwie liczbę całkowitą. Rozważmy przykład aplikacji, w której zmienna będzie przechowywać dni tygodnia. Aby utworzyć wartości odpowiadające kolejnym dniom tygodnia w typie danych week_days, możemy zastosować deklarację const. Ma ona następującą 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 wylicze- niowego enum: enum week_day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; /* zastosowanie typu */ enum week_day today = TUESDAY; Ogólna postać instrukcji enum jest następująca: enum nazwa_typu { etykieta-1, etykieta-2, ... }nazwa_zmiennej Podobnie jak w przypadku struktur, część nazwa_typu lub nazwa_zmiennej może być pomi- nięta. Etykiety mogą być dowolnymi identyfikatorami dopuszczalnymi w języku C, ale zazwyczaj zawierają same małe litery. Język C implementuje typ wyliczeniowy enum jako zgodny z typem całkowitym, dlatego też całkowicie poprawne jest następujące określenie, today = 5; /* 5 nie jest typu week_day */ chociaż niektóre kompilatory po napotkaniu takiej instrukcji wyświetlą ostrzeżenie. W języ- ku C++ typ wyliczeniowy enum jest oddzielnym typem i nie jest kompatybilny z typem całkowitym. Konwersja typów (rzutowanie) Czasem konieczna jest zamiana jednego typu zmiennej na inny. Zadanie to jest reali- zowane poprzez operację rzutowania (ang. typecast operation). Ogólna postać rzutowania jest następująca: (typ) wyra enie
  • 16. 202 Rozdział 12. Typy złożone Operacja rzutowania nakazuje językowi C obliczenie wartości wyrażenia, a następnie kon- wersję jej typu na określony przez element typ. Rzutowanie jest szczególnie przydatne przy przetwarzaniu liczb całkowitych 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 wskaźników z jednego typu na inny. Struktury upakowane oraz pola bitowe Struktury upakowane umożliwiają deklarowanie struktur w taki sposób, że zajmują one minimalną ilość miejsca. Na przykład poniższa struktura zajmuje 6 bajtów (na platfor- mie 16-bitowej). struct item { unsigned int list; /* jesli pozycja jest na liscie, pole ma wartosc true */ unsigned int seen; /* jesli pozycja zostala przypisana polu, /* wtedy ma ono wartosc true */ unsigned int number; /* numer pozycji */ }; Na rysunku 12.2 został pokazany schemat przechowywania zmiennych struktury upako- wanej. Każda struktura zajmuje sześć bajtów dostępnej przestrzeni (dwa bajty dla każdego pola typu całkowitego). Rysunek 12.2. Struktura zwykła Pola list oraz seen mogą przechowywać tylko dwie wartości — 0 i 1 — tak więc do ich reprezentacji jest wymagany tylko jeden bit. Nie planujemy nigdy przekroczyć granicy 16383 pozycji (0x3fff lub 14 bitów). W takim razie można zmodyfikować definicję struktury przy użyciu pól bitowych, co polega na umieszczeniu na końcu każdego pola znaku dwukropka oraz liczby określającej liczbę bitów, które zostaną przypisane polu. W efekcie struktura będzie zajmować tylko dwa bajty przestrzeni. Struktura ma postać: struct item { unsigned int list:1; /* jesli pozycja jest na liscie */ /* wtedy pole ma wartosc true */ unsigned int seen:1; /* jesli pozycja zostala przypisana polu,*/
  • 17. Tablice struktur 203 /* wtedy ma ono wartosc true */ unsigned int number:14; /* numer pozycji */ }; W tym przykładzie poinstruujemy kompilator, aby wykorzystał po jednym bicie dla pól list i seen oraz 14 bitów dla pola number. Tym sposobem dane mogą być upakowane na obszarze tylko dwóch bajtów. Zostało to pokazane na rysunku 12.3. Rysunek 12.3. Struktura upakowana Struktury upakowane powinny być stosowane z umiarem. Wynikowy kod, który wykonuje operację rozpakowania danych przechowywanych przez pola bitowe, ma stosunkowo dużą objętość i działa wolno. Jeśli nie występuje problem z brakiem wolnej przestrzeni, struktury upakowane nie powinny być stosowane. W rozdziale 10., Preprocesor języka C, konieczne było zapisanie danych tekstowych oraz pięciu znaczników statusu liczących łącznie 8000 znaków. W takim przypadku zastosowanie dla każdego znacznika oddzielnego bajta pochłonęłoby sporą część przestrzeni (pięć bajtów dla każdego wprowadzonego znaku). Aby pomieścić pięć znaczników w jednym bajcie, zastosowano operacje bitowe. Inna metoda polegałaby na wykorzystaniu struktury upako- wanej. Zostało to pokazane poniżej: struct char_and_status { char character; /* Znak przekazany przez urzadzenie */ int error:1; /* Po wystapieniu dowolnego bledu przyjmuje wartosc true */ int framing_error:1; /* Wystapil blad ramki */ int parity_error:1; /* Znak mial nieprawidlowa parzystosc */ int carrier_lost:1; /* Sygnal nosny zanikl */ int channel_down:1; /* Urzadzenie komunikacyjne stracilo zasilanie */ }; Zastosowanie struktur upakowanych w przypadku znaczników jest bardziej czytelne i generuje mniej błędów niż przy użyciu operatorów bitowych. Jednak operatory bitowe dają programiście większą elastyczność, dlatego też sam powinieneś zdecydować, jaką metodę zastosować w zależności od tego, która z nich jest dla Ciebie bardziej zrozumiała i przystępna. Tablice struktur Struktury i tablice mogą być ze sobą łączone. Załóżmy, że chcemy zarejestrować czas, jaki potrzebuje biegacz na jedno okrążenie w biegu składającym się z czterech rund. Aby zapisać czas, należy zdefiniować następującą strukturę:
  • 18. 204 Rozdział 12. Typy złożone 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 powyższą strukturę w taki oto sposób: /* * Biegacz wlasnie minal punkt pomiarowy */ lap[count].hour = hour; lap[count].minute = minute; lap[count].second = second; ++count; Powyższa tablica może być zainicjalizowana przy uruchomieniu programu. Inicjalizacja tablicy struktur jest podobna do inicjalizacji tablic wielowymiarowych. Ma ona następującą postać: struct time start_stop[2] = { {10, 0, 0}, {12, 0, 0} }; Załóżmy, że chcemy napisać program obsługujący listę wysyłkową. Etykiety kopert składają się z 5 wierszy i mają szerokość 60 znaków. Należy zdefiniować strukturę służącą do prze- chowywania nazwisk i adresów. Lista wysyłkowa dla większości wydruków będzie sorto- wana według nazwiska, natomiast na potrzeby samej listy zostanie zastosowane sortowanie według kodu pocztowego. Struktura takiej listy wysyłkowej ma następującą postać: struct mailing { char name[60]; /* nazwisko, imie */ char address1[60]; /* dwa wiersze zawierajace ulice */ char address2[60]; char city[40]; char state[2]; /* dwuliterowy skrot */ long int zip; /* kod pocztowy */ }; Można teraz zdeklarować tablicę przechowującą zawartość listy wysyłkowej: /* Lista wysylkowa */ struct mailing list[MAX_ENTRIES]; Pole state składa się z dwóch elementów, ponieważ zostało przewidziane do przecho- wywania dwóch znaków. Pole to nie jest typu łańcuchowego, ponieważ nie została przy- dzielona wystarczająca ilość miejsca dla znaku końca łańcucha ('0').
  • 19. Ćwiczenia z programowania 205 Podsumowanie Struktury i unie są zaliczane do grupy bardziej efektywnych elementów języka C. Dzięki nim nie jesteś już ograniczony tylko do wbudowanych typów danych języka C — możesz definiować własne typy. Jak się okaże w następnych rozdziałach, w celu tworzenia bardzo złożonych i wydajnych struktur danych struktury mogą być łączone ze wskaźnikami. Ćwiczenia z programowania Ćwiczenie 12.1. Zaprojektuj strukturę przechowującą dane listy wysyłkowej. Napisz funkcję wyświetlającą dane. Ćwiczenie 12.2. Zaprojektuj strukturę przechowującą datę i czas. Napisz funkcję znajdującą przesunięcie w minutach pomiędzy dwoma czasami. Ćwiczenie 12.3. Zaprojektuj strukturę danych dla celów obsługi rezerwacji biletów lotni- czych, która zawiera następujące dane: • Numer lotu • Kod lotniska odlotu (trzy znaki) • Kod lotniska przylotu (trzy znaki) • Czas odlotu • Czas przylotu Ćwiczenie 12.4. Napisz program, który generuje listę zawierającą wszystkie samoloty odlatujące z dwóch lotnisk określonych przez użytkownika.