UWAGA: Znaki kodowane są w systemie Windows - Latin 2, aby po pobraniu można było przeglądać pod Windowsem, bez konieczności konwersji znaków. 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; 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++. 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 #include LPSTR p = "Hello World\n"; 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) * nazy 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 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.. Warto tu zwrócić uwagę na jeszcze jeden czynnik, który może stać się Twoim, Czytelniku atutem. Jeśli znasz już kompilatory Turbo Pascal, bądź Borland Pascal, zwróć uwagę, że wiele funkcji zaimplementowanych w Turbo Pascal 6.0. czy 7.0 ma swoje odpowiedniki w BORLAND C++ i Turbo C++. Odpowiedniki te zwykle działają dokładnie tak samo, a różnią się najczęściej nieznacznie pisownią nazwy funkcji. Wynika to z błogosławieństwa "lenistwa" (ponoć homo sapiens najwięcej wynalazków popełniał właśnie ze strachu, bądź z lenistwa...). Firmie Borland "nie chciało się" wymyślać od nowa tego, co już sprawdziło się wcześniej i do czego przyzwyczaili się klienci! I odwrotnie. Poznawszy Borland/Turbo C++ z łatwością zauważysz te same funkcje w Borland/Turbo Pascalu. [!!!]UWAGA! ________________________________________________________________ O Kompilatorach BORLAND C++ 4 i 4.5 napiszę nieco póżniej, ponieważ są bardziej skomplikowane i wymagają trochę większej znajomości zasad tworzenia i uruchamiania programów (projekty). To prawda, że zawierają narzędzia klasy CASE do automatycznego generowania aplikacji i jeszcze kilka innych ułatwień, ale miej trochę cierpliwości... ________________________________________________________________ [???] C.A.S.E. ________________________________________________________________ CASE - Computer Aided Software Engineering - inżynieria programowa wspomagana komputerowo. Najnowsze kompilatory C++ wyposażone są w narzędzia nowej generacji. W różnych wersjach nazywają się one AppExpert, ClassExpert, AppWizard, VBX Generator, itp. itd, które pozwalają w dużym stopniu zautomatyzować proces tworzenia aplikacji. Nie można jednak zaczynać kursu pilotażu od programowania autopilota - a kursu programowania od automatycznych generatorów aplikacji dla Windows... ________________________________________________________________ Zaczynamy zatem od rzeczy najprostszych, mając jedynie tę krzepiącą świadomość, że gdy już przystąpimy do pisania aplikacji konkurencyjnej wobec Worda, QR-Tekst'a, czy Power Point'a - może nas wspomagać system wspomaganina CASE dołączony do najnowszych wersji BORLAND C++ 4 i 4.5. Jeśli mamy już gotowe aplikacje w Visual Basic'u - Borland C++ 4+ pozwoli nam skorzystać z elementów tych programów (ale pracować te aplikacje po przetransponowaniu do C++ będą od kilku do kilkuset razy szybciej). _______________________________________________________________