You are on page 1of 15

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Wstp do
programowania
w jzyku C++
Autor: Radosaw Sok
ISBN: 83-246-0179-1
Format: B5, stron: 400

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

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

Jzyki C i C++ to bardzo uniwersalne platformy programistyczne o ogromnych


moliwociach. Wykorzystywane s do tworzenia systemw operacyjnych
i oprogramowania uytkowego. Dziki niskiemu poziomowi abstrakcji nadaj si
rwnie do tworzenia programw rezydentnych i sterownikw urzdze. C++,
opracowany w latach 1983-1985, jest w peni obiektowym jzykiem programowania
pozwalajcym na prost implementacj nawet rozbudowanych algorytmw i struktur
danych. Jego popularno wyraa si w ogromnej liczbie aplikacji tworzonych za jego
pomoc, bogactwie dostpnych narzdzi programistycznych i tysicach witryn WWW
powiconych temu jzykowi.
Ksika Wstp do programowania w jzyku C++ to podrcznik opisujcy zasady
tworzenia aplikacji za pomoc C++. Dowiesz si z niej, jak zainstalowa kompilator
MinGW i edytor kodu rdowego Crimson Edit, poznasz podstawowe elementy
i konstrukcje jzyka C++ i w oparciu o zdobyt wiedz napiszesz proste programy.
Nauczysz si implementowa operacje wejcia i wyjcia, zarzdza pamici i tworzy
mechanizmy obsugi bdw. Przeczytasz take o programowaniu obiektowym
i wykorzystasz mechanizmy obiektowe w swoich aplikacjach.
Instalacja oprogramowania narzdziowego
Proces tworzenia programw w jzyku C++
Deklarowanie zmiennych
Sterowanie przebiegiem dziaania programu
Struktury danych
Operacje wejcia i wyjcia
Przydzielanie pamici i stosowanie wskanikw
Programowanie obiektowe
Korzystanie z szablonw
Obsuga wyjtkw
Budowanie aplikacji wielomoduowych
Jeli chcesz atwo i szybko opanowa podstawy C++, signij po t ksik

Spis treci
Wstp .............................................................................................. 9

Cz I

Oprogramowanie narzdziowe ........................................15

Rozdzia 1. Instalacja pakietu MinGW ............................................................... 17


Instalacja pakietu MinGW .............................................................................................. 17
Konfiguracja systemu w celu atwego korzystania z narzdzi pakietu MinGW ............. 22
Testowanie dziaania pakietu MinGW ........................................................................... 24

Rozdzia 2. Crimson Editor: edytor programisty ................................................. 27


Instalacja edytora Crimson Editor .................................................................................. 29
Uruchamianie edytora .................................................................................................... 31
Dostosowywanie programu do wasnych potrzeb .......................................................... 32
Przechodzenie do wybranego wiersza programu ............................................................ 35

Rozdzia 3. Tworzenie i kompilacja programw w jzyku C++ ............................. 37


Translator, interpreter, kompilator .................................................................................. 37
Translator ................................................................................................................. 37
Interpreter ................................................................................................................. 37
Kompilator ............................................................................................................... 38
Kompilator JIT ......................................................................................................... 39
Problem jajka i kury ................................................................................................. 39
Twj pierwszy program .................................................................................................. 40
Kompilacja programu ..................................................................................................... 43
Opcje kompilacji ............................................................................................................ 43
Uruchamianie skompilowanego programu ..................................................................... 45
Podsumowanie ............................................................................................................... 45

Cz II

Jzyk C++ .....................................................................47

Rozdzia 4. Wprowadzanie, wyprowadzanie i przechowywanie danych ................. 49


Funkcja main() ............................................................................................................... 50
Umieszczanie tekstu na ekranie ...................................................................................... 52
Komentarze .................................................................................................................... 56
Zmienne ......................................................................................................................... 57
Deklaracje zmiennych .............................................................................................. 58
Zmienne typu rzeczywistego .................................................................................... 61

Wstp do programowania w jzyku C++


Zmienne logiczne ..................................................................................................... 62
Zmienne acuchowe ............................................................................................... 63
Wypisywanie zawartoci zmiennych ....................................................................... 64
Rzutowanie typw zmiennych ................................................................................. 67
Badanie rozmiaru zmiennych w pamici ................................................................. 68
Pobieranie danych z klawiatury ...................................................................................... 69
Podsumowanie ............................................................................................................... 73

Rozdzia 5. Tablice, ptle i wyraenia warunkowe .............................................. 75


Tablice ............................................................................................................................ 76
Deklarowanie zmiennych tablicowych ..................................................................... 76
Zapisywanie i odczytywanie elementw tablicy ...................................................... 77
Tablice wielowymiarowe ......................................................................................... 77
Zmienne acuchowe jako tablice ............................................................................ 82
Skracanie wyrae algebraicznych ................................................................................. 83
Wyraenia warunkowe ................................................................................................... 86
Instrukcja if .............................................................................................................. 88
Uproszczone wyraenie warunkowe ........................................................................ 91
Ptle ................................................................................................................................ 93
Ptle typu while ........................................................................................................ 94
Ptle typu dowhile ................................................................................................ 96
Ptle typu for ............................................................................................................ 98
Przerywanie ptli .................................................................................................... 101
Podsumowanie ............................................................................................................. 102

Rozdzia 6. Programowanie proceduralne ........................................................ 105


Deklarowanie i wywoywanie podprogramw ............................................................. 106
Parametry i zmienne w podprogramach ....................................................................... 109
Zmienne globalne i lokalne .................................................................................... 109
Statyczne zmienne lokalne ..................................................................................... 113
Przekazywanie parametrw podprogramom .......................................................... 115
Parametry domylne ............................................................................................... 119
Zwracanie danych przez funkcj ............................................................................ 120
Zwracanie danych poprzez parametry .................................................................... 124
Parametry tekstowe ................................................................................................ 127
Przerywanie dziaania programu z wntrza podprogramu ...................................... 128
Programy przykadowe ................................................................................................. 129
Zamiana kropki dziesitnej na przecinek ............................................................... 130
Eleganckie wczytywanie tekstu z klawiatury ......................................................... 134
Gra Tor saneczkowy ........................................................................................... 137
Podsumowanie ............................................................................................................. 143

Rozdzia 7. Wyliczenia, struktury, napisy ......................................................... 145


Wyliczenia .................................................................................................................... 145
Definiowanie wyliczenia ........................................................................................ 146
Wartoci liczbowe wylicze ................................................................................... 147
Deklarowanie i uywanie wylicze ........................................................................ 148
Wyraenie warunkowe switch ............................................................................... 148
Zamiana wylicze na liczby ................................................................................... 156
Struktury danych .......................................................................................................... 157
Definiowanie struktury danych .............................................................................. 158
Deklarowanie zmiennej strukturalnej ..................................................................... 159
Odwoywanie si do struktur i elementw struktury .............................................. 160
Kopiowanie struktur ............................................................................................... 161

Spis treci

5
Napisy .......................................................................................................................... 161
Kopiowanie zawartoci zmiennych acuchowych ................................................ 162
Doczanie tekstu do zmiennej ............................................................................... 163
Porwnywanie tekstu ............................................................................................. 164
Wyszukiwanie tekstu ............................................................................................. 165
Podsumowanie ............................................................................................................. 168

Rozdzia 8. Operacje wejcia-wyjcia .............................................................. 171


Standardowe wejcie i standardowe wyjcie ................................................................ 172
Standardowe wyjcie .............................................................................................. 172
Standardowe wyjcie komunikatw bdw .......................................................... 174
Standardowe wejcie .............................................................................................. 175
Tworzenie filtru danych ......................................................................................... 177
Parametry dziaania programu ...................................................................................... 182
Parametry podawane przy uruchamianiu ............................................................... 182
Zwracanie kodu bdu ............................................................................................ 185
Dostp do plikw ......................................................................................................... 185
Wasne potoki danych ............................................................................................ 186
Otwieranie pliku ..................................................................................................... 186
Zamykanie pliku .................................................................................................... 188
Testowanie faktu otwarcia pliku ............................................................................ 188
Sprawdzanie faktu dotarcia do koca pliku ............................................................ 189
Odczytywanie i zapisywanie danych ...................................................................... 189
Program szpaltujcy ............................................................................................... 190
Zapisywanie i odczytywanie struktur danych ........................................................ 195
Zmiana aktualnej pozycji wewntrz pliku .............................................................. 201
Zapisywanie i odczytywanie napisw .................................................................... 208
Podsumowanie ............................................................................................................. 212

Rozdzia 9. Pami operacyjna i wskaniki ...................................................... 215


Informacje podstawowe ............................................................................................... 216
Typy blokw pamici ............................................................................................. 216
Terminologia .......................................................................................................... 216
Wskaniki ..................................................................................................................... 217
Deklarowanie wskanikw .................................................................................... 218
Wskazywanie na zmienne ...................................................................................... 218
Odczytywanie i zapisywanie danych wskazywanych przez wskanik ................... 220
Wskaniki a struktury ............................................................................................ 221
Wskaniki a tablice ................................................................................................ 221
Wskaniki a zmienne acuchowe ......................................................................... 222
Operacje na wskanikach ....................................................................................... 222
Pami przydzielana dynamicznie ................................................................................ 225
Alokowanie bloku pamici ..................................................................................... 227
Dealokowanie bloku pamici ................................................................................. 229
Wypenianie i zerowanie bloku pamici ................................................................ 232
Kopiowanie bloku pamici ..................................................................................... 234
Dynamiczne struktury danych ...................................................................................... 236
Lista jednostronnie czona .................................................................................... 237
Lista dwustronnie czona ...................................................................................... 241
Stos ........................................................................................................................ 245
Podsumowanie ............................................................................................................. 248

Wstp do programowania w jzyku C++

Rozdzia 10. Programowanie obiektowe ............................................................ 251


Struktury danych .......................................................................................................... 252
Deklaracja struktury ............................................................................................... 252
Konstruktor ............................................................................................................ 252
Konstruktory pobierajce parametry ...................................................................... 253
Konstruktor z parametrami domylnymi ................................................................ 255
Destruktor .............................................................................................................. 255
Funkcje skadowe ................................................................................................... 258
Dziedziczenie ............................................................................................................... 264
Dziedziczenie proste .............................................................................................. 264
Prawa dostpu do pl i funkcji ............................................................................... 267
Struktury a klasy .................................................................................................... 270
Dziedziczenie wielokrotne ..................................................................................... 271
Dziedziczenie a konstruktory ................................................................................. 272
Dziedziczenie a destruktory ................................................................................... 273
Pena wersja programu-magazynu ................................................................................ 273
Nakrywanie funkcji i funkcje wirtualne ....................................................................... 280
Nakrywanie funkcji ................................................................................................ 280
Funkcje nakryte a wskaniki do obiektw ............................................................. 285
Funkcje wirtualne ................................................................................................... 287
Funkcje prawdziwie wirtualne ............................................................................... 289
Operator this ................................................................................................................. 290
Przecianie operatorw ............................................................................................... 291
Tworzenie operatorw ........................................................................................... 292
Operatory ++ i -- .................................................................................................... 295
Operator indeksowy [] ............................................................................................ 297
Konstruktor kopiujcy ............................................................................................ 299
Operator przypisania a konstruktor kopiujcy ........................................................ 300
Statyczne pola i funkcje skadowe klas ........................................................................ 301
Podsumowanie ............................................................................................................. 303

Rozdzia 11. Szablony C++ ............................................................................... 309


Szablony funkcji ........................................................................................................... 310
Szablony klas ............................................................................................................... 313
Tworzenie szablonu klasy ...................................................................................... 314
Szablony z parametrami ......................................................................................... 314
Struktury danych realizowane za pomoc szablonw .................................................. 315
Lista dwustronnie czona ...................................................................................... 316
Stos ........................................................................................................................ 325
Podsumowanie ............................................................................................................. 328

Rozdzia 12. Obsuga sytuacji wyjtkowych ....................................................... 331


Czym jest sytuacja wyjtkowa ..................................................................................... 332
Czy obsuga sytuacji wyjtkowych jest szybka ............................................................ 332
Tworzenie bloku instrukcji mogcych spowodowa bd ............................................ 333
Tworzenie bloku instrukcji obsugujcych bdy ......................................................... 334
Generowanie wasnych sytuacji wyjtkowych ............................................................. 334
Rnicowanie obsugi sytuacji wyjtkowych ............................................................... 337
Zmienne i obiekty a blok instrukcji try ......................................................................... 339
Dynamiczna alokacja pamici a blok instrukcji try ...................................................... 341
Sytuacje wyjtkowe a destruktory ................................................................................ 343
Sytuacje wyjtkowe a konstruktory .............................................................................. 343
Przekazywanie informacji o przyczynie zgoszenia sytuacji wyjtkowej ..................... 343
Podsumowanie ............................................................................................................. 347

Spis treci

Rozdzia 13. Budowanie programw wielomoduowych ...................................... 349


Testowanie funkcjonowania ......................................................................................... 349
Asercje ................................................................................................................... 350
Kompilowanie programu w wersji finalnej ............................................................ 352
Zastpowanie asercji wasnymi fragmentami kodu ................................................ 354
Uruchamianie zewntrznych programw ..................................................................... 356
Dzielenie programw na moduy ................................................................................. 358
Wydzielanie moduu bibliotecznego ...................................................................... 358
Kompilowanie programu wielomoduowego ......................................................... 361
Pliki nagwkowe ................................................................................................... 363
Wielomoduowe programy obiektowe ................................................................... 364
Zmienne globalne w programach wielomoduowych ............................................. 367
Przestrzenie nazw ......................................................................................................... 368
Tworzenie przestrzeni nazw ................................................................................... 368
Uywanie przestrzeni nazw .................................................................................... 369
Wymuszanie uycia przestrzeni nazw .................................................................... 371
Podsumowanie ............................................................................................................. 373

Dodatki ......................................................................................375
Dodatek A Tabela kodw znakw ASCII ......................................................... 377
Dodatek B Polskie znaki diakrytyczne w programach pisanych w jzyku C++ ... 383
Skorowidz ..................................................................................... 387

Rozdzia 5.

Tablice, ptle
i wyraenia warunkowe
W poprzednim rozdziale nauczye si tworzy programy o tak zwanym przebiegu liniowym. W przypadku takich programw komputer rozpoczyna wykonywanie ich
kodu w cile okrelonym miejscu, realizuje kod skadajcy si na kolejne wyraenia
w sposb sekwencyjny (jedno po drugim), po czym dochodzi do koca bloku instrukcji i koczy dziaanie programu.
W realnych zastosowaniach oprogramowania takie programy nale do rzadkoci.
Program musi prawie zawsze reagowa na pewne specjalne sytuacje, wykonujc jeden z kilku blokw instrukcji w zalenoci od tego, jaki zestaw warunkw speniaj
dane wejciowe lub porednie wyniki oblicze. Podczas wprowadzania danych przez
uytkownika program powinien weryfikowa podawane informacje i zgasza wszelkie nieprawidowoci. Niektre zastosowania komputerw wymagaj te przeprowadzania powtarzalnych oblicze na duych blokach danych tego samego typu. Widzisz
chyba, e prba sprostania wszystkim tym wymaganiom za pomoc programu o przebiegu liniowym byaby z gry skazana na niepowodzenie.
Jzyk C++, jak kady rozbudowany jzyk wysokiego poziomu, daje Ci jednak do
dyspozycji zestaw narzdzi umoliwiajcych wprowadzenie do programu fragmentw
wykonywanych w sposb powtarzalny (wielokrotny, w ptli) lub warunkowy (zaleny
od zestawu warunkw) oraz upraszczajcych obrbk duych iloci danych tego samego typu. Narzdzia te to:
tablice umoliwiaj przechowywanie pod jedn nazw wielu zmiennych

tego samego typu i odwoywanie si do kolejnych elementw za pomoc


liczby wyraajcej kolejny numer elementu wewntrz tablicy;
struktury ptli umoliwiaj wielokrotne wykonanie bloku instrukcji

przy zmieniajcych si parametrach pracy (na przykad ze zmieniajc si


wartoci jednej zmiennej sucej do wybierania konkretnego elementu
z tablicy danych);

Cz II Jzyk C++

76

wyraenia warunkowe umoliwiaj wykonywanie jednego z dwch

(lub wicej) blokw instrukcji w zalenoci od wartoci wskazanych


zmiennych i warunkw, ktre te wartoci speniaj.

Tablice
Tak naprawd o tablicach dowiedziae si ju co nieco z poprzedniego rozdziau,
przy okazji nauki korzystania ze zmiennych acuchowych. Zmienna acuchowa
przechowujca napis skadajcy si z pojedynczych znakw jest niczym wicej, jak
tablic znakw, pod jedn nazw grupujc wiele pojedynczych elementw typu
char. Definicja:
char Napis[200];

oznacza, e pod nazw Napis przechowywanych bdzie 200 elementw typu char,
numerowanych kolejnymi liczbami od 0 do 199. Taki sposb numerowania, w ktrym
pierwszy element zawsze ma indeks 0, w wiecie komputerw nie jest niczym niezwykym, a w jzykach C oraz C++ jest norm. Aby efektywnie korzysta z tablic,
musisz wpoi sobie ten sposb numerowania (czyli w jzyku programistw indeksowania) elementw tablic (rysunek 5.1).
Rysunek 5.1.
Elementy tablicy
i sposb ich
indeksowania

Tablice (inaczej nazywane zmiennymi tablicowymi) s komputerowym odpowiednikiem macierzy uywanych w matematyce.

Deklarowanie zmiennych tablicowych


Skoro okazuje si, e znasz ju doskonale sposb deklarowania tablic, moesz sprbowa stworzy tablic elementw innego typu ni char. Sprbuj na przykad stworzy zestaw zmiennych tablicowych skadajcych si na baz danych o ocenach ucznia szkoy:
float Oceny[25];
char NazwyPrzedmiotow[25][50];
float Srednia;
unsigned int LiczbaPrzedmiotow = 0;

Tak, znw nieco utrudniem zadanie. Drugi wiersz powyszego przykadu deklaruje
zmienn przechowujc 25 tablic (numerowanych od 0 do 24) skadajcych si z 50
elementw typu char. Moe Ci si to wyda skomplikowane, jednak rwnie dobrze
moesz zinterpretowa ten zapis jako deklaracj zmiennej NazwyPrzedmiotow skadajcej si z 25 napisw po 50 znakw kady.

Rozdzia 5. Tablice, ptle i wyraenia warunkowe

77

W przypadku tablic rzadko stosuje si przypisywanie poszczeglnym elementom


wartoci pocztkowych przede wszystkim dlatego, e wprowadzanie z klawiatury
setek lub tysicy liczb nie jest ani przyjemne, ani najczciej w ogle potrzebne. Tablice zwykle zapenia uytkownik programu w czasie jego dziaania (przez wprowadzanie tylu danych, ile jest potrzebne reszta tablicy moe lee odogiem); mog
by te wypeniane wynikami oblicze. Gdyby koniecznie chcia wypeni tablic
konkretnymi wartociami, odpowiedni zapis wyraenia wyglda nastpujco:
float Oprocentowanie[4] = { 1.0, 1.4, 1.6, 3.4 };

Zapisywanie i odczytywanie elementw tablicy


Odwoywanie si do pojedynczych elementw zmiennej tablicowej jest niewiele bardziej skomplikowane ni odwoywanie si do pojedynczej zmiennej. Wystarczy, aby
za nazw zmiennej umieci zamknity w nawiasach indeks (numer kolejnego elementu),
a odwoasz si tylko do jednego, wybranego elementu tablicy:
int m[10];
m[5] = 32;
printf("Szosty element tablicy m ma warto %i.\n", m[5]);

To nie jest bd. Jeszcze raz przypominam, e pierwszy element tablicy ma indeks
0 (m[0]), za element m[5] jest szstym elementem zmiennej tablicowej m.

Rwnie bezporednie odczytanie elementu tablicy z klawiatury za pomoc funkcji


scanf() nie wymaga specjalnych zabiegw:
int m[10];
scanf("%i", &m[2]);
printf("Trzeci element tablicy m ma warto %i.\n", m[2]);

Tablice wielowymiarowe
Tablica wielowymiarowa to tablica skadajca si z wielu tablic. Najprostszym przykadem tablicy wielowymiarowej jest tablica dwuwymiarowa, z ktr zetkne si
przed chwil. Tablica dwuwymiarowa to zbir elementw indeksowanych nie jedn,
a dwiema liczbami: jedna okrela numer wiersza, a druga numer kolumny, w ktrej
znajduje si szukany element (rysunek 5.2).
W identyczny sposb moesz stworzy tablice trj- lub czterowymiarowe, w ktrych
odwoanie si do kadego z elementw wymaga podania trzech lub czterech liczbindeksw. Mona nawet wyobrazi sobie sensowne zastosowanie tak skomplikowanej
tablicy wyobra sobie, e budujesz baz danych suc do przechowywania informacji o zajtoci miejsc w pocigach, przy czym kady z 20 pocigw moe mie
do 10 wagonw, w ktrych znajduj si 3 przedziay po sze miejsc. Tre takiego
programu znajdziesz na listingu 5.1, a wynik jego dziaania na rysunku 5.3.

Cz II Jzyk C++

78
Rysunek 5.2.
Tablica
dwuwymiarowa

Listing 5.1. Program informujcy o dostpnoci miejsca w pocigu


#include <stdio.h>
int main()
{
unsigned short int pociag, wagon, przedzial, miejsce;
bool MiejsceZajete[20][10][3][6]; // 20 pocigw po 10 wagonw
// po 3 przedziay po 6 miejsc.
// *** Odczytywanie danych
printf("Wyszukiwanie wolnych miejsc\n"
"---------------------------\n\n");
printf("Podaj numer pociagu (1-20):\t");
scanf("%hu", &pociag);
printf("Podaj numer wagonu (1-10):\t");
scanf("%hu", &wagon);
printf("Podaj numer przedzialu (1-3):\t");
scanf("%hu", &przedzial);
printf("Podaj numer miejsca (1-6):\t");
scanf("%hu", &miejsce);
// *** Skoryguj indeksy -- czowiek podaje od 1 w gr,
// *** komputer chce od 0 w gr.
pociag = pociag 1;
wagon = wagon 1;
przedzial = przedzial 1;
miejsce = miejsce 1;
// *** Wywietl informacj o zajtoci miejsca.

Rozdzia 5. Tablice, ptle i wyraenia warunkowe

79

printf("\nStan zajetosci miejsca: %i\n",


MiejsceZajete[pociag][wagon][przedzial][miejsce]);
return 0;
}

Program przykadowy 01.cpp

Rysunek 5.3.
Efekt dziaania
programu

Uyteczno tego programu jest adna, poniewa dane o zajtoci miejsc nie s nigdy
wprowadzane. To, czy miejsce zostanie zgoszone jako wolne (stan zajtoci miejsca
rwny 0), czy zajte (stan zajtoci miejsca rny od 0) jest kwesti przypadku
zawarto zmiennych, do ktrych nigdy nic nie zapisae jest cakowicie przypadkowa.
Program jednak doskonale ilustruje trzy bardzo istotne zagadnienia, z ktrymi bdziesz
musia si zmaga:
Najprostszym problemem jest brak obsugi typu danych bool przez funkcj
printf(). Aby w prosty sposb wyprowadzi zawarto zmiennej tego typu
na ekran, naley posuy si kodem formatujcym %i, jednak jego uycie
spowoduje wyprowadzenie liczby: 0 dla wartoci false oraz dowolnej
innej (rnej od zera) dla wartoci true. Na szczcie za pomoc wyrae

warunkowych mona ten kopot szybko i elegancko rozwiza, o czym


przekonasz si nieco dalej w tym rozdziale.
Program nie sprawdza podawanych numerw pocigw, wagonw czy miejsc.

Jeeli uruchomisz go jeszcze raz i podasz absolutnie bezsensowne indeksy,


ujrzysz okno informujce o wystpieniu bdu w aplikacji i program zostanie
natychmiast przerwany przez system operacyjny (rysunek 5.4). Dopiero gdy
nauczysz si stosowa wyraenia warunkowe, dowiesz si, jak zapobiega
takim sytuacjom.
Przeliczanie indeksw z postaci logicznej dla czowieka na posta odpowiedni

dla komputera i vice versa. Uytkownik spodziewa si, e kolejne pocigi


numerowane s liczbami od 1 w gr, podczas gdy komputer bezwzgldnie
wymaga, by elementy tablicy odpowiadajce pocigom nosiy indeksy od zera
w gr. Za kadym razem, gdy wymagasz od uytkownika podania numeru
elementu, musisz go skorygowa, zmniejszajc go o jeden, i na odwrt
gdy wywietlasz z jakich powodw numer elementu, powiniene doda
do niego jeden.

80

Cz II Jzyk C++

Rysunek 5.4. Tak koczy si odwoywanie do nieprawidowych indeksw tablicy

Podczas pisania wasnych programw pamitaj, by nie naduywa tablic wielowymiarowych. Stosuj si do nastpujcych zasad:
tablice jednowymiarowe stosowane s niezwykle czsto choby jako

zmienne acuchowe. Nie bj si ich i gdy tylko musisz zapamita kilka


kolejnych elementw tego samego typu i o tym samym znaczeniu uyj
tablicy;
tablice dwuwymiarowe s przydatne na przykad przy zapamitywaniu

danych typu kartograficznego ksztatu mapy pisanej przez Ciebie gry


komputerowej czy pooenia przedmiotw lecych w pokoju. Specjalnym
przypadkiem s te tablice przechowujce zmienne acuchowe. Tablic
dwuwymiarowych powiniene uywa zawsze tam, gdzie wydaj si
naturalne i gdzie nie bdziesz mie kopotw z ich uywaniem;
tablice wyszych rzdw rzadko wykorzystuje si w praktyce. Tego typu

zmienne tablicowe stosuj tylko wtedy, gdy wydaje Ci si to absolutnie


konieczne.
Program przedstawiony na listingu 5.1 jest poprawny i przejrzysty, ale rwnie dobrze
mona by go zapisa bez korzystania z tablicy czterowymiarowej w kocu kade
z miejsc w pocigu moe zawiera zapisany w sobie numer wagonu i przedziau. W takim przypadku wystarczy poda numer pocigu i numer miejsca, a program sam wyznaczy numer wagonu i przedziau oraz poinformuje, czy miejsce jest wolne, czy zajte.
Zmodyfikowany program zaprezentowany zosta na listingu 5.2, a wynik jego dziaania na rysunku 5.5.

Rozdzia 5. Tablice, ptle i wyraenia warunkowe


Listing 5.2. Program informujcy o stanie zajtoci miejsca w pocigu napisany z wykorzystaniem
tablicy dwuwymiarowej
#include <stdio.h>
int main()
{
unsigned short int pociag, wagon, przedzial, miejsce;
bool MiejsceZajete[20][180]; // 20 pocigw po 10 wagonw
// po 3 przedziay po 6 miejsc,
// czyli 20 pocigw po 180 miejsc.
// *** Odczytywanie danych.
printf("Wyszukiwanie wolnych miejsc\n"
"---------------------------\n\n");
printf("Podaj numer pociagu (1-20):\t");
scanf("%hu", &pociag);
printf("Podaj numer miejsca (1-180):\t");
scanf("%hu", &miejsce);
// *** Skoryguj indeksy -- czowiek podaje od 1 w gr,
// *** komputer chce od 0 w gr.
pociag = pociag - 1;
miejsce = miejsce - 1;
// *** Przeliczanie numeru miejsca na numer wagonu i przedziau.
// *** Od razu koryguj numery o jeden!
// W pocigu jest 10 wagonw po 18 miejsc.
wagon = (miejsce / 18) + 1;
// W wagonie s 3 przedziay po 6 miejsc.
przedzial = ((miejsce % 18) / 6) + 1;
// *** Wywietl informacj o pooeniu i zajtoci miejsca.
printf("\nMiejsce znajduje sie w wagonie nr %i i przedziale nr %i.\n"
"Stan zajetosci miejsca: %i\n",
wagon, przedzial,
MiejsceZajete[pociag][miejsce]);
return 0;
}

Program przykadowy 02.cpp

81

Cz II Jzyk C++

82
Rysunek 5.5.
Efekt dziaania
programu

Zmienne acuchowe jako tablice


Na pocztku tego podrozdziau wspominaem, e ze zmiennymi tablicowymi zetkne si ju niewiadomie w czasie poznawania zmiennych acuchowych. Dotychczas zmiennych acuchowych uywae jedynie na trzy sposoby:
nadajc zmiennej acuchowej warto pocztkow za pomoc wyraenia
char NazwaZmiennej[dugo] = "tekst";;
zmieniajc zawarto zmiennej acuchowej za pomoc funkcji scanf()

(wprowadzajcej do zmiennej acuchowej tekst wpisywany przy uyciu


klawiatury przez uytkownika);
wywietlajc tekst przechowywany w zmiennej acuchowej za pomoc
funkcji printf().

Zmienne acuchowe moesz te traktowa jak najzwyklejsze tablice elementw typu


char i odczytywa oraz zapisywa ich pojedyncze elementy. Pamitaj jedynie, e aby
taka zmienna nadal moga by traktowana jak zmienna acuchowa (przechowujca
tekst), gdzie wewntrz przydzielonego jej obszaru pamici musi znale si znak o kodzie zero, oznaczajcy koniec tekstu. Znakowi takiemu odpowiada kod specjalny \0:
char KodZerowy = '\0';

// Przypisanie kodu zerowego zmiennej typu char.

Przykad programu dokonujcego zmian w tekcie (zapisanym w zmiennej acuchowej) za pomoc zwykych operacji odwoywania si do pojedynczych elementw typu
char tablicy przedstawiony zosta na listingu 5.3, a na rysunku 5.6 efekt dziaania
tego programu.
Listing 5.3. Przykad traktowania zmiennej acuchowej jak zwykej tablicy elementw typu char
#include <stdio.h>
int main()
{
char Napis[40] = "To jest napis 12345678901234567890";
// Zamie dziewity znak z 'n' na 'Z'.
Napis[8] = 'Z';
// Obetnij napis po 20 znakach.
Napis[20] = '\0';

Rozdzia 5. Tablice, ptle i wyraenia warunkowe


// Wywietl napis.
printf("%s\n", Napis);
// Koniec.
return 0;
}

Program przykadowy 03.cpp

Rysunek 5.6.
Efekt dziaania
programu

Nic nie stoi na przeszkodzie, by tablic elementw typu char wykorzystywa wycznie jako zbir znakw, a nie jako zmienn acuchow. W takim przypadku
moesz przechowywa w poszczeglnych elementach znaki o dowolnych kodach,
pamitaj jednak, by nigdy nie uywa takiej tablicy jako parametru funkcji operujcych na zmiennych acuchowych.

Wicej informacji na temat manipulowania tekstem zapisanym w zmiennych acuchowych znajdziesz w rozdziaach 7. i 9.

83

You might also like