7020

Szczegóły
Tytuł 7020
Rozszerzenie: PDF
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres [email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.

7020 PDF - Pobierz:

Pobierz PDF

 

Zobacz podgląd pliku o nazwie 7020 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.

7020 - podejrzyj 20 pierwszych stron:

prof. Jan Bielecki Visual C++ 6.0 Podstawy programowania Dodatki Priorytety operator�w Opracowywanie wyra�e� Konwersje standardowe Funkcje wej�cia-wyj�cia Pierwsze kroki Program jest zbiorem modu��w �r�d�owych. Ka�dy modu� sk�ada si� z deklaracji typ�w, zmiennych i funkcji. Napis od znak�w // do ko�ca wiersza jest komentarzem. Jako taki nie ma wp�ywu na przebieg wykonania programu. Dok�adnie jeden modu�, nazywany g��wnym, zawiera deklaracj� funkcji main. Wykonanie programu polega na opracowaniu wszystkich jego globalnych deklaracji, a nast�pnie przyst�pieniu do wykonywania instrukcji zawartych w funkcji main. Zako�czenie wykonywania programu nast�puje po wykonaniu w funkcji g��wnej instrukcji return, albo tu� po powrocie z funkcji exit. Mo�e to nast�pi� jeszcze przed podj�ciem wykonywania funkcji g��wnej. int main(void) // deklaracja funkcji g��wnej { return 0; // instrukcja return } void exit(int); // deklaracja funkcji exit struct Empty { // deklaracja typu Empty Empty(void) { exit(0); // wywo�anie funkcji exit } }; Empty obj; // deklaracja zmiennej Program napisano w taki spos�b, aby jego wykonanie zako�czy�o si� przed podj�ciem wykonywania funkcji g��wnej. Komunikacja z otoczeniem W najprostszym przypadku, program pobiera dane z klawiatury i wyprowadza je na monitor. Operacje wprowadzania danych odbywaj� si� za pomoc� operatora >>, a operacje wyprowadzania danych za pomoc� operatora <<. Klawiatura jest reprezentowana przez zmienn� cin, a monitor przez zmienn� cout. Pos�u�enie si� nimi wymaga u�ycia dyrektywy #include wyszczeg�lniaj�cej nazw� iostream.h. Dan� wprowadzon� z klawiatury ko�czy odst�p, uzyskany przez naci�ni�cie klawisza Space, Tab albo Enter. Analiza danych wej�ciowych nast�puje wierszami, to jest dopiero po naci�ni�ciu klawisza Enter. W szczeg�lno�ci, je�li program oczekuje 3 danych, to ka�d� mo�na poda� w osobnym wierszu, albo wszystkie poda� w jednym wierszu. Przed wprowadzeniem kolejnej danej pomija si� poprzedzaj�ce j� odst�py. Uwaga: Wygodnym sposobem wyprowadzenia odst�pu Enter jest u�ycie symbolu endl. Poniewa� operacja wej�cia-wyj�cia dostarcza w miejscu jej u�ycia jej lewy argument, wi�c zapis pary instrukcji cin >> one; cin >> two; mo�na upro�ci� do cin >> one >> two; W�a�ciwo�� t�, nazywan� ��czeniem operacji, mo�na zastosowa� tak�e do wyprowadzania danych. #include <iostream.h> int main(void) { int one, two; cout << "Enter 2 numbers:" << endl; cin >> one >> two; cout << "Sum = " << one + two << endl; return 0; } Program wyprowadza zach�t� do wprowadzenia 2 liczb, a nast�pnie wyznacza i wyprowadza ich sum�. Wykonywanie operacji Wykonanie programu sprowadza si� do wykonania operacji na danych. W Dodatku A zamieszczono kompletny wykaz operacji, a w Dodatku B om�wiono zasady opracowywania wyra�e�. Bieg�e programowanie w C++ wymaga starannego zapoznania si� z podanymi tam opisami. Operacje przypisania Prosta operacja przypisania ma posta� a = b w kt�rej a i b s� wyra�eniami, ale ponadto a jest l-nazw� zmiennej (por. Dodatek B). Wykonanie operacji polega na przypisaniu zmiennej a warto�ci wyra�enia b. Z�o�ona operacja przypisania ma posta� a @= b w kt�rej @= jest jednym z operator�w wymienionych w Dodatku A (np. +=, -=, *= , /=). Operacj� a�@=�b (np. a�+=�b) wykonuje tak, jak operacj� a = a + b ale wymaga si�, aby opracowanie a i b by�o jednokrotne. Operacja po��czenia Operacja po��czenia ma posta� a , b Jej wykonanie sk�ada si� z opracowania wyra�enia a (wy��cznie dla jego skutk�w ubocznych) oraz z niejawnego zast�pienia ca�ej operacji nazw� zmiennej reprezentowanej przez wyra�enie b. Uwaga: Nie jest operatorem po��czenia przecinek oddzielaj�cy parametry i argumenty funkcji. W szczeg�lno�ci wykonanie instrukcji return a = 10, cout << a, b = 20; jest r�wnowa�ne wykonaniu instrukcji a = 10; cout << a; b = 20; return b; Operacje arytmetyczne Operacje arytmetyczne wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje arytmetyczne. Tabela Operacje arytmetyczne ### + (dodawanie) - (odejmowanie) * (mno�enie) / (dzielenie) % (reszta) ++ (zwi�kszenie o 1) -- (zmniejszenie o 1) += (dodanie) -= (odj�cie) *= (pomno�enie) /= (podzielenie) ### Spos�b wykonania podstawowych dzia�a� arytmetycznych nie wymaga opisu. Nale�y jedynie zauwa�y�, �e rezultat dzielenia ca�kowitego jest ca�kowity, a argumenty wyznaczania reszty musz� by� ca�kowite (np. 11 / 4 ma warto�� 2, a 11 % 4 ma warto�� 3). Operacje przedrostkowe Wykonanie operacji ++num powoduje zwi�kszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana nowa warto�� num. Wykonanie operacji --num powoduje zmniejszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana nowa warto�� num. int fix = 10; cout << ++fix; // 11 cout << fix; // 11 Operacje przyrostkowe Wykonanie operacji num++ powoduje zwi�kszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana pierwotna warto�� num. Wykonanie operacji num-- powoduje zmniejszenie warto�ci zmiennej num o 1 W miejsce wykonania operacji jest dostarczana pierwotn� warto�� num. int fix = 10; cout << fix--; // 10 cout << fix; // 9 Operacje por�wnania Operacje por�wnania wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje por�wnania. Tabela Operacje por�wnania ### == (r�wne) != (nie r�wne), < (mniejsze) > (wi�ksze), <= (mniejsze lub r�wne) >= (wi�ksze lub r�wne) ### Je�li por�wnanie wyra�a orzeczenie prawdziwe, to jego rezultat ma warto�� true (prawda). W przeciwnym razie ma warto�� false (fa�sz). Uwaga: Por�wnanie na r�wno�� wykonuje si� za pomoc� operacji ==, a nie za pomoc� operacji =. Zaniedbanie tego faktu jest �r�d�em trudnych do wykrycia b��d�w semantycznych. #include <iostream.h> int main(void) { int num = 0; while(num == 0) cin >> num; cout << num << endl; return 0; } Program wyprowadza liczb� 0 albo pierwsz� niezerow� liczb� wprowadzon� z klawiatury. Gdyby operator por�wnania zast�piono operatorem przypisania, to zawsze wyprowadza�by liczb� 0. Operacje orzecznikowe Operacje orzecznikowe wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje orzecznikowe. Tabela Operacje orzecznikowe ### ! (zaprzeczenie) && (koniunkcja) || (dysjunkcja) ### Argumenty i rezultaty operacji orzecznikowych s� typu bool i maj� warto�ci true albo false. Rezultat zaprzeczenia ma warto�� true tylko w�wczas, gdy argument ma warto�� false. Rezultat koniunkcji ma warto�� true tylko w�wczas, gdy oba argumenty maj� warto�� true. Rezultat dysjunkcji ma warto�� false tylko w�wczas, gdy oba argumenty maj� warto�� false. Uwaga: Operacja koniunkcji i dysjunkcji jest wykonywana w taki spos�b, �e je�li po opracowaniu pierwszego argumentu jest znana warto�� rezultatu ca�ej operacji (bo dla koniunkcji ma warto�� false, a dla dysjunkcji ma warto�� true), to rezygnuje si� z opracowania drugiego argumentu. #include <iostream.h> int vec[] = { 10, 20, 30, 40, 50 }; int main(void) { int pos; cin >> pos; pos >= 0 && pos < 5 && (cout << vec[pos]); return 0; } Program wyprowadza warto�� tego elementu tablicy, kt�rego indeks wprowadzono z klawiatury. Je�li wprowadzi si� indeks, kt�ry nie ma warto�ci z przedzia�u [0 ; 4], to program nie wyprowadzi nic. Dzi�ki u�yciu operatora &&, nigdy nie dojdzie do opracowania wyra�enia vec[pos] z niedozwolonym indeksem. Operacje konwersji Wykonanie konwersji ma na celu przekszta�cenie zmiennej pewnego typu w zmienn� typu docelowego. Operacja konwersji wyra�enia e do typu Type ma posta� (Type)e Je�li nazw� typu docelowego Type mo�na wyrazi� za pomoc� identyfikatora (np.�int), to operacj� konwersji mo�na zapisa� jako Type(e) W szczeg�lno�ci, je�li w programie wyst�puje instrukcja int num = 4.8; w kt�rej zmienna num jest typu int, a wyra�enie 4.8 jest typu double, to poniewa� danej typu double (zazwyczaj 8-bajtowej) nie mo�na pomie�ci� w zmiennej typu int (zazwyczaj 4-bajtowej), wi�c najpro�ciej by�oby tak� instrukcje uzna� za b��dn�. Poniewa� w C++ przekszta�cenie zmiennej typu double w zmienn� typu int zdefiniowano jako konwersj� standardow� (polega ona na odrzuceniu cz�ci u�amkowej), wi�c rozpatrywana instrukcja zostanie niejawnie zmieniona w poprawn� instrukcj� int num = int(4.8); r�wnowa�n� int num = 4; w kt�rej wyra�enie inicjuj�ce jest ju� typu int. Uwaga: Wa�ne informacje na temat konwersji zamieszczono w Dodatku C. Wykonywanie instrukcji Do napisania dowolnego programu wystarczy zaledwie kilka instrukcji. Najwa�niejszymi z nich s�: instrukcja pusta, grupuj�ca, warunkowa (if), iteracyjna (while) i powrotu (return). Opis pozosta�ych ograniczono do przyk�ad�w. Instrukcja pusta Instrukcja pusta sk�ada si� ze �rednika. ; Jej wykonanie nie ma �adnych skutk�w. Instrukcja grupuj�ca Instrukcja grupuj�ca sk�ada si� z nawias�w klamrowych zawieraj�cych dowoln� sekwencj� instrukcji. Je�li w miejscu, w kt�rym sk�adnia wymaga u�ycia dok�adnie jednej instrukcji, chce si� umie�ci� ich wi�cej, to wystarczy uj�� je w nawiasy klamrowe i powstanie jedna instrukcja. { int a; cin >> a; a++; cout << a; } Instrukcja warunkowa Instrukcja warunkowa ma posta� if(c) s albo if(c) s1 else s2 w kt�rej c jest wyra�eniem orzecznikowym o warto�ci true albo false, a s1 oraz s2 jest pojedyncz� instrukcj� (np. instrukcj� grupuj�c�). Wykonanie instrukcji warunkowej zaczyna si� od opracowania wyra�enia c (np.�a�>�2). Je�li wyra�one przez nie orzeczenie jest prawdziwe, to w pierwszym przypadku jest wykonywana instrukcja s, a w drugim instrukcja s1. W przeciwnym razie, w pierwszym przypadku nie robi si� nic, a w drugim wykonuje instrukcj� s2. if(a > 2) { a++; cout << a; } else { cout << a; a-- } albo r�wnowa�nie if(a > 2) { a++; cout << a; } else { cout << a; a--; } Instrukcja iteracyjna Instrukcja iteracyjna ma posta� while(c) s w kt�rej c jest wyra�eniem orzecznikowym, a s jest pojedyncz� instrukcj�. Wykonanie instrukcji iteracyjnej polega na cyklicznym badaniu orzeczenia wyra�onego przez wyra�enie c i wykonywaniu instrukcji s. Iteracja ko�czy si� w chwili stwierdzenia, �e orzeczenie jest nieprawdziwe. Je�li oka�e si� to ju� na wst�pie, to instrukcja s nie b�dzie wykonana wcale. int i = 3; while(i > 0) { int t = i * i; cout << t << endl; // 9 4 1 i--; } Nale�y zauwa�y�, �e instrukcj� iteracyjn� o postaci d while(c) { s s ... s e; } w kt�rej d jest instrukcj� deklaracyjn�, a e jest wyra�eniem, mo�na przedstawi� w postaci for(d c ; e) { s s ... s } Taka odmiana instrukcji iteracyjnej dobrze nadaje si� do opisania czynno�ci o znanej liczbie powt�rze�. int tab[5] = { 10, 20, 30, 40, 50 }, sum = 0; for(int i = 0; i < 5 ; i++) sum += tab[i]; cout << "Sum = " << sum << endl; Instrukcja zaniechania Instrukcja zaniechania ma posta� break; Wykonanie instrukcji zaniechania powoduje zako�czenie wykonywania najw�szej obejmuj�cej j� instrukcji iteracyjnej albo decyzyjnej. int sum = 0; while(true) { int tmp = 0; cin >> tmp; // wprowad� dan� if(tmp == 0) // zbadaj czy 0 break; // zako�cz iteracj� sum += tmp; // dosumuj } cout << "Sum = " << sum << endl; albo int tmp = 0, sum = 0; while(cin >> tmp, tmp) // wprowad� i zbadaj sum += tmp; // dosumuj cout << "Sum = " << sum << endl; lub for(int tmp = 0, sum = 0; cin >> tmp, tmp ; sum += tmp); cout << "Sum = " << sum << endl; Instrukcja powrotu Instrukcja powrotu ma posta� return e; w kt�rej e jest wyra�eniem. Wykonanie instrukcji powrotu powoduje zako�czenie wykonywania funkcji i dostarczenie rezultatu o warto�ci okre�lonej przez e. int sum(int one, int two) { return one + two; } Je�li typem funkcji jest void, to u�yta w niej instrukcja powrotu nie mo�e zawiera� wyra�enia. U�ycie takiej instrukcji jest zazwyczaj zbyteczne, poniewa� domniemywa si� j� tu� przed klamr� zamykajac� cia�o funkcji. void sum(int one, int two) { cout << one + two << endl; return; // zb�dne } Instrukcja decyzyjna Instrukcja decyzyjna uog�lnia instrukcj� warunkow� i jest przydatna w�wczas, gdy w programie wyst�puj� wi�cej ni� dwie ga��zie decyzyjne. W szczeg�lno�ci instrukcj� warunkow� if(a == 2) b = 3; else if(a == 1) b = 5; else if(a == 4) b = -1; else b = 0; mo�na zapisa� w postaci switch(a) { case 2: // je�li a == 2 b = 3; break; case 1: // je�li a == 1 b = 5; break; case 4: // je�li a == 4 b = -1; break; default: // w pozosta�ych przypadkach b = 0; } Deklarowanie zmiennych i typ�w Ka�dy modu� programu jest kompilowany niezale�nie od pozosta�ych. Analiza sk�adniowa modu�u odbywa si� od-g�ry-do-do�u i od-lewej-do-prawej i polega na rozpoznawaniu jednostek leksykalnych: identyfikator�w (np.�exit), litera��w (np.�0), operator�w (np.�+) i ogranicznik�w (np.�;). Identyfikatory Identyfikatorem jest sp�jna sekwencja liter i cyfr, zaczynaj�ca si� od litery. Identyfikator nie mo�e mie� postaci s�owa kluczowego (np.�return). Za jego liter� uznaje si� r�wnie� znak podkre�lenia (_). Litery ma�e uznaje si� za r�ne od du�ych. Zaleca si�, aby w wielos�owowych nazwach zmiennych i funkcji, wszystkie s�owa, z wyj�tkiem pierwszego, by�y zapisane za pomoc� du�ych liter. np. forSale speedLimit veryLongName Litera�y Litera�ami s� liczby (np.�12 i 2.e-3), znaki (np.�'a') i �a�cuchy (np. "Hello"). Ka�dy litera� jest nazw� zmiennej ustalonej. Jej typ wynika z zapisu litera�u. Uwaga: Je�li �a�cuch ma zawiera� znak \ (uko�nik), to nale�y go zapisa� jako \\ (np. "C:\\Data.txt). np. -2.4 2.e4 .2 // nazwy zmiennych typu double Deklaracje Ka�de u�ycie identyfikatora musi by� poprzedzone jego deklaracj�. Deklaracja kompletnie opisuj�ca zmienn� (okre�laj�ca jej warto�� pocz�tkow�), typ (wyszczeg�lniaj�ca struktur� jego obiekt�w) i funkcj� (podaj�ca jej cia�o) jest nazywana definicj�. W sk�ad deklaracji wchodz� specyfikatory, deklaratory i inicjatory. np. const int tab[3] = { -1, 0, +1 }; Specyfikatorami s� const i int, deklaratorem jest tab[3], a inicjatorem jest = {�-1,�0,�+1�}. Nag��wki Deklaracje typ�w i funkcji s� ujmowane w nag��wki. Ka�dy nag��wek jest zapisany w odr�bnym pliku. W��czenie nag��wka odbywa si� w miejscu wyst�pienia wyszczeg�lniaj�cej go dyrektywy #include. Do najcz�ciej u�ywanych nag��wk�w nale��: iostream.h i iomanip.h, math.h, string.h i stdlib.h. Dwa pierwsze w��czaj� do modu�u deklaracje zmiennych i operator�w wej�cia-wyj�cia (cin, cout, >>, <<), dwa nast�pne w��czaj� deklaracje funkcji matematycznych (sqrt, sin, cos) i �a�cuchowych (strlen, strcpy, strcat, strcmp), a ostatni w��cza m.in. deklaracj� funkcji exit. #include <iostream.h> #include <math.h> int main(void) { double number; // deklaracja zmiennej cin >> number; // wprowadzenie liczby cout << sqrt(number); // wyprowadzenie pierwiastka return 0; // zako�czenie wykonywania } Zmienne Zmienn� jest obszar pami�ci do przechowywania danych okre�lonego typu: skalarnych, tablicowych i strukturowych. Ka�de odwo�anie do zmiennej musi by� poprzedzone deklaracj� jej typu. int fix; // zmienna ca�kowita char chr; // zmienna znakowa double num; // zmienna rzeczywista Zmienna fix jest typu int, zmienna chr jest typu char, zmienna num jest typu double. Rozmiar zmiennej Rozmiar zmiennej w bajtach okre�la si� za pomoc� operatora sizeof. Argumentem operatora sizeof mo�e by� nazwa zmiennej albo nazwa typu. Uwaga: Rozmiar zmiennej zale�y od implementacji. W Visual C++ zmienne typu char s� 1-bajtowe, zmienne typu int s� 2-bajtowe, a zmienne typu double s� 8-bajtowe. int age = 24; cout << sizeof(age); // 4 cout << sizeof(int); // 4 int tab[3]; cout << sizeof(tab); // 12 Zmienne ustalone Zmienna zadeklarowana ze specyfikatorem const jest zmienn� ustalon�. Zmienna ustalona musi by� zainicjowana, ale nadana jej warto�� nie mo�e ulec zmianie. Uwaga: Zmiennymi ustalonymi s� tak�e zmienne reprezentowane przez litera�y. W szczeg�lno�ci liczba 12e2 jest nazw� zmiennej ustalonej o warto�ci 1200. const int size = 100; const double width = -2e-7, height = 2e2; const int tab[2] = { 10, 20 }; Zmienne skalarne Deklaracja zmiennej skalarnej okre�la jej identyfikator oraz wyszczeg�lnia typ danych jakie mo�na przypisywa� zmiennej (np. int, double, char). int number; double speedLimit; char separator; Warto�� pocz�tkow� zmiennej okre�la si� za pomoc� inicjatora. Je�li deklaracja zmiennej zawiera jawny albo domniemany inicjator, to jest jej definicj�. int minValue = 10, maxValue = 90; double width = 2.4, height = 4.5e+2, area; char lastChar = '.'; Sk�adnia inicjatora Inicjatory dziel� si� na wyra�eniowe, klamrowe i nawiasowe. Inicjator zmiennej ustalonej musi mie� posta� wyra�enia sta�ego. W jego sk�ad wchodz� odwo�ania do litera��w i zmiennych ustalonych, ale nie mog� wchodzi� odwo�ania do zmiennych nie-ustalonych. int base = 100; // inicjator wyra�eniowy int min = { base + 20 }; // inicjator klamrowy int max(base + 40); // inicjator nawiasowy const int size = max - min; // b��d Punkt zadeklarowania Identyfikator zmiennej uwa�a si� za zadeklarowany w punkcie tu� przed inicjatorem wyra�eniowym i klamrowym, ale tu� po inicjatorze nawiasowym. Ta subtelna r�nica ma niekiedy wp�yw na poprawno�� i skutek wykonania programu. #include <iostream.h> const int val = 10; // definicja zmiennej globalnej int main(void) { int val(val); // definicja zmiennej lokalnej cout << val; // 10 return 0; } Punkt zadeklarowania zmiennej lokalnej wyst�puje tu� po inicjatorze (val). Gdyby inicjator nawiasowy zast�piono jednym z pozosta�ych inicjator�w, to program sta�by si� b��dny, poniewa� zmienna lokalna by�aby w�wczas inicjowana nie warto�ci� zmiennej globalnej, ale nieokre�lon� jeszcze warto�ci� zmiennej lokalnej. Operacje wej�cia-wyj�cia Zmienne typu int, double i char s� zmiennymi arytmetycznymi, przystosowanymi odpowiednio do przechowywania liczb ca�kowitych, zmiennopozycyjnych i kod�w znak�w. Podczas wykonywania operacji wej�cia, do zmiennych typu int i double wprowadza si� dane liczbowe, a do zmiennych typu char wprowadza si� kody znak�w. A zatem, je�li z klawiatury wprowadzi si� na przyk�ad napis 20e3, to liczba pobranych znak�w i otrzymana warto�� b�dzie zale�e� od typu zmiennej, zgodnie z tabel� Wprowadzanie danych. Tabela Wprowadzanie danych ### Typ zmiennej Pobrano znak�w Wprowadzono warto�� int 2 20 double 4 20000 char 1 49 ### Podczas wykonywania operacji wyj�cia, wyprowadza si� liczby o warto�ci zmiennych typu int i double oraz znaki o kodach okre�lonych przez warto�ci zmiennych typu char. #include <iostream.h> int main(void) { int mant, exp; char sep; cin >> mant >> sep >> exp; int value = mant; while(exp > 0) { value = value * 10; exp--; } cout << mant << sep << exp << " == " << value << endl; return 0; } Je�li wprowadzi si� napis 2e3, to program wyprowadzi ten napis oraz liczb� 2000. Zmienne tablicowe Zmienn� tablicow�, w skr�cie tablic�, jest zestaw s�siaduj�cych ze sob� element�w tablicy. Ka�dy element jest zmienn� takiego samego typu: skalarn�, tablicow�, strukturow�. int tab[20]; Zmienna tab jest tablic� o 20-elementach typu int. Z ka�dym elementem tablicy jest zwi�zany indeks, okre�laj�cy po�o�enie elementu w obr�bie tablicy. Elementy tablicy s� indeksowane od 0. W deklaracji tablicy podaje si� liczb� jej element�w, a nie indeks jej ostatniego elementu. Je�li deklarator nie podaje liczby element�w, ale deklaracja zawiera inicjator, to za liczb� element�w uznaje si� liczb� fraz inicjuj�cych. Uwaga: Liczba fraz inicjuj�cych nie mo�e przekracza� liczby element�w tablicy. Jesli jest od niej mniejsza, to jest niejawnie dope�niana frazami 0. int tab[100] = { 4, 4 }; Zerowy i pierwszy element tablicy tab ma warto�� 4. Wszystkie pozosta�e maj� warto�� 0. Liczba element�w tablicy musi by� wyra�ona za pomoc� wyra�enia sta�ego. Wyra�enie sta�e mo�e zawiera� litera�y i identyfikatory zmiennych ustalonych, ale nie mo�e zawiera� operatora po��czenia. const int Count = 3; double sizes[Count] = { 2.4, 3.8, 5.2 }; int values[] = { 10, 20, 30, 40, 50 }; int Size = 4; double reals[Size]; // b��d Tablica sizes sk�ada si� z 3 zmiennych, z kt�rych ka�da jest typu double. Tablica values sk�ada si� z 5 zmiennych, z kt�rych ka�da jest typu int. Identyfikowanie element�w tablicy Je�li nazw� tablicy jest vec, to nazw� jej elementu o indeksie ind jest vec[ind]. Jest to prawdziwe tylko w�wczas, gdy wyra�enie ind ma warto�� wi�ksz�-lub-r�wn� 0 i jednocze�nie mniejsz� od liczby element�w tablicy. Uwaga: Je�li tablica vec ma n element�w, to zezwala si�, aby wyra�enie ind mia�o warto�� -1 oraz n, ale tylko w�wczas, gdy opracowanie wyra�enia vec[ind] nie ma na celu dokonania zmiany albo dostarczenia warto�ci elementu. #include <iostream.h> int values[5] = { 10, 20, 30, 40, 50 }; int main(void) { int index; cin >> index; if(index >= 0 && index < 5) cout << values[index] << endl; else cout << "Wrong index" << endl; return 0; } Program wyprowadza warto�� elementu o podanym indeksie. Je�li indeks nie mie�ci si� w domkni�tym przedziale [0 ; 4], to program wyprowadza napis Wrong index. Tablice znakowe Tablic� znakow� jest tablica o elementach typu char. Przechowuje si� w niej zazwyczaj ma�e liczby oraz kody znak�w. Poniewa� Visual C++ u�ywa kodu ASCII, w kt�rym kodem cyfry 0 jest 48, wi�c zainicjowanie 4-elementowej tablicy znakowej kodami cyfr 0, 1 i 2 oraz kodem znaku '\0' mo�na wykona� na wiele sposob�w, w tym m.in. char digits[] = { '0', '1', '2', '\0' }; char digits[] = { 48, 49, 50, 0 }; char digits[4] = { '0', '0'+1, '3'-1 }; char digits[4] = "012"; Z klawiatury mo�na wprowadza� tylko sp�jne ci�gi znak�w. Za ostatnim wprowadzonym znakiem umieszcza si� w�wczas specjalny znak o kodzie 0. Je�li chce si� wyprowadzi� ci�g znak�w utworzony w tablicy programowo, to nale�y zako�czy� go znakiem o kodzie 0 (jego rozpoznanie spowoduje zako�czenie wyprowadzania znak�w). #include <iostream.h> char name[100]; int main(void) { cin >> name; name[1] = 0; cout << "Your initial is: " << name << endl; return 0; } Program wprowadza imi�, a nast�pnie wyprowadza jego inicja�. Litera�y �a�cuchowe Litera� �a�cuchowy, na przyk�ad "Hello", ma posta� ci�gu znak�w uj�tego w cudzys�owy. Znaki specjalne s� w tym ci�gu reprezentowane przez nastepuj�ce symbole \\ (uko�nik) \n (nowy wiersz) \t (tabulator), \' (apostrof) \" (cudzys��w) \0 (znak o kodzie 0). Ka�dy litera� �a�cuchowy, jest nazw� tablicy o elementach typu char, zainicjowanych kodami kolejnych znak�w litera�u oraz kodem znaku \0. W szczeg�lno�ci (w kodzie ASCII) litera� "No" jest nazw� 3-elementowej tablicy zainicjowanej liczbami 78, 111 i 0. #include <iostream.h> int main(void) { int i = 0; while("Hello"[i] != 0) { cout << "Hello"[i] << ' '; i++; } cout << endl; return 0; } Program wyprowadza kolejne znaki napisu Hello, po ka�dym znaku dodaj�c spacj�. Zako�czenie wykonywania nast�puje po rozpoznaniu elementu zainicjowanego liczb� 0. Litera�y �a�cuchowe mog� by� u�yte do inicjowania tablic znakowych. Tak zainicjowana tablica musi mie� co najmniej tyle element�w ile ma tablica reprezentowana przez litera�. Je�li jest d�u�sza, to jej nadmiarowe elementy s� inicjowane liczbami 0. char name1[10] = { 'I', 's', 'a', 0 }; char name2[10] = "Isa"; char name3[] = "Isa"; char name4[3] = "Isa"; // b��d Operacje wej�cia-wyj�cia Tablice znakowe mog� by� wykorzystane do wprowadzania z klawiatury sp�jnych ci�g�w znak�w. W takim przypadku argumentem operacji jest zazwyczaj nazwa tablicy, a wykonanie operacji powoduje umieszczenie w tablicy kod�w znak�w �a�cucha oraz kodu o warto�ci 0. Poniewa� mo�e w�wczas doj�� do przepe�nienia tablicy, zaleca si� u�ycie manipulatora setw, zadeklarowanego w nag��wku iomanip.h, ograniczaj�cego liczb� wprowadzonych znak�w. #include <iostream.h> #include <iomanip.h> char name[20]; int main(void) { cin >> setw(20) >> name; name[1] = 0; cout << "Your initial is: " << name << endl; return 0; } Program wprowadza imi�, a nast�pnie wyprowadza jego inicja�. Aby zabezpieczy� si� przed wpisaniem do tablicy name wi�cej ni� 20 znak�w, u�yto manipulatora setw(20) zadeklarowanego w nag��wku iomanip.h. Zmienne strukturowe Zmienn� strukturow�, w skr�cie struktur�, jest zestaw s�siaduj�cych ze sob� element�w struktury. Ka�dy element struktury mo�e by� zmienn� innego typu: skalarn�, tablicow�, strukturow�. Przed zadeklarowaniem zmiennej strukturowej nale�y zdefiniowa� jej typ. Deklaracja typu strukturowego sk�ada si� z deklaracji p�l struktury. Deklaracja pola struktury ma posta� deklaracji zmiennej. struct Child { char name[20]; int age; }; Child isa = { "Isabel", 15 }; Struktura isa sk�ada si� z 2 zmiennych, opisanych przez pola name i age. Warto�ci pocz�tkowe element�w struktury okre�lono za pomoc� inicjatora klamrowego. U�ycie innych inicjator�w jest zabronione. Identyfikowanie element�w Je�li nazw� struktury jest str, a w opisie jej typu wyst�puje pole fld, to nazw� zmiennej odpowiadaj�cej temu polu jest str.fld. #include <iostream.h> #include <iomanip.h> struct Child { char name[20]; int age; }; Child child; int main(void) { cin >> setw(20) >> child.name >> child.age; cout << child.name << " is " << child.age << " now" << endl; return 0; } Zmienna child sk�ada si� z tablicy o elementach typu char i zmiennej skalarnej typu int. Program wprowadza imi� i wiek dziecka, a nast�pnie wyprowadza je. Kopiowanie struktur W odr�nieniu od tablic, kt�re mo�na kopiowa� tylko element-po-elemencie, kopiowanie struktur mo�e dotyczy� pe�nego zestawu jej element�w i to nawet w�wczas, gdy struktura zawiera tablice. #include <iostream.h> struct Child { char name[20]; int age; }; Child girl; int main(void) { Child isa = { "Isabel", 15 }; girl = isa; cout << girl.name << " is " << girl.age << endl; return 0; } Program wyprowadza te same dane, kt�rymi zainicjowano struktur� isa. Unia element�w Struktura, kt�rej elementy s� rozmieszczone w pami�ci nie jeden-za-drugim, ale zawsze od tego samego miejsca, jest nazywana uni�. W celu zadeklarowania unii nale�y zamiast s�owa kluczowego struct u�y� s�owa union. struct Number { bool isFixed; union { int fixed; double real; }; }; Number num = { true, 12 }; if(num.isFixed) cout << num.fixed << endl; // 12 else cout << num.real << endl; cout << num.real << endl; // b��d W ka�dej chwili struktura num sk�ada si� ze zmiennych typu bool i int, albo ze zmiennych typu bool i double. B��d polega na tym, �e w chwili gdy zmienna num sk�ada si� ze zmiennych typu bool i int, nast�puje odwo�anie do zmiennej typu double. Przetwarzanie plik�w Przetwarzanie plik�w odbywa si� za po�rednictwem zmiennych strumieniowych klas ifstream i ofstream, zadeklarowanych w nag��wku fstream.h. Po utworzeniu zmiennej strumieniowej nale�y otworzy� skojarzony z ni� plik, a nast�pnie upewni� si�, �e otwarcie by�o pomy�lne. Po pomy�lnym otwarciu pliku, pochodz�cy z niego strumie� danych mo�na przetwarza� w taki sam spos�b, jak strumie� danych zwi�zany z klawiatur� albo z monitorem. Stan strumienia Pocz�tkowo strumie� znajduje si� w stanie dobrym, ale na skutek b��du operacji wej�cia-wyj�cia albo pr�by wprowadzenia nie istniej�cej danej, mo�e znale�� si� w stanie nie-dobrym (fail). W stanie nie-dobrym wszystkie operacje na strumieniu s� ignorowane. Je�li dane przygotowano w�a�ciwie, a jako�� pami�ci zewn�trznej jest zadowalaj�ca, to stan nie-dobry oznacza, �e napotkano koniec strumienia. Szczeg�lnym przypadkiem stanu nie-dobrego jest stan z�y (bad). Powstaje on w przypadku rozpoznania danych o z�ym formacie. Niestety, na skutek niefortunnych domniema�, wprowadzenie takiej "danej" jak 3e, zamiast 3e0 (w kontek�cie 3ex) nie zmienia stanu strumienia na z�y. Uwaga: Do sprawdzenia czy stan strumienia jest z�y, s�u�y funkcja bad, a do sprawdzenia, czy strumie� znajduje si� w pozycji za ko�cem pliku, s�u�y funkcja eof. Funkcji tych u�ywa si� bardzo rzadko. Zmienna plikowa Je�li w miejscu wyst�pienia operacji wej�cia-wyj�cia odbywa si� takie badanie zmiennej plikowej, jakby dotyczy�o wyra�enia o warto�ci orzecznikowej, na przyk�ad while(cin >> num) ... albo if(cin) ... to w stanie dobrym jest dostarczana warto�� true, a w stanie nie-dobrym warto�� false. Wprowadzanie danych Zmienna strumieniowa u�yta do wprowadzania danych z pliku jest typu ifstream. Otwarcie pliku odbywa si� za pomoc� funkcji open, kt�rej pierwszym argumentem jest nazwa, a drugim tryb otwarcia pliku: ios::in. Je�li otwierany plik nie istnieje, to zostanie utworzony jako pusty. Aby tego unikn��, plik nale�y otworzy� w trybie ios::in | ios::nocreate. Do zbadania, czy otwarcie pliku si� powiod�o, s�u�y funkcja is_open. Jej rezultat ma warto�� nie-zero tylko w�wczas, gdy otwarcie by�o pomy�lne. #include <iostream.h> #include <fstream.h> #include <assert.h> int sum = 0; int main(void) { ifstream inp; // zmienna plikowa inp.open("Data.txt", ios::in | ios::nocreate); if(!inp.is_open()) { cout << "File does not exist" << endl; return -1; } int val; while(inp >> val) // wprowad� i sprawd� stan sum += val; // dosumuj assert(!inp.bad()); // raczej zb�dne cout << "Sum = " << sum << endl; return 0; } Wykonanie programu powoduje wyprowadzenie sumy liczb ca�kowitych zawartych w pliku Data.txt. Wywo�anie funkcji assert ma na celu upewnienie si�, �e strumie� nie znajduje si� w z�ym stanie. Gdyby tak by�o, to wykonanie programu zosta�oby zaniechane. Wyprowadzanie danych Zmienna strumieniowa u�yta do wyprowadzania danych do pliku jest typu ofstream. Otwarcie pliku odbywa si� za pomoc� funkcji open, kt�rej pierwszym argumentem jest nazwa, a drugim tryb otwarcia pliku: ios::out. Je�li otwierany plik nie istnieje, to zostanie utworzony i otworzony jako pusty. Je�li ju� istnieje, to zostanie otworzony jako pusty. Do zbadania, czy otwarcie pliku si� powiod�o, s�u�y funkcja is_open. Jej rezultat ma warto�� nie-zero tylko w�wczas, gdy otwarcie by�o pomy�lne. #include <iostream.h> #include <fstream.h> int main(void) { ifstream inp; inp.open("Data.txt", ios::in | ios::nocreate); if(!inp.is_open()) { cout << "Source does not exist" << endl; return -1; } ofstream out; out.open("Data2.txt", ios::out); if(!out.is_open()) { cout << "Target not opened" << endl; return -1; } int val; while(inp >> val) out << val << endl; cout << "Done!" << endl; return 0; } Program kopiuje liczby ca�kowite z pliku Data.txt do pliku Data2.txt. Ka�d� kopiowan� liczb� umieszcza w nowym wierszu. U�ycie klawiatury Je�li dane wprowadza si� z klawiatury, to koniec strumienia okre�la si� za pomoc� znaku ko�ca: Ctrl-Z (na polskiej klawiaturze Ctrl-Y). W Visual C++ nast�pi w�wczas pomini�cie pierwszego znaku wyprowadzonego na konsol�. Uwaga: Zaleca si�, aby znak ko�ca zosta� wprowadzony na pocz�tku nowego wiersza (po Enter). #include <iostream.h> int main(void) { int count = 0; double tmp; while(cin >> tmp) count++; cout << endl; // na po�arcie cout << "Count = " << count << endl; return 0; } Program zlicza dane liczbowe wprowadzone z klawiatury. �rodowisko Visual C++ Program �r�d�owy sk�ada si� z modu��w �r�d�owych. Ka�dy modu� jest umieszczony w odr�bnym pliku z rozszerzeniem .cpp. Dodatkowo, w sk�ad programu mog� wchodzi� modu�y skompilowane (*.obj) i biblioteczne (*.lib). W celu przekszta�cenia zestawu modu��w w program wykonalny, nale�y utworzy� projekt, umie�ci� go w przestrzeni roboczej, w��czy� do projektu nazwy plik�w z rozszerzeniami .cpp, .obj i .lib, a nast�pnie zbudowa� program. Zostanie on umieszczony w pliku z rozszerzeniem .exe. Katalog Zaleca si�, aby pliki programu znajdowa�y si� we w�asnym katalogu. Je�li dysponuje si� wolnym miejscem na przyk�ad w katalogu g��wnym dysku D:, to nale�y wywo�a� Eksplorator Windows, klikn�� na nazwie katalogu g��wnego i wyda� polecenie Plik / Nowy obiekt / Folder, a nast�pnie okre�li� nazw� swojego katalogu, na przyk�ad jbVisual. Przestrze� W celu utworzenia przestrzeni roboczej nale�y wyda� polecenie File / New, a nast�pnie (w zak�adce Workspaces) poda� nazw� przestrzeni, np. Workspace: jbSpace oraz okre�li� jej po�o�enie, np. Location: D:\jbVisual\jbSpace, po czym nacisn�� przycisk OK. Je�li przestrze� ju� istnieje, to aby j� otworzy�, nale�y wyda� polecenie File / Open Workspace, wej�� do katalogu przestrzeni (np. jbSpace), a nast�pnie dwu-klikn�� na nazwie jbSpace.dsw. Projekt W celu utworzenia projektu nale�y wyda� polecenie File / New, a w zak�adce Projects poda� typ projektu: Win 32 Console Application i jego nazw�, np. Project name: jbTests. Po upewnieniu si�, �e projekt zostanie w��czony do bie��cej przestrzeni (Add to current workspace) o czym za�wiadczy Location:�D:\jbVisual\jbSpace\jbTests, nale�y nacisn�� przycisk OK. Pliki W celu utworzenia plik�w projektu nale�y wyda� polecenie File / New, a nast�pnie (w zak�adce Files), okre�li� rodzaj pliku C/C++ Source File dla pliku z rozszerzeniem .cpp C++ Header File dla pliku z rozszerzeniem .h Text File dla pliku z rozszerzeniem .txt nie zapominaj�c o podaniu jego nazwy (bez rozszerzenia), np. File name: Sum. Po wykonaniu tych czynno�ci, w katalogu D:\jbVisual\jbSpace\jbTests powstanie plik Sum.cpp, a jego (pocz�tkowo pusta) zawarto�� ujawni si� odr�bnym oknie edycyjnym. Je�li program wymaga utworzenia plik�w z danymi, to zaleca si� je umie�ci� w tym samym katalogu co pliki �r�d�owe. Dla wygody mo�na je do��czy� do plik�w projektu. Budowanie projektu W celu zbudowania projektu, to jest skompilowania jego wszystkich plik�w *.cpp, oraz ewentualnie jego plik�w *.obj i *.lib, nale�y klikn�� ikon� Build. Spowoduje to niezale�ne kompilacje wszystkich modu��w �r�d�owych oraz po��czenie ich w program wykonalny. Przebieg budowania projektu jest diagnozowany w oknie Output. Je�li okno nie jest widoczne, to mo�na je wy�wietli� wydaj�c polecenie View / Output. B��dy modu�u wyszczeg�lnia si� w oknie Output. Po rozpoznaniu ka�dego z nich podaje si� kr�tki opis przyczyny b��du i numer wiersza programu. Dwu-klikni�cie w obr�bie opisu b��du powoduje przeniesienie kursora w pobli�e miejsca, w kt�rym wykryto b��d. W rzadkich przypadkach, gdy poprawno�� diagnozy budzi w�tpliwo�ci, zaleca si� zast�pienie polecenia Build poleceniem Build / Rebuild All. Wykonanie programu Program wykonalny, pod nazw� jbTests.exe jest umieszczany w podkatalogu jbTests\Debug. Je�li wykonuje si� bezb��dnie i jest nale�ycie wytestowany, to mo�e zosta� zoptymalizowany. W celu zoptymalizowania programu nale�y wyda� polecenie Build / Set Active Configuration, a nast�pnie zamiast konfiguracji Win 32 Debug, wybra� konfiguracj� Win 32 Release. Po ponownym zbudowaniu projektu, w katalogu jbTests\Release, powstanie program znacznie kr�tszy, ale ju� bez informacji uruchomieniowych. Zarz�dzanie projektami Przestrze� robocza mo�e zawiera� wi�cej ni� jeden projekt, a projekt mo�e sk�ada� si� z wi�cej ni� jednego pliku. Je�li przestrze� zawiera wi�cej ni� jeden projekt, to tylko jeden z nich mo�e by� aktywny, to jest taki, kt�rego dotycz� polecenia Build. Uaktywnienie projektu odbywa si� przez p-klikni�cie jego nazwy i wydanie polecenia Set Active Project. W celu umieszczenia w przestrzeni dodatkowego projektu nale�y p-klikn�� nazw� przestrzeni, wyda� polecenie Add New Project to Workspace, a dalej post�powa� tak, jak podczas tworzenia pierwszego projektu. W celu w��czenia do projektu dodatkowego pliku nale�y p-klikn�� nazw� projektu, a nast�pnie wyda� polecenie Add Files to Project i wybra� skopiowany plik. Je�li w��czany do projektu plik �r�d�owy ju� istnieje, to nale�y skopiowa� go do katalogu projektowego (pos�uguj�c si� np. Eksploratorem Windows), a nast�pnie post�pi� tak, jak podczas dodawania pliku do projektu. Dopasowanie oblicza Oblicze �rodowiska uruchomieniowego sk�ada si� z menu oraz z pask�w, kt�re mo�na konfigurowa�. Odbywa si� to za pomoc� polecenia Tools / Customize umo�liwiaj�cego zarz�dzanie wy�wietlaniem pask�w edycyjnych, uruchomieniowych i innych. Uruchamianie programu Systematyczne wyszukiwanie b��d�w w programie odbywa si� za pomoc� uruchamiacza. W celu wy�wietlenia paska zawieraj�cego jego narz�dzia nale�y wyda� polecenie Tools / Customize / Toolbars, a nast�pnie odhaczy� nastaw� Debug. Wykonanie programu nadzorowanego przez uruchamiacz zaczyna si� w konfiguracji Win32 Debug po wydaniu polecenia Build / Start Debug / Step into (F10). Program zatrzyma si� tu� przed przyst�pieniem do wykonania pierwszej funkcji (zazwyczaj funkcji main). Pocz�wszy od tego momentu mo�na Okre�la� argumenty funkcji g��wnej Project / Settings // Debug, Program arguments Zastawia� / usuwa� pu�apki ikona Hand (F9) Usuwa� pu�apki Edit / Breakpoints / Remove All (Alt-F9) Wykonywa� program krokowo ikona Go (po zastawieniu pu�apki) ikona Step over (F10) ikona Step into (F11) ikona Step out (Shift-F11) Obserwowa� zmienne ikona Quick Watch (Shift-F9) Kompilacja warunkowa Podczas uruchamiania programu przydaje si� ignorowanie jego wybranych fragment�w. Odbywa si� to za pomoc� dyrektyw kompilacji warunkowej: #if, #else, #endif. Zinterpretowanie dyrektywy #if c kod-�r�d�owy #else kod-alternatywny #endif zaczyna si� od wyznaczenia warto�ci wyra�enia c (najcz�ciej liczby 1 albo 0). Je�li wyra�enie ma warto�� r�n� od 0, to ca�� dyrektyw� zast�puje si� napisem kod-�r�d�owy. W przeciwnym razie zast�puje si� j� napisem kod-alternatywny. Uwaga: Je�li napis kod-�r�d�owy jest pusty, to dyrektyw� mo�na zapisa� bez frazy #else. #include <iostream.h> int main(void) { int one, two; cin >> one >> two; #if 1 cout << "Sum = "; #endif cout << one + two << endl; return 0; } Program wyprowadza sum� pary danych wej�ciowych poprzedzaj�c j� napisem Sum =. Je�li w dyrektywie #if zmieni si� 1, na 0, to powstanie program, kt�ry takiego napisu nie wyprowadzi. Wska�niki i odno�niki Wska�niki i odno�niki s� zmiennymi, kt�re s�u�� do identyfikowania innych zmiennych. Wska�nik mo�e identyfikowa� wiele zmiennych pokrewnego mu typu, natomiast odno�nik mo�e identyfikowa� tylko jedn� zmienn�. Wska�nikom przypisuje si� wskazania, a odno�nikom odniesienia. Mimo i� w typowych implementacjach zar�wno wskazania jak i odniesienia s� reprezentowane przez adresy, pos�ugiwanie si� poj�ciem adres jest ca�kowicie zbyteczne i dowodzi my�lenia o C++ nie w kategoriach j�zyka wysokiego poziomu, ale w kategoriach implementacji. Dlatego o adresach nie b�dzie ju� mowy. Zmienne wska�nikowe Wska�nikiem jest zmienna, kt�rej mo�na przypisywa� wskazania. Deklaracj� wska�nika mo�na pozna� po tym, �e jej identyfikator jest poprzedzony symbolem *�(gwiazdka). Je�li w pewnym miejscu programu jest wymagane u�ycie wskazania zmiennej, to otrzymuje si� je poprzedzaj�c nazw� zmiennej operatorem wskazywania & (ampersand). Po przypisaniu wska�nikowi ptr wskazania zmiennej, napis *ptr staje si� chwilow� nazw� tej zmiennej. Po przypisaniu wska�nikowi wskazania pustego (reprezentowanego przez liczb� 0), u�ycie nazwy *ptr albo nazwy jej r�wnowa�nej (np. ptr[0]) jest zabronione. int fix1 = 10, fix2 = 20; int *ptr = &fix1; cout << *ptr; // 10 *ptr = 11; cout << *ptr << fix; // 11 11 ptr = &fix2; cout << *ptr; // 20 *ptr = 22; cout << *ptr << fix; // 22 22 ptr = 0; cout << *ptr; // b��d Wska�nik ptr jest przystosowany do wskazywania zmiennych typu int. Przypisano mu kolejno: wskazanie zmiennej fix1, wskazanie zmiennej fix2 i wskazanie puste. Po przypisaniu wska�nikowi ptr wskazania zmiennej fix1, napis *ptr jest chwilow� nazw� zmiennej fix1, a po przypisaniu mu wskazania zmiennej fix2, jest chwilow� nazw� zmiennej fix2. Po przypisaniu wska�nikowi ptr wskazania pustego, a� do chwili przypisania mu wskazania zmiennej, u�ycie nazwy *ptr jest zabronione. Dla dociekliwych Typ wyra�enia inicjuj�cego wska�nik musi by� zgodny z typem wska�nika. Przyjmuje si� z definicji, �e zgodne ze wska�nikiem typu Type jest ka�de wyra�enie typu Type oraz ka�de wyra�enie, kt�re mo�e by� poddane niejawnej konwersji do typu Type (por.�Dodatek C). char *ptr1 = "0\0\0\0" // niejawna konwersja int *ptr2 = "0\0\0\0"; // b��d int *ptr = (int *)"0\0\0\0"; // jawna konwersja cout << *ptr; // 48 (kod cyfry 0) Skutek u�ytej tu jawnej konwersji zale�y od implementacji. W Visual C++ powoduje to potraktowanie obszaru pami�ci zaj�tego przez pierwsze 4 bajty litera�u jako zmiennej ca�kowitej. Wska�niki i tablice Zwi�zki mi�dzy wska�nikami i tablicami s� bardzo bliskie. Ka�da nazwa tablicy jest niejawnie przekszta�cana na wska�nik jej zerowego elementu, a ka�da nazwa wska�nika mo�e by� indeksowana tak, jak nazwa tablicy. Je�li wska�nik ptr wskazuje pewien element tablicy, to zar�wno *ptr jak i ptr[0] jest nazw� tego elementu. Elementy po�o�one z lewej strony elementu wskazywanego maj� nazwy ptr[-1], ptr[-2], itd., a elementy po�o�one z prawej maj� nazwy ptr[1], ptr[2], itd. Je�li i jest wyra�eniem ca�kowitym, to wyra�enie ptr+i jest wska�nikiem elementu odleg�ego o i element�w od wskazywanego (dla i ujemnego - w lewo, a dla i dodatniego - w prawo). Je�li wska�niki ptr1 i ptr2 wskazuj� odpowiednio elementy o indeksach i oraz j tej samej n-elementowej tablicy (a tak�e gdy wskazuj� nie istniej�ce "elementy" o indeksach -1 i n), to wyra�enie ptr1-ptr2 ma warto�� i-j. int vec[3] = { 10, 20, 30 }; int *ptr = vec + 2; cout << ptr++[-1]; // 20 cout << *(vec + 2); // 30 cout << vec - ptr; // -3 Nazwa vec zostaje niejawnie przekszta�cona na wskazanie elementu vec[0], to jest na &vec[0]. Wyra�enie vec + 2 wskazuje element o warto�ci 30. Wyra�enie ptr++[-1] jest nazw� elementu o warto�ci 20. W wyra�eniu vec�-�ptr pierwszy argument wskazuje element zerowy, a drugi argument wskazuje nie istniej�cy element vec[3]. Wska�niki i struktury Je�li wska�nik ptr wskazuje struktur� o polu f, to nazw� zmiennej odpowiadaj�cej temu polu jest (*ptr).f, albo kr�cej ptr->f. #include <iostream.h> struct Child { char name[20]; int age; Child *pNext; }; Child bob = { "Robert", 20 }, tom = { "Thomas", 30, 0 }; Child *pBob = &bob, *pTom = &tom; int main(void) { cout << pBob->name << endl; // Robert pBob->pNext = pTom; cout << pBob->pNext->age << endl; // 30 return 0; } Zmienna pBob jest wska�nikiem przystosowanym do wskazywania zmiennych typu Child. Przypisano jej wskazanie struktury bob. Napis pBob->name jest chwilow� nazw� tego elementu struktury bob, kt�ry jest opisany przez pole name. Napis pBob->pNext jest nazw� wska�nika opisanego przez pole pNext. Poniewa� wskazuje on struktur� tom, wi�c pBob->pNext->age jest nazw� tego elementu struktury tom, kt�ry jest opisany przez pole age. Tablice wska�nik�w Tablic� wska�nik�w jest tablica, kt�rej elementami s� wska�niki. W deklaracji tablicy wska�nik�w jej identyfikator jest poprzedzony znakiem * (gwiazdka). W deklaracji wska�nika, kt�ry s�u�y do wskazywania-wska�nik�w, jego identyfikator jest poprzedzony dwiema znakami * (gwiazdka). #include <iostream.h> const int Count = 3; struct Child { char name[20]; int age; }; Child john = { "John Smith", 30 }, tom = { "Thomas Mill", 10 }, bill = { "Robert Dole", 20 }; Child *pBoys[Count] = { &john, &tom, &bill }; int main(void) { for(int i = 0; i < Count-1 ; i++) { int minAge = pBoys[i]->age; for(int j = i+1; j < Count ; j++) { if(pBoys[j]->age < minAge) { minAge = pBoys[j]->age; Child *ptr = pBoys[i]; pBoys[i] = pBoys[j]; pBoys[j] = ptr; } } } Child **ptr = pBoys; for(i = 0; i < Count ; i++) cout << (*ptr++)->name << endl; return 0; } Program wyprowadza nazwiska ch�opc�w, w kolejno�ci ich rosn�cego wieku. Sortowanie dotyczy tylko element�w tablicy wska�nik�w i nie powoduje kopiowania struktur typu Child. Wska�niki a ustalenia Podobnie jak zwyk�a zmienna, tak i wska�nik mo�e by� ustalony albo nie-ustalony. Ponadto wska�nik mo�e by� przystosowany do wskazywania zmiennych ustalonych albo nie-ustalonych. Daje to cztery mo�liwo�ci. Uwaga:�Zabrania si�, aby wska�nikowi przystosowanemu do wskazywania zmiennych nie-ustalonych przypisano wskazanie zmiennej ustalonej. #include <iostream.h> int main(void) { int mod = 10; const int fix = 20; int *ptr1 = &mod; int *const ptr2 = &mod; const int *ptr3 = &mod; const int *const ptr4 = &fix; cout << *ptr1 << endl; // 10 cout << *ptr2 << endl; // 10 cout << *ptr3 << endl; // 10 cout << *ptr4 << endl; // 20 ptr1 = &fix; // b��d ++ptr2; // b��d ++*ptr3; // b��d ptr1 = &(int &)fix; // dozwolone cout << *ptr1 << endl; // 20 return 0; } Wska�nik ptr1 s�u�y do wskazywania zmiennych nie-ustalonych. Wska�nik ptr2 jest wska�nikiem ustalonym, kt�ry s�u�y do wskazywania zmiennych nie-ustalonych. Wska�nik ptr3 jest wska�nikiem nie-ustalonym, kt�ry s�u�y do wskazywania zmiennych ustalonych. Wska�nik ptr4 jest wska�nikiem ustalonym, kt�ry s�u�y do wskazywania zmiennych ustalonych. Zmienne odno�nikowe Odno�nikiem jest zmienna, kt�r� mo�na zainicjowa� odniesieniem. Deklaracj� odno�nika mo�na pozna� po tym, �e jej identyfikator jest poprzedzony symbolem &�(ampersand). Uwaga: Je�li w pewnym miejscu programu wyst�puje nazwa zmiennej, a program by�by poprawny tylko w�wczas, gdyby wyst�powa�a tam nazwa odno�nika do zmiennej, to nazw� zmiennej niejawnie przekszta�ca si� w odno�nik. int fix = 10; int &ref = fix; // int &ref = (int &)fix; Poniewa� odno�nik ref jest typu int &, wi�c nie mo�e by� zainicjowany warto�ci� zmiennej fix, kt�ra jest typu int. Dlatego, za pomoc� niejawnej konwersji (int &)fix, nazw� zmiennej fix niejawnie przekszta�ca si� w odno�nik. Po zainicjowaniu odno�nika ref odniesieniem do zmiennej, napis ref staje si� trwa�� nazw� tej zmiennej. A wi�c odno�nik mo�na zainicjowa�, ale nie mo�na mu przypisa� odniesienia. #include <iostream.h> int main(void) { int fix = 10; int &ref = fix; ref = 10; cout << fix << ref << endl; // 10 10 return 0; } Po zainicjowaniu odno�nika, napis ref staje si� trwa�� nazw� zmiennej fix. Dlatego przypisanie ref = 10 zmienia warto�� zmiennej fix, ale nie zmienia warto�ci odno�nika ref. Dla dociekliwych Typ wyra�enia inicjuj�cego odno�nik musi by� zgodny z typem odno�nika. Przyjmuje si� z definicji, �e typ "odno�nik do zmiennej typu Type" (np.�int &) jest zgodny z typem Type (np.�int). Je�li wyra�enie inicjuj�ce jest innego typu, to mo�e by� poddane niejawnej konwersji do typu zgodnego, ale tylko w�wczas, gdy typ odno�nika jest ustalony (const). W takim wypadku odno�nik zostanie zainicjowany odniesieniem do zmiennej pomocniczej typu z nim zgodnego, zainicjowanej warto�ci� wyra�enia po konwersji. int &ref1 = 2.4; // b��d const int &ref = 2.4; Identyfikator ref2 jest trwa�� nazw� zmiennej pomocniczej o warto�ci (int)2.4. Wska�niki i odno�niki Podejmuj�c decyzj� o u�yciu wska�nika, czy odno�nika, nale�y kierowa� si� wytyczn�, �e wsz�dzie tam gdzie jest to mo�liwe, nale�y stosowa� odno�niki, gdy� zwi�ksza to czytelno�� programu. W rzadkich przypadkach stosuje si� odno�niki do wska�nik�w. Jest to niezb�dne w�wczas, gdy poprzez odno�nik nale�y zmodyfikowa� wska�nik. #include <iostream.h> int main(void) { int vec[3] = { 10, 20, 30 }; int *ptr = vec; int *&ref = ptr; ++ref; cout << *ptr << endl; // 20 return 0; } Po zadeklarowaniu odno�nika, napis ref jest trwa�� nazw� wska�nika ptr. Dlatego po wykonaniu operacji ++ref wsk