48 Lekcji programowania w C i C++.pdf

(1505 KB) Pobierz
LEKCJA 1
LEKCJA 1. Co o C i C++ każdy wiedzieć powinien.
________________________________________________________________
W trakcie tej lekcji dowiesz się, dlaczego pora na C++.
________________________________________________________________
Język C++ jest uniwersalnym, nowoczesnym językiem programowania.
Stosowane przez USA i inne kraje wobec Polski wieloletnie
embargo COCOM'u (przeszkody w dostępie do nowoczesnej
technologii) sprawiły m. in., że popularność OS2, UNIXa i C/C++
jest w Polsce do dziś nieproporcjonalnie mała, a Basica, Pascala
i DOSa nieproporcjonalnie duża. W USA C++ już od kilku lat
stanowi podstawowe narzędzie programistów.
Już słyszę oburzenie (A co mnie obchodzi historia
"komputerologii" i koligacyjki!). Otóż obchodzi, bo wynikają z
niej pewne "grzechy pierworodne" języka C/C++, a dla Ciebie,
szanowny Czytelniku - pewne wnioski praktyczne.
Grzech Pierwszy:
* Kompilator języka C/C++ jest standardowym wyposażeniem systemu
operacyjnego UNIX.
Skutki praktyczne:
Każdy PC jest w momencie zakupu (co często wchodzi w cenę zakupu
komputera) wyposażany w system operacyjny DOS - np. DR DOS, PC
DOS, PTS DOS lub MS DOS. Standardowo w zestaw systemu MS DOS
wchodzi interpreter języka BASIC (w MS-DOS - QBasic.EXE). Możesz
więc być pewien, że jeśli jest DOS, to musi być i BASIC.
Podobnie rzecz ma się z C/C++. Jeśli jest na komputerze system
UNIX (za wyjątkiem najuboższych wersji systemu XENIX), masz tam
do dyspozycji kompilator C/C++, za to BASICA ani Pascala prawie
na pewno tam nie ma. Podobnie coraz popularniejszy OS/2
wyposażony jest w kompilator (całkiem niezły) C++ i dodatkowo
jeszcze w pewne gotowe-firmowe biblioteki.
Grzech drugi:
* Język C/C++ powstał jeszcze zanim wymyślono PC, DOS, GUI
(Graficzny Interfejs Użytkownika), Windows i inne tym podobne.
Dwa najważniejsze skutki praktyczne:
I. W założeniach twórców język C++ miał być szybki (i jest) i
zajmować mało miejsca w pamięci (bo ówczesne komputery miały jej
bardzo mało!). Zawiera więc różne, niezrozumiałe dla nas z
dzisiejszego punktu widzenia skróty. Np. to co w Pascalu czy
Basicu wygląda zrozumiale:
i:=i+1; (Pascal)
10 I=I+1 lub inaczej NEXT I (Basic)
to w języku C++ wygląda dziwacznie:
i++; albo jeszcze dziwniej ++i;
1
Tym niemniej zwróć uwagę, że w Pascalu zajmuje to 7 znaków, w
Basicu - 8 znaków (spacja to też znak!), a w C++ tylko 4.
Inny przykład:
X=X+5 (Basic, 5 znaków),
X:=X+5 (Pascal, 6 znaków),
X+=5 (C++, tylko 4 znaki).
Z takiej właśnie filozofii wynika i sama nazwa - najkrótsza z
możliwych. Jeśli bowiem i++ miało znaczyć mniej więcej tyle samo
co NEXT I (następne I) to C++ znaczy mniej więcej tyle samo co
"NASTĘPNA WERSJA C".
II. Nie ma nic za darmo. W języku C/C++, podobnie jak w
samochodzie wyścigowym formuły I, za szybkość i skuteczność
płaci się komfortem. Konstrukcje stosowane w języku C/C++ są
maksymalnie dostosowane do "wygody" komputera. Pozwala to na
uzyskiwanie ˙niezwykle szybkich "maszynowo-zorientowanych" kodów
wykonywalnych programu, ale od programisty wymaga
przyzwyczajenia się do "komputerowo-zorientowanego sposobu
myślenia".
Grzech Trzeci (i chyba najcięższy):
* Jest najlepszy. Ostrożniej - jest najchętniej stosowanym
narzędziem profesjonalnych programistów.
Ma oczywiście konkurentów. Visual Basic (do małych aplikacji
okienkowych), Turbo Pascal (do nauki podstaw - elementów
programowania sekwencyjnego, proceduralno-strukturalnego),
QuickBasic (programowanie strukturalne w środowisku DOS),
Fortran 90, ADA, SmallTalk, itp, itd.
Sam wielki Peter Norton przyznaje, że początkowe wersje swojego
słynnego pakietu Norton Utilities pisał w Pascalu, ale dopiero
przesiadka na C/C++ pozwoliła mu doprowadzić NU do dzisiejszej
doskonałości. Jakie są programy Petera Nortona - każdy widzi...
Zapewne masz na swoim komputerze kilka różnych aplikacji (np.
TAG, QR-Tekst, Word, itp.) - jeśli zajrzysz do nich do środka
(View), możesz sam przekonać się, że większość z nich została
napisana właśnie w C++ (Kompilatory C++ pozostawiają w kodzie
wynikowym .EXE swoją wizytówkę zwykle czytelną przy pomocy
przeglądarki; przekonasz się o tym także zaglądając przez [View]
do własnych programów); stosowane narzędzia możesz rozpoznać
także po obecności dynamicznych bibliotek - np. BWCC.DLL -
biblioteka elementów sterujących - klawiszy, itp - Borland
Custom Controls for Windows).
Skutki praktyczne:
Nauczywszy się języka C/C++ możesz nie bać się ani systemu
UNIX/XENIX a ich środowiska okienkowego - X Windows, ani OS2,
ani Windows 95 (dotychczasowe testy starych 16-bitowych
aplikacji wykazały b. wysoki stopień kompatibilności), ani
stacji roboczych, ani dużych komputerów klasy mainframe. Język
C/C++ dosłużył się bowiem ogromnej ilości tzw. implementacji
czyli swoich odmian, przeznaczonych dla różnych komputerów i dla
różnych systemów operacyjnych. Windows NT i Windows 95 również
zostały napisane w C++.
2
Czytając prasę (np. Computer World, PC-Kurier i in.) zwróć
uwagę, że najwięcej ofert pracy jest właśnie dla programistów
posługujących się C++ (i tak zapewne będzie jeszcze przez kilka
lat, póki nie wymyślą czegoś lepszego - np. jakiegoś C+++).
Z Grzechu Trzeciego (choć nie tylko) wynika także pośrednio
Grzech Czwarty.
Języka C++ Grzech Czwarty - ANSI C, C++, czy Turbo C++, Visual
C++, czyli mała wieża BABEL.
Nie jestem pewien, czy "wieża BABEL" jest określeniem
trafniejszym niż "kamień filozoficzny", bądź "perpetuum mobile".
To co w ciągu ostatnich lat stało się z językiem C++ ma coś
wspólnego z każdym z tych utopijnych symboli. A w dużym
uproszczeniu było to tak.
Podobnie, jak mechanikom od zarania dziejów marzyło się
perpetuum mobile, tak informatykom zawsze marzyło się stworzenie
jednego SUPER-UNIWERSALNEGO języka programowania. Takiego, który
byłby zupełnie niezależny od sprzętu tzn., aby program napisany
w takim języku mógł być przeniesiony BEZ ŻADNYCH ZMIAN na
dowolny komputer I DZIAŁAŁ. Do takiej roli pretendowały kolejno
FORTRAN, Algol a potem przyszła pora na C/C++. Gdyby informatycy
nie okazali się zbyt zachłanni, może coś by z tego wyszło. Ale,
jak to w życiu, programiści (podobnie jak żona rybaka z bajki "O
rybaku i złotej rybce") chcieli wszystkiego naraz:
* żeby program dał się przenieść na komputer innego typu i
działał,
* żeby działał szybko i optymalnie wykorzystywał sprzęt,
* żeby umiał wszystko, co w informatyce tylko wymyślono (tj. i
grafika, i obiekty, i obsługa peryferii i...).
I stało się. W pomyślanym jako uniwersalny języku zaczęły
powstawać odmiany, dialekty, mutacje, wersje itp. itd.
Jeśli C++ nie jest Twoim pierwszym językiem, z pewnością
zauważyłeś Czytelniku, że pomiędzy GW Basic a Quick Basic są
pewne drobne różnice. Podobnie Turbo Pascal 7.0 trochę różni się
od Turbo Pascala 5.0. Mimo to przykład poniżej pewnie Cię trochę
zaskoczy. Dla zilustrowania skali problemu przedstawiam poniżej
dwie wersje TEGO SAMEGO PROGRAMU napisanego w dwu różnych
wersjach TEGO SAMEGO JĘZYKA C++. . Obydwa programy robią
dokładnie to samo. Mają za zadanie wypisać na ekranie napis
"Hello World" (czyli "Cześć świecie!").
Program (1)
main()
{
printf("Hello World\n");
}
Program (2)
#include <windows.h>
#include <iostream.h>
LPSTR p = "Hello World\n";
3
main(void)
{
cout << "Hello World" << endl;
MessageBox(0, p, "Aplikacja dla Windows", MB_OK);
return (0);
}
Cóż za uderzające podobieństwo, prawda? Ale żarty na bok. Jeśli
zaistnieje jakiś problem, zawsze mamy co najmniej trzy wyjścia.
Możemy:
1. Udawać, że go nie ma.
Tak postępuje wielu autorów podręczników na temat C/C++.
2. Krzyczeć, że nam się to nie podoba.
Mamy pełne prawo obrazić się i wrócić do Basica lub Pascala.
3. Spróbować poruszać się w tym gąszczu.
Wyjście trzecie ma jedną wadę - jest najtrudniejsze, ale i
efekty takiego wyboru są najbardziej obiecujące.
Jeśli chcesz zaryzykować i wybrać wyjście trzecie, spróbujmy
zrobić pierwszy krok w tej "dżungli". Wyjaśnijmy kilka nazw,
pojęć i zasad gry obowiązujących w tym obszarze.
Języki programowania posługują się pewnymi specyficznymi grupami
słów i symboli. Są to m. in.:
słowa kluczowe
(tu pomiędzy wersjami C++ rozbieżności są niewielkie),
operatory (po prostu znaki operacji - np. +),
(tu zgodność jest niemal 100 %-owa)
dyrektywy
(polecenia dla kompilatora JAK tworzyć program wynikowy;
tu już jest gorzej, szczególnie dyrektywa #pragma w każdej
wersji kompilatora C++ jest inna)
nazwy funkcji
(z tym gorzej, bo każdy producent ma własne funkcje i własne
upodobania)
nazwy stałych
(gdyby chodziło tylko o PI i e - wszystko byłoby proste)
nazwy zasobów (FILE, PRN, CONSOLE, SCREEN itp. itd)
(tu jest lepiej, ale też rozbieżności są zauważalne)
Autor programu może jeszcze nadawać zmiennym (liczbom, zmiennym
4
napisom, obiektom, itp.) własne nazwy, więc czasem nawet
wytrawny programista ma kłopoty ze zrozumieniem tekstu
żródłowego programu...
W języku C a następnie C++ przyjęto pewne maniery nadawania nazw
- identyfikatorów ułatwiające rozpoznawanie tych grup słów:
* nazwa() - funkcja
* słowa kluczowe i nazwy zmiennych - małymi literami
* STAŁE - nazwy stałych najczęściej dużymi literami
* long/LONG - typy danych podstawowe/predefiniowane dla Windows
_NAZWA - nazwy stałych predefiniowanych przez producenta
__nazwa lub __nazwa__ - identyfikatory charakterystyczne dla
danej wersji kompilatora
itp., których to zwyczajów i ja postaram się przestrzegać w
tekście książki.
Amerykański Instytut Standardów ANSI od lat prowadzi walkę z
wiatrakami. Stoi na straży jednolitego standardu języka, który
nazywa się standardem ANSI C i ANSI C++. Wielcy producenci od
czasu do czasu organizują konferencje i spotkania gdzieś w
ciepłych krajach i uzgadniają niektóre standardy - czyli wspólne
dla nich i zalecane dla innych normy, ale niektórzy bywają
zazdrośni o własne tajemnice i nie publikują wszystkich
informacji o swoich produktach. Dlatego wszelkie "słuszne i
uniwersalne" standardy typu ODBC, Latin 2, Mazovia, LIM, OLE,
DDE, BGI, itp., itd. mają niestety do dziś ograniczony zakres
stosowalności a wszelkie zapewnienia producentów o całkowitej
zgodności ich produktu z... (tu wpisać odpowiednie) należy
niestety nadal traktować z pewną rezerwą.
W niniejszej książce zajmiemy się kompilatorem Borland C++ w
jego wersjach 3.0 do 4.5, jest to bowiem najpopularniejszy w
Polsce kompilator języka C/C++ przeznaczony dla komputerów IBM
PC. Nie bez znaczenia dla tej decyzji był także fakt, że Borland
C++ i Turbo C++ bez konfliktów współpracuje z:
* Turbo Pascal i Borland Pascal;
* Assemblerami: TASM, BASM i MASM;
* Turbo Debuggerem i Turbo Profilerem;
* bibliotekami Turbo Vision, ObjectVision, Object Windows
Library, Database Tools, itp.
* pakietami innych producentów - np. Win/Sys Library, Object
Professional, CA-Visual Objects, Clipper, itp.
i in. produktami "ze stajni" Borlanda popularnymi wśród
programistów. Programy TASM/BASM, Debugger, Profiler a także
niektóre biblioteki (np. Object Windows Library, Turbo Vision
Library, itp. wchodzą w skład pakietów instalacyjnych BORLANDA,
ale UWAGA - niestety nie wszystkich). Borland C++ 4+ pozwala,
dzięki obecności specjalnych klas VBX w bibliotece klas i
obiektów Object Windows Library na wykorzystanie programów i
zasobów tworzonych w środowisku Visual Basic'a. Podobnie
kompilatory C++ firmy Microsoft (szczególnie Visual C++)
bezkonfliktowo współpracują z zasobami innych aplikacji - np.
Access, Excel, itp..
5
Zgłoś jeśli naruszono regulamin