LEKCJA 8. Jakich słów kluczowych używa C++. W trakcie tej lekcji dowiesz się: * Jakie znaczenie mają słowa kluczowe języka C++. * Jakie jeszcze dziwne słowa mogą pojawiać się w programach w pisanych C++. * Trochę więcej o wczytywaniu i wyprowadzaniu danych. * Co to jest i do czego służy zmienna. _______________________________________________________________ Każdy język musi operować tzw. słownikiem - zestawem słów zrozumiałych w danym języku. Jak wiesz z doświadczenia, komputer jest pedantem i wymaga dodatkowo (my, ludzie, tego nie wymagamy), aby znaczenie słów było absolutnie jednoznaczne i precyzyjne. Aluzje, kalambury i zabawne niedomówienia są na razie w dialogu z komputerem niedopuszczalne. Pamięci asocjatywne (oparte na skojarzeniach), sieci neuronowe (neural networks), tworzone bardzo często właśnie przy pomocy C++ - systemy expertowe, - systemy z tolerancją błędów - np. OCR - systemy optycznego rozpoznawania pisma, - "rozmyta" arytmetyka i logika (fuzzy math) - logika większościowa i mniejszościowa - algorytmy genetyczne (genetic algorithms) i inne pomysły matematyków oraz informatyków rozpoczęły już proces "humanizowania" komputerowego myślenia. Powstała nawet specjalna "mutacja" neural C i neural C++, ale to temat na oddzielną książkę. Na razie traktujemy nasz komputer jako automat cyfrowy pozbawiony całkowicie wyobraźni i poczucia humoru, a język C++, jako środek porozumiewania się z tym "ponurakiem". Podobnie do słów języka naturalnego (rzeczowników, czasowników) i słowa języka programowania można podzielić na kilka grup różniących się przeznaczeniem. Takie niby - słowa czasem nazywa się również tokenami lub JEDNOSTKAMI LEKSYKALNYMI (leksykon - inaczej słownik) a sposoby tworzenia wyrażeń (expressions) nazywane są syntaktyką języka (stąd bierze się typowy komunikat o błędach "Syntax Error" - błąd syntaktyczny, czyli niewłaściwa składnia). Słownik języka C++ składa się z: * Słów kluczowych * Identyfikatorów * Stałych liczbowych i znakowych * Stałych tekstowych (łańcuchów znaków - napisów) * Operatorów (umownych znaków operacji) * Znaków interpunkcyjnych * Odstępów UWAGA: Zarówno pojedyncza spacja czy ciąg spacji, tabulator poziomy, znak nowej linii, jak i komentarz dowolnej długości (!) są traktowane przez kompilator jak pojedyncza spacja. Od zarania dziejów informatyki twórcy uniwersalnych języków programowania starali się upodobnić słowa tych języków do zrozumiałych dla człowieka słów języka naturalnego - niestety - angielskiego (swoją drogą, może to i lepiej, że C++ nie wymyślili Japończycy...). Najważniejszą częścią słownika są tzw. SŁOWA KLUCZOWE (keywords). SŁOWA KLUCZOWE w C++. Oto pełna lista słów kluczowych Turbo C++ v 1.0 z krótkim wyjaśnieniem ich znaczenia. Zaczynam od listy podstawowej wersji kompilatora, ponieważ rozważania o niuansach dotyczących kilku specyficznych słów kluczowych (np. friend, template) pozostawiam sobie na póżniej. Krótkie wyjaśnienie - jak to krótkie wyjaśnienie - pewnie nie wyjaśni wszystkiego od razu, ale na pewno pomoże zrozumieć znaczenie większości słów kluczowych. [S] Keywords - słowa kluczowe. asm Pozwala wstawić kod w ASEMBLERZE bezpośrednio do programu napisanego w C lub C++. auto - zmienna lokalna. Przyjmowane domyślnie. break - przerwij. case - w przypadku. cdecl - spec. konwencja nazewnictwa/przekazania parametrów zgodna ze standardem jęz. C. char - znak, typ zmiennej - pojedynczy bajt. class - klasa. const - stała, konstanta. continue - kontynuuj. default - przyjmij domyślnie. delete - skasuj obiekt. do - wykonaj. double - podwójna (długość/precyzja). else - w przeciwnym wypadku. enum - wylicz kolejno. _export - dotyczy tylko OS/2, ignorowany. extern - zewnętrzna. far - dalekie. Wskaźnik - podwójne słowo (w zakresie do 1 MB). float - zmiennoprzecinkowy, rzeczywisty. for - dla (wskazanie zmiennej roboczej w pętli). friend - zaprzyjaźniona funkcja z dostępem do prywatnych i €€€€€€€€€€chronionych członków danej klasy. goto - skocz do (skok bezwarunkowy). huge - daleki, podobnie do far. if - jeżeli (pod warunkiem, że...). inline - funkcja z rozwiniętym wstawionym kodem int - typ zmiennej, liczba całkowita, dwa bajty interrupt - przerwanie. _loadds - podobne do huge, ustawia rejestr DS (Data Segment). long - długi. near - bliski, wskaźnik o dł. 1 słowa. Obszar max. 64 K. new - nowy, utwórz nowy obiekt. operator - operator, określa nowy sposób działania operatora. pascal - deklar. funkcji zgodnej ze standardem przekazywania parametrów przyjętym w Pascalu. private - prywatna, wewnętrzna, niedostępna z zewnątrz. protected - chroniona, część danych i funkcji, do których dostęp. jest ograniczony. public - publiczna, dostępna z zewnątrz. register - zmienną przechwaj nie w pamięci a w rejestrze CPU. return - powrót, zwrot wartości. _saveregs - save registers, zachowaj zawartość rejestrów a następnie odtwórz rejestry przed powrotem. _seg - segment. short - krótka (mała ilość cyfr). signed - ze znakiem (+/-). unsigned - bez znaku (+/-). sizeof - podaj wielkość. static - statyczna. struct - struktura. switch - przełącz. this - ten, wstazanie bieżącego, własnego obiektu (tylko C++). typedef - definicja typu. union - unia, zmienna wariantowa. virtual - wirtualna, pozorna. void - nieokreślona. volatile - ulotna. while - dopóki. Panuje mnienanie, że język C++ posługuje się stosunkowo skromnym zestawem słów kluczowych. To prawda, ale nie cała prawda o języku C++. Zauważyłeś zapewne, że nie ma tu: define, include, printf i innych znanych Ci już słów. To po prostu jeszcze nie cały słownik języka. Zdając sobie sprawę z nieprecyzyjności tego porównania możesz przyjąć, że to coś na kształt listy czasowników. A są przecież jeszcze i inne słowa - o innej roli i przeznaczeniu. [???]€A GDZIE SIĘ PODZIAŁY REJESTRY ??? Nazwy rejestrów mikroprocesora Intel 80X86: _AX€€€€€€€_AL€€€€€€€_AH€€€€€€€_SI€€€€€€€_CS _BX€€€€€€€_BL€€€€€€€_BH€€€€€€€_SP€€€€€€€_DS _CX€€€€€€€_CL€€€€€€€_CH€€€€€€€_BP€€€€€€€_ES _DX€€€€€€€_DL€€€€€€€_DH€€€€€€€_DI€€€€€€€_SS _FLAGS Takie oznaczenia wynikają z architektury konkretnej rodziny mikroprocesorów, nie mogą stanowić uniwersalnego standardu języka C++. Efekt dostosowania C++ do IBM PC to np. odnoszące się do modeli pamięci słowa kluczowe near, far i huge. Wymóg zgodności ze standardem ANSI C spowodował, że w C++ nazwy rejestrów pozostają nazwami o zastrzeżonym znaczeniu, ale nazywają się PSEUDOZMIENNYMI REJESTROWYMI (ang.: Register Pseudovariables). Próba użycia słowa o zastrzeżonym znaczeniu w jakiejkolwiek innej roli (np. jako nazwa Twojej zmiennej) może spowodować wadliwe działanie programu lub uniemożliwić kompilację. Unikaj przypadkowego zastosowania słów o zastrzeżonym znaczeniu! [???] A SKĄD MAM WIEDZIEC ? Listę nazw, które mają już nadane ściśle określone znaczenie w C++ znajdziesz w Help. Dostęp do spisu uzyskasz przez: * Rozwinięcie menu Help [Alt]-[H]; * Wybranie z menu Help rozkazu Index (spis). Wrócić do edytora IDE C++ możesz przez [Esc]. SŁOWA TYPOWE DLA PROGRAMÓW OBIEKTOWYCH. W porównaniu z klasycznym językiem C (wobec którego C++ jest nadzbiorem - ang. superset), w nowoczesnych programach obiektowych i zdarzeniowych pisanych w C++ mogą pojawiać się i inne słowa. Przyjrzyjmy się na trochę inną technikę programowania - bardziej charakterystyczną dla C++. Procesy wprowadzania i wyprowadzania danych do- i z- komputera nazywają się Input i Output - w skrócie I/O (lub bardziej swojsko We/Wy). Obsługa We/Wy komputera to sała obszerna wiedza, na początek będzie nam jednak potrzebne tylko kilka najbardziej istotnych informacji. PROBLEM ˙WEJŚCIA/WYJŚCIA W PROGRAMACH - trochę bardziej ogólnie. Operacje wejścia i wyjścia są zwykle kontrolowane przez pracujący właśnie program. Jeśli uruchomiłeś program, który nie korzysta z klawiatury i nie oczekuje na wprowadzenie przez użytkownika żadnych informacji - możesz naciskać dowolne klawisze - program i tak ma to w nosie. Podobnie, jeśli w programie nie przewidziano wykorzystania drukarki, choćbyś "wyłaził ze skóry", żadne informacje nie zostaną przesłane do drukarki, dla programu i dla użytkownika drukarka pozostanie niedostępna. Aby programy mogły zapanować nad Wejściem i Wyjściem informacji, wszystkie języki programowania muszą zawierać specjalne rozkazy przeznaczone do obsługi Wejścia/Wyjścia (ang. Input/Output commands, lub I/O instructions). Bez umiejętności obsługi We/Wy, czyli bez możliwości porozumiewania się ze światem zewnętrznym psu na budę zdałby się każdy język programowania. Każdy program musi w większym, bądź mniejszym stopniu pobierać informacje ze świata zewnętrznego do komputera i wysyłać informacje z komputera na zewnątrz. Podobnie, jak wszystkie uniwersalne języki programowania - język C++ zawiera pewną ilość rozkazów przeznaczonych do zarządzania obsługą wejścia i wyjścia. Dla przykładu, możemy w języku C++ zastosować OBIEKT cout obsługujący strumień danych wyjściowych. Obiekt cout (skonstruowany przez producenta i zdefiniowany w pliku nagłówkowym IOSTREAM.H) pozwala programiście przesłać dane tekstowe i/lub numeryczne do strumienia wyjściwego i umieścić tekst na ekranie monitora. Wczytaj plik źródłowy z programem COUT1.CPP lub wpisz samodzielnie następujący program przykładowy. Program drukuje tekst na ekranie monitora. [P009.CPP] #include <-- zwróć uwagę na inny, nowy plik #include void main(void) { clrscr(); cout << "Stosujemy obiekt cout:\n"; cout << "Tekst pierwszy\n"; cout << "Tekst drugi...\n"; getch(); } Jak widzisz, każdy rozkaz z użyciem obiektu cout tworzy pojedynczą linię tekstu (wiersz) na ekranie monitora. Kompilator języka C++ wie, że chcesz wysłać tekst na ekran monitora dzięki słowu cout i znakowi << (znak << to tzw. operator przesyłania do strumienia). Wysłany na ekran zostaje tekst umieszczony po operatorze << i (obowiązkowo, podobnie jak w funkcji printf()) ujęty w cudzysłów ("). Tekst ujęty w cudzysłów nazywa się łańcuchem znakowym (ang. string literal). [S] String literal - łańcuch znaków. Łańcuch znaków to grupa znaków alfanumerycznych (tekstowych). Łańcuch znaków to taki ciąg znaków, który komputer może rozpatrywać wyłącznie jako całość i posługiwać się nim tylko tak, jak go wpisałeś. Aby komputer poprawnie rozpoznawał łańcuchy tekstowe - należy ujmować je w cudzysłów. Łańcuch znaków może być nazywany również literałem, bądź literałem łańcuchowym. [!!!] Dla dociekliwych - jak C++ zapamiętuje tekst? Pojedyncze znaki można zapisywać w C++ tak: 'A' - pojedynczy znak reprezentowany w pamięci komutera jako jeden bajt zawierający liczbę - numer litery A według kodu ASCII. W tym przypadku byłaby to liczba 65 (dwójkowo i szesnastkowo- odpowiednio: 0100 0001 i 41). "A" - jednoelementowy łańcuch znaków zajmujący w pamięci dwa bajty (kod litery A i znak końca łańcucha - \0). Reprezentacja w pamięci wyglądałaby tak: Bajt Nr X 0100 0001 - kod ASCII litery A Bajt Nr X+1 0000 0000 - kod ASCII 0 - znak końca Wiesz już, że clrscr(); stanowi wywołanie gotowej funkcji (tzw. funkcji bibliotecznej). Informacja dotycząca tej funkcji (tzw. prototyp funkcji) znajduje się w pliku CONIO.H, dlatego dołączyliśmy ten plik nagłówkowy na początku programu dyrektywą #include. A cóż to za dziwoląg ten "cout" ? Po cout nie ma pary nawiasów okrągłych (gdyby to była funkcja - powinno być cout()) - nie jest to zatem wywołanie funkcji. ˙Strumień danych wyjściowych cout - JEST OBIEKTEM (ang. I/O stream object - obiekt: strumień Wejścia/Wyjścia). Ale nie przestrasz się. Popularne wyobrażenie, że programowanie obiektowe jest czymś bardzo skomplikowanym nie ma z prawdą więcej wspólnego, niż powszechny dość pogląd, że baba z pustym wiadrem jest gorsza od czarnego kota. W gruncie rzeczy jest to proste. Strumień to nic innego jak zwyczajny przepływ informacji od jednego urządzenia do innego. W tym przypadku strumień (przepływ) danych oznacza przesłanie informacji (tekstu) z pamięci komputera na ekran monitora. Trójkątne nawiasy (<< lub >>) wskazują kierunek przepływu informacji. Przesyłanie następuje w naszym przypadku z pamięci do strumienia Pojawiło się tu ważne słowo - OBIEKT. Obiekt podobnie jak program komputerowy jest to grupa danych i funkcji działających wspólnie i przeznaczonych razem do wykonania jakichś zadań. Dla przykładu obiekt cout służy do obsługi przesyłania danych na ekran monitora. Słowo "obiekt" jest często używane w opisach nowoczesnych technik programowania - tzw. PROGRAMOWANIA OBIEKTOWEGO. Programowanie obiektowe, ta "wyższa szkoła jazdy" dla programistów z lat 80-tych jest już właściwie w naszych czasach normą. Zresztą widzisz sam - napisałeś program obiektowy i co - i nic strasznego się nie stało. Na początek musisz wiedzieć tylko tyle, że aby posługiwać się obiektami - strumieniami wejście i wyjścia - należy dołączyć w C++ plik nagłówkowy IOSTREAM.H. Dlatego dyrektywa #include znajduje się na początku przykładowego programu. KILKA ARGUMENTÓW FUNKCJI w praktyce. Jak starałem się wykazać w przykładzie z sinusem, funkcja może otrzymac jako argument stałą - np. określoną liczbę, bądź zmienną (niewiadomą). Niektóre funkcje mogą otrzymywać w momencie ich wywołania (użycia w programie) więcej niż jeden argument. Rozważmy to dokładniej na przykładzie funkcji fprintf() zbliżonej w działaniu do printf(), lecz bardziej uniwersalnej. Funkcja fprintf() pozwala wyprowadzać dane nie tylko na monitor, ale także na drukarkę. Skoro urządzenia wyjścia mogą być różne, trzeba funkcji przekazać jako jeden z jej argumentów informację o tym - na które urządzenie życzymy sobie w danej chwili wyprowadzać dane. Słowo stdout jest pierwszą informację (tzw. parametrem, bądź argumentem funkcji) przekazanym do funkcji fprintf(). Słowo stdout jest skrótem od Standard Output - standardowe wyjście. Oznacza to w skrócie typowe urządzenie wyjściowe podłączone do komputera ˙i umożliwiające wyprowadzenie informacji z komputera. W komputerach osobistych zgodnych ze standardem IBM PC tym typowym urządzeniem wyjściowym jest prawie zawsze ekran monitora. Tekst, który ma zostać wydrukowany na ekranie monitora jest drugą informacją przekazywaną do funkcji fprintf() - inaczej - stanowi drugi parametr funkcji. Tekst - łańcuch znaków - musi zostać ujęty w znaki cudzysłowu. A jeśli zechcesz wyprowadzić tekst na drukarkę? W C++ zapisuje się to bardzo łatwo. Wystarczy słowo stdout (oznaczające monitor) zamienić na słowo stdprn. Słowo stdprn to skrót od Standard Printer Device - standardowa drukarka. Oto przykład praktycznego użycia funkcji fprintf(). Program przesyła tekst na drukarkę. Przed uruchomieniem programu pamiętaj o włączeniu drukarki. [P010.CPP] #include #include int main(void) { clrscr(); fprintf(stdout, "Drukuje...\n"); fprintf(stdprn, "Pierwsza proba drukowania\n"); fprintf(stdprn, "Autor: ...................."); fprintf(stdout, "Koniec drukowania."); fprintf(stdout, "Skonczylem, nacisnij cosik..."); getch(); return 0; } Gdyby w programie nie było wiersza: fprintf(stdout, "Drukuje...\n"); - użytkownik przez pewien czas nie mógłby się zorientować, czym ˙właściwie zajmuje się komputer. Wszystko stałoby się jasne dopiero wtedy, gdy drukarka rozpoczęłaby drukowanie tekstów. Jest uznawane za dobre maniery praktyczne stosowanie dwóch prostych zasad: BZU - Bez Zbędnych Udziwnień DONU - Dbaj O Nerwy Użytkownika Jeśli efekty działania programu nie są natychmiast zauważalne, należy poinformować użytkownika CO PROGRAM ROBI. Jeśli użytkownik odnosi wrażenie, że komputer nic nie robi - ma zaraz wątpliwości. Często próbuje wtedy wykonać reset komputera i wypowiada mnóstwo słów, których nie wypada mi tu zacytować. Nietrudno zgadnąć, że C++ powinien posiadać także środki obsługi wejścia. W C++ jest specjalny obiekt (ang. input stream object) o nazwie cin służący do pobierania od użytkownika tekstów i liczb. Zanim zajmiemy się dokładniej obiektem cin i obsługą strumienia danych wejściowych - powinieneś zapoznać się ze ZMIENNYMI (ang. variables). ZMIENNE. Gdy wprowadzisz jakieś informacje do komputera - komputer umieszcza je i przechowuje w swojej pamięci (ang. memory - pamięć). Pamięć komputera może być jego pamięcią stałą. Taka pamięć "tylko do odczytu" nazywa się ROM (read only memory - to właśnie "tylko do odczytu"). Pamięć o swobodnym dostępie, do której i komputer i Ty możecie zapisywać wszystko, co Wam się spodoba - nazywa się RAM (od Random Access Memory - pamięć o swobodnym dostępie). Pamięci ROM i RAM podzielone są na małe "komóreczki" nazywane Bajtami, Każdy bajt w pamięci ma swój numer. Ten numer nazywany jest adresem w pamięci. Ponieważ nie wszystko da się pomieścić w jednym bajcie (to tylko 8 bitów - miejsca wystarczy na zapamiętanie tylko jednej litery), bajty (zwykle kolejne) mogą być łączone w większe komórki - tzw. pola pamięci (ang. memory fields). Najczęściej łączy się bajty: 2 Bajty = 16 bitów = Słowo (WORD) 4 Bajty = 32 bity = Podwójne słowo (DOUBLE WORD - DWORD) W uproszczeniu możesz wyobrazić sobie pamięć komputera jako miliony pojedynczych komórek, a w każdej z komórek jakaś jedna wartość (ang. value) zakodowana w postaci ZER i JEDYNEK. Każda taka "szara" komórka ma numer-adres. Numeracja komórek rozpoczyna się nie od 1 lecz od zera (pierwsza ma numer 0). Ilość tych komórek w Twoim komputerze zależy od tego ile pamięci zainstalujesz (np. 4MB RAM to 4x1024x124x8 bitów - chcesz - policz sam ile to bitów). Przeliczając zwróć uwagę, że kilobajt (KB to nie 1000 - lecz 1024 bajty a megabajt - 1024 kB). Zastanówmy się, skąd program może wiedzieć gdzie, w której komórce zostały umieszczone dane i jak się do nich dobrać, gdy staną się potrzebne. Właśnie do takich celów potrzebne są programowi ZMIENNE (ang. variables). Dawno, dawno temu rozwiązywałeś zapewne zadania typu: 3 + [ ] = 5 Otóż to [ ] było pierwszym sposobem przedstawienia Ci zmiennej. Jak widać - zmienna to miejsce na wpisanie jakiejś (czasem nieznanej w danej chwili wartości). Gdy przeszedłeś do następnej klasy, zadania skomplikowały się: 3 + [ ] = 5 147.968 + [ ] = 123876.99875 Na różne zmienne może być potrzeba różna ilość miejsca i na kartce i w pamięci komputera. Gdy "zestarzałeś się" jeszcze trochę - te same zadania zaczęto Ci zapisywać tak: 3 + x = 5 147.968 + y = 123876.99875 Jak widać, zmienne mogą posiadać także swoje nazwy - identyfikatory (z których już niestety nie wynika jasno, ile miejsca potrzeba do zapisania bieżącej wartości zmiennej). [???] Jak C++ wskazuje adres w pamięci? Podobnie, jak w bajeczce o zabawie w chowanego kotka i myszki (myszka mówiła: "Gdybyś mnie długo nie mógł znaleść - będę czekać na czwartej półce od góry..."), niektórzy producenci gier komputerowych życzą sobie czasem przy uruchamianiu gry podania hasła umieszczonego: "W instrukcji na str. 124 w czwartym wierszu do góry" No cóż. Zamiast nazywać zmienne - niewiadome x, y, czy z, bądź rezerwować dla nich puste miejsce [ ], możemy jeszcze wskazać miejsce, w którym należy ich szukać. Takie wskazanie to trzeci sposób odwoływania się do danych. W C++ może się to nazywać referencją do zmiennej lub wskazaniem adresu zmiennej w pamięci przy pomocy wskaźnika. Wskaźnik w C++ nazywa się "pointerem". Pointerem można wskazać także funkcje - podając ich adres startowy (początek kodu funkcji w pamięci RAM). Zmienne możesz sobie wyobrazić jako przegródki w pamięci komputera zaopatrzone w nazwę - etykietkę. Ponieważ nazwy dla tych przegródek nadaje programista w programie - czyli Ty sam, możesz wybrać sobie prawie każdą, dowolną nazwę. Zwykle nazwy nadaje się w taki sposób, by program stał się bardziej czytelny i łatwiejszy do zrozumienia. Dla przykładu, by nie przepadły z pamięci komputera wyniki gier komputerowych często stosuje się zmienną o nazwie WYNIK (ang. Score). Za każdym razem, gdy zmienia się wynik gracza (ang. player's score) w pamięci komputera (w to samo miejsce) zostaje zapisana nowa liczba. W taki sposób pewien niewielki (a zawsze ten sam) fragment pamięci komputera przechowuje dane potrzebne do pracy programu. PRZYPISYWANIE ZMIENNYM KONKRETNEJ WARTOŚCI. Aby komputer mogł pobrać informacje od użytkownika, możesz zastosować w programie np. obiekt - strumień wejściowy - cin (ang. input stream object). Obiekt cin i zmienne chodzą zwykle parami. Przy obiekcie cin musisz zawsze podać operator pobierania ze strumienia wejściowego >> i nazwę zmiennej. Zapis cin >> nazwa_zmiennej; oznacza ˙w C++ : pobierz dane ze strumienia wejściowego i umieść w zmiennej o nazwie "nazwa_zmiennej".Te informacje, które zostaną ˙wczytane, C++ przechowuje w przgródce oznaczonej nazwą, którą nadajesz zmiennej. Oto program przykładowy ilustrujący zapamiętywanie danych wprowadzonych przez użytkownika z klawiatury, wczytanych do programu przy pomocy obiektu cin i zapamiętanych w zadeklarowanej wcześniej zmiennej x: [P011.CPP] #include #include void main(void) { int x; cout << "Podaj liczbe calkowita 0 - 1000 do zapamietania: "; cin >> x; cout << "Pamietam! "; cout << "Wielokrotnosci liczby: \n": cout << "x, 2x, 3x: " << x << " " << 2*x << " " << 3*x; cout << "\n ...Nacisnij dowolny klawisz..."; getch(); } Zapis cin >> x oznacza: "pobierz dane ze strumienia danych wejściowych i umieść je w pamięci przeznaczonej dla zmiennej x". x - to nazwa (identyfikator) zmiennej. Ta nazwa jest stosowana przez komputer do identyfikacji przegródki w pamięci, w której będzie przechowywana liczba wpisana przez użytkownika jako odpowiedź na zadane pytanie. Kompilator C++ zarezerwuje dla zmiennej x jakąś komórkę pamięci i umieści tam wpisaną przez Ciebie liczbę. W trakcie pracy kompilator C++ tworzy dla własnego użytku tzw. tablicę symboli, którą posługuje się do rozmieszczania danych w pamięci. Jeśli chcesz, możesz sprawdzić przy pomocy Debuggera (Debug | Inspect) w których bajtach RAM C++ umieścił Twoją zmienną. [???] Ile miejsca trzeba zarezerwować? To, ile miejsca trzeba zarezerwować dla danej zmiennej kompilator "wie" dzięki Twojej deklaracji, jakiego typu dane będą przechowywane w miejscu przeznaczonym dla zmiennej. Dla przykładu: - jeśli napiszesz int x; Kompilatoer zarezerwuje 2 bajty - jeśli napiszesz float y; Kompilatoer zarezerwuje 4 bajty itp...(szczegóły - patrz niżej). Zwykle nie musisz się przejmować tym, w którym miejscu kompilator rozmieścił Twoje dane. Wszystkie czynności C++ wykona automatycznie. Aby jednak wszystko przebiegało poprawnie - zanim zastosujesz jakąkolwiek zmienną w swoim programie - musisz ZADEKLAROWAĆ ZMIENNĄ. Deklaracja zmiennej to informacja dla kompilatora, ile i jakich zmiennych będziemy stosować w programie. Deklaracja zawiera nie tylko nazwę zmiennej, ale również typ wartości, jakie ta zmienna może przybierać. Przykładem deklaracji jest wiersz: int x; Słowo kluczowe int określa typ danych. Tu oznacza to, że zmienna x może przechowywać jako wartości liczby całkowite (ang. INTeger - całkowity) o wielkości zawartej w przedziale - 32768...+32767. Po określeniu typu danych następuje w deklaracji nazwa zmiennej i średnik. [S] Variable Declaration - Dekaracja Zmiennej. Deklaracja zmiennej w C++ to określenie typu wartości zmiennej i podanie nazwy zmiennej. Zwróć uwagę w przykładowym programie, że kierując kolejno dane do strumienia wyjściwego cout możemy je poustawiać w tzw. łańcuch (ang. chain). Przesyłanie danych do obiektu cout operatorem << jest bardzo elastyczne. Wysyłamy na ekran zarówno tekst jak i liczbę - bieżącą wartość zmiennej x oraz wyniki obliczenia wartości wyrażeń ( 2*x i 3*x). Posługując się łączonym w "łańcuch" operatorem << można wyprowadzać na ekran wiersz zbudowany z różnych elementów. Operator przesyłania danych do strumienia wyjściowego << (ang. insertor - dosł. - operator wstawiania) powoduje przesłanie do obiektu cout kolejno wszystkich (różnego typu) elementów. Zwróć uwagę na użycie znaku \n na początku nowego wiersza, na końcu wiersza tekstu (można go zastosować nawet w środku wiersza tekstu - sprawdź). Zwróć uwagę w jaki sposób C++ rozpoznaje różnicę pomiędzy: - łańcuchem znaków - napisem (napis powinien być podany tak): cout << "x, 2x, 3x"; - wartością zmiennej: cout << x; Widać tu wyraźnie, dlaczego znak cudzysłowu jest dla kompilatora istotny. Jeśli pominiemy cudzysłów, C++ będzie próbował zinterpretować literę (tekst) jako nazwę zmiennej a nie jako napis. RODZAJE ZMIENNYCH: ZMIENNE NUMERYCZNE I ZMIENNE TEKSTOWE. Zmienne mogą w C++ być bardzo elastyczne. Dokładnie rzecz biorąc, zmienne mogą być: RÓŻNYCH TYPÓW - mogą być liczbami, mogą także być tekstami. Uruchom program jeszcze raz i zamiast liczby naciśnij w odpowiedzi na pytanie klawisz z literą. Program wydrukuje jakieś bzdury. Dzieje się tak dlatago, że program oczekuje podania liczby i zakłada, że wprowadzone przez użytkownika dane są liczbą. [???] A jeśli użytkownik nie czyta uważnie??? C++ zakłada, że użytkownik wie co robi gdy podaje wartość zmiennej. Jeśli wprowadzone zostaną dane niewłaściwego typu - C++ nie przerywa działania programu i nie ostrzega przed niebezpieczeństwem błędu. Sam dokonuje tzw. konwersji typów - tzn. przekształca dane na wartość typu zgodnego z zadeklarowanym w programie typem zmiennej. To programista musi dopilnować, by pobrane od użytkownika dane okazały się wartością odpowiedniego, oczekiwanego przez program typu, lub przewidzieć w programie sposób obsługi sytuacji błędnych. Można utworzyć zmienną przeznaczoną do przechowywania w pamięci tekstu - napisu. Aby to zrobić musimy zadeklarować coś jakościowo nowego tzw. TABLICĘ ZNAKOWĄ (ang. character array). Jest to nazwa, przy pomocy której komputer lokalizuje w pamięci zbiór znaków. Aby zadeklarować zmienną (tablicę) znakową w C++ musimy zacząć od słowa kluczowego char (ang. CHARacter - znak). Następnie podajemy nazwę zmiennej a po nazwie w nawiasach kwadratowych ilość znaków, z których może składać się zmienny tekst, który zamierzamy przechowywać w pamięci pod tą nazwą. W programie poniżej zmienna x nie jest już miejscem w pamięci służącym do przechowywania pojedynczej liczby. Tym razem nazwa (identyfikator zmiennej) x oznacza tablicę znakową, w której można przechowywać tekst o długości do 20 znaków. W C++ ostatnim znakiem w łańcuchu znakowym (tekście) bądź w tablicy znakowej zwykle jest tzw. NULL CHARACTER - niewidoczny znak o kodzie ASCII 0 (zero). W C++ znak ten podaje się przy pomocy szyfru '\0'. Przy pomocy tego znaku C++ odnajduje koniec tekstu, łańcucha znaków, bądź koniec tablicy znakowej. Tak więc w tablicy x[20] w rzeczywistości można przechować najwyżej 19 dowolnych znaków plus na końcu obowiązkowy NULL (wartownik). [P012.CPP] #include #include void main(void) { char x[20]; //<---- deklaracja tablicy znakowej. clrscr(); cout << "Podaj mi swoje imie: : "; cin >> x; cout << "\nNazywasz sie " << x << ", ladne imie!\n"; cout << "...Nacisnij dowolny klawisz..."; getch(); } [Z] 1. Spróbuj w przykładowych programach z poprzednich lekcji zastąpić funkcje obiektami - strumieniami We/Wy: printf() - cout << scanf() - cin >> 2. Spróbuj napisać program zawierający i funkcje i obiekty. Czy program pracuje bezkonfliktowo? Pamiętaj o dołączeniu odpowiednich plików nagłówkowych.