LEKCJA 5 - DZIAŁANIA PRZY POMOCY MYSZKI I BŁĘDY W PROGRAMIE. ________________________________________________________________ Z tej lekcji dowiesz się, * Jak posługiwać się myszką w środowisku IDE (DOS) * O czy należy pamiętać, przy tworzeniu i uruchamianiu programów. * Jak poprawiać błędy w programie. ________________________________________________________________ Zanim będzie można kontynuować eksperymenty, trzeba coś zrobić, by robocze okno edytora było puste. Aby otworzyć takie nowe puste okno edytora należy: * Rozwinąć menu File; * Wybrać z menu rozkaz New (nowy). Na ekranie monitora otworzy się nowe puste okno zatytułowane "NONAME00.CPP", "NONAME01.CPP", itp (lub "bez nazwy" i o kolejnym numerze). Różne edytoro-podobne aplikacje mają zwyczaj otwierania okna dla nowego pliku tekstowego i nadawanie mu na początku jednej z dwóch nazw: [S] SŁOWNICZEK: UFO w trybie Edycji ________________________________________________________________ Untitled - niezatytułowany Noname - bez nazwy (Tak na marginesie UFO to skrót od Unidentified Flying Object - Niezidentyfikowany Obiekt Latający, gdy przejdziemy do programowania obiektowego, znajomość tego terminu też Ci się przyda). ________________________________________________________________ Nadanie plikowi dyskowemu z tekstem źródłowym programu jego właściwej nazwy i zapisanie go na dysku stałym komputera w określonym miejscu następuje w tym momencie, kiedy po napisaniu programu zapisujesz go na dysk rozkazem: File | Save lub File | Save As... Zapis File | Save oznacza "Rozkaz Save z menu File". Gdy po opracowaniu programu rozwiniesz menu File i wybierzesz rozkaz Save as... (zapisz jako...), pojawi się okienko dialogowe "Save File as" (zapis pliku jako...). Do okienka edycyjnego "Name" (nazwa) możesz wpisać nazwę, którą chcesz nadać swojemu nowemu programowi. Zwróć uwagę, że możesz podać nazwę pliku i jednocześnie wskazać miejsce - np.: Name: F:\USERS\ADAM\PROBY\PROGRAM.CPP Po wpisaniu nazwy naciśnij klawisz [Enter] lub wybierz klawisz [OK] w okienku dialogowym myszką. Tytuł okna edytora zmieni się na wybraną nazwę. Możesz również (jeśli odpowiedni katalog już istnieje), wskazać właściwy katalog w okienku z listą "Files" i dwukrotnie "kliknąć" lewym klawiszem myszki. Możesz wskazać myszką okienko edycyjne i nacisnąć lewy klawisz myszki, bądź naciskać klawisz [Tab] aż do momentu, gdy kursor zostanie przeniesiony do okienka edycyjnego. Okienko edycyjne to to okienko, do którego wpisujesz nazwę pliku. W okienku edycyjnym (Save File As) naciskaj klawisz [BackSpace] aż do chwili skasowania zbędnej nazwy pliku i pozostawienia tam tylko ścieżki dostępu - np. A:\PROBY\. Wpisz nazwę programu - np. PROG1.CPP. Po wpisaniu nazwy możesz nacisnąć [Enter] lub wskazać myszką klawisz [OK] w okienku i nacisnąć lewy klawisz myszki. Jeśli tak zrobisz w przypadku pustego okienka NONAME00.CPP - kompilator utworzy na dysku we wskazanym katalogu plik o zadanej nazwie - np. A:\PROBY\PROGR1.CPP (na razie pusty). Zmieni się także nagłówek (nazwa) okienka edycyjnego na ekranie roboczym. [!!!]UWAGA. ________________________________________________________________ Wszystkie pliki zawierające teksty programów w języku C++ powinny ˙mieć charakterystyczne rozszerzenie *.CPP (CPP to skrót od C Plus Plus), lub .C. Po tym rozszerzeniu rozpoznaje te programy kompilator. Nadanie rozszerzenia .C lub .CPP może dodatkowo wpływać na sposób kompilacji programu. Zanim wyjaśnimy te szczegóły, będziemy zawsze stosować rozszerzenie .CPP. Wszelkie inne rozszerzenia (.BAK, .TXT, .DEF, itp.) nie przeszkadzają w edycji i kompilacji programu, ale mogą w niejawny sposób wpłynąć na sposób kompilacji. ________________________________________________________________ Jeśli masz puste robocze okno edytora - możesz wpisać tam swój własny nowy program. Wpisz: void main(void) Każdy program w C++ składa się z instrukcji. Wiele takich instrukcji to wywołania funkcji. W C++ rozkaz wywołania i wykonania funkcji polega na wpisaniu nazwy funkcji (bez żadnego dodatkowego słowa typu run, execute, load, itp.). Tych funkcji może być w programie jedna, bądź więcej. Tworzenie programu w C++ z zastosowaniem funkcji (takich jakgdyby mini-programików) przypomina składanie większej całości z klocków. Należy podkreślić, że: każdy program w C++ musi zawierać funkcję main() (ang. main - główna). Wykonanie każdego programu rozpoczyna się właśnie od początku funkcji main(). Innymi słowy - miejsce zaznaczone w programie przy pomocy funkcji main() to takie miejsce, w które komputer zagląda zawsze na początku wykonania programu i od tego właśnie miejsca rozpoczyna poszukiwanie i wykonywanie rozkazów. [S] Entry Point ___________________________________________________________________ Punkt wejścia do programu nazywa się: Program Entry Point Taki właśnie punkt wejścia wskazuje słowo main(). Punk wejścia mogą mieć nie tylko programy .EXE ale także biblioteki (.DLL - dynamicznie dołączanie biblioteki). ____________________________________________________________________ Każda funkcja powinna mieć początek i koniec. Początek funkcji w C/C++ zaznacza się przez otwarcie nawiasów klamrowych { a koniec funkcji poprzez zamknięcie } . Początek głównej funkcji main() to zarazem początek całego programu. Zaczynamy zwykle od umieszczenia w oknie edytora C++ znaków początku i końca programu. main() { <-- tu rozbudowuje się tekst programu } Najpierw naciśnij [Enter] i przejdź do początku nowej linii. Umieść w tej nowej linii znak początku programu - nawias { (lewy nawias klamrowy). Następnie naciśnij [Enter] powtórnie i umieść w następnej linii prawy nawias klamrowy - }. [!!!] NAJPIERW Save !!! ________________________________________________________________ Zanim jeszcze skończysz redagowanie programu i sięgniesz do klawiszy [Alt]+[R], pamiętaj, że przed próbami kompilacji i uruchomienia programu zawsze NAJPIERW należy zapisać program na dysk. Jeśli przy próbach uruchomienia coś pójdzie nie tak - masz pewność, że Twoja praca nie pójdzie na marne. Czasami przy próbach uruchamiania programów zdarza się, że błędy mogą spowodować zawieszenie komputera. Programista jest wtedy zmuszony do restartu komputera, przy wyłączeniu komputera to, co było tylko na ekranie i tylko w pamięci operacyjnej - niestety znika bezpowrotnie. ________________________________________________________________ Aby zapisać tekst programu na dysk należy: * Wybrać z menu rozkaz File | Save As... albo * Nacisnąć klawisz funkcyjny [F2] (działa jak File | Save) Po wydaniu rozkazu Save możesz być pewien, że Twój program jest bezpieczny i komputer może się spokojnie "ZAWIESIĆ" nie czyniąc szkody. Aby skompilować i uruchomić ten program należy: * Wybrać rozkaz Run | Run * Nacisnąć kombinację klawiszy [Ctrl]+[F9] Podobnie jak wcześniej, kompilator wyświetli na ekranie okienko zawierające komunikaty o przebiegu kompilacji. Po zakończeniu kompilacji nastąpi wykonanie programu. Na moment mignie roboczy ekran użytkownika. Na nieszczęście program nic nie robi, więc nic się tam nie wydarzy. Aby przeanalizować, jak kompilator C++ reaguje na błędy w programach, zmień tekst w pierwszej linii programu na błędny: vod main(void) { } Spróbuj powtórnie skompilować i uruchomić program. Kompilator wyświetli okienko, w którym pojawi się komunikat o błędach. W taki właśnie sposób kompilator taktownie informuje programistę, że nie jest aż taki dobry, jak mu się czasami wydaje. Komputer jest niestety pedantem. Oczekuje (my, ludzie tego nie wymagamy) absolutnej dokładności i żelaznego przestrzegania pewnych zasad. "Zjadając" jedną literę naruszyłeś takie zasady, co zauważył kompilator. W górnej części ekranu kompilator wyróżnił paskiem podświetlenia ten wiersz programu, który zawiera błąd. W dolnej części ekranu, w tzw. okienku komunikatów (ang. Message window) pojawił się komunikat, jaki rodzaj błędu został wykryty w Twoim programie. W danym przypadku komunikat brzmi: Declaration syntax error - Błąd w składni deklaracji Co to jest deklaracja? Pierwsza linia (wiersz) funkcji nazywa się deklaracją funkcji. Taka pierwsza linia zawiera informacje ważne dla kompilatora: nazwę funkcji oraz tzw. typy wartości używanych przez funkcję. Komunikat o błędzie oznacza, że nieprawidłowo została napisana nazwa funkcji lub nazwy typów wartości, którymi posługuje się funkcja. W naszym przypadku słowo void zostało przekręcone na "vod", a słowo to ma w C++ specjalne znaczenie. Słowo "void" jest częścią języka C++, a dokładniej - słowem kluczowym (ang. keyword). [S] Function declaration - Deklaracja funkcji. Keyword - Słowo kluczowe. ________________________________________________________________ Function declaration - Deklaracja funkcji. Pierwszy wiersz funkcji jest nazywany deklaracją funkcji. Ten wiersz zawiera informacje dla kompilatora C++ pozwalające poprawnie przetłumaczyć funkcję na kod maszynowy. Keyword - Słowo kluczowe. to specjalne słowo wchodzące w skład języka programowania. Słowa kluczowe to słowa o zastrzeżonym znaczeniu, które można stosować w programach wyłącznie w przewidzianym dla nich sensie. ________________________________________________________________ Popraw błąd w tekście. Aby robocze okienko edytora stało się oknem aktywnym, wskaż kursorem myszki dowolny punkt w oknie edytora i naciśnij lewy klawisz myszki, albo naciśnij klawisz [F6]. Zmień słowo "vod" na "void". Przy pomocy klawiszy ze strzałkami umieść migający kursor po prawej stronie nawiasu { sygnalizującego ˙początek programu i naciśnij [Enter]. Spowoduje to wstawienie pomiędzy początek a koniec programu nowej pustej linii i umieszczenie kursora na początku nowego wiersza. Wpisz do nowego wiersza instrukcję oczyszczenia ekranu (odpowiednik instrukcji CLS w Basicu): clrscr(); W C++ clrscr() oznacza wywołanie funkcji czyszczącej roboczy ekran programu (User screen). Nazwa funkcji pochodzi od skrótu: CLeaR SCReen - czyść ekran. Że to funkcja - można rozpoznać po dodanej za nazwą parze nawiasów okrągłych - (). W tym jednak przypadku wiersz: clrscr(); stanowi nie deklarację funkcji, lecz wywołanie funkcji (ang. function call). C++ znalazłszy w programie wywołanie funkcji wykona wszystkie rozkazy, które zawiera wewnątrz funkcja clrscr(). Nie musisz przejmować się tym, z jakich rozkazów składa się funkcja clrscr(). Te rozkazy nie stanowią części Twojego programu, lecz są zawarte w jednym z "fabrycznych" plików bibliotecznych zainstalowanych wraz z kompilatorem C++. [S] Function - Funkcja Fuction call - Wywołanie funkcji ________________________________________________________________ Funkcja to coś przypominające mini-program. Funkcja zawiera listę rozkazów służących do wykonania typowych operacji (np. czyszczenie ekranu, wyświetlanie menu, wydruk, czy sortowanie listy imion). W programach posługujemy się zwykle wieloma funkcjami. Poznałeś już najważniejszą funkcję główną - main(). W C/C++ możesz posługiwać się gotowymi funkcjami (tzw. bibliotecznymi) a także tworzyć nowe własne funkcje. Na razie będziemy posługiwać się gotowymi funkcjami dostarczanymi przez producenta wraz z kompilatorem C++. ________________________________________________________________ Włącz kompilację i próbę uruchomienia programu. Kompilator stwierdzi, że program zawiera błędy. Naciśnij dowolny klawisz, by zniknęło okienko kompilacji. Kompilator napisał: Error: Function 'clrscr' should have a prototype (Funkcja 'clrscr' powinna mieć prototyp) [???] O co mu chodzi? ________________________________________________________________ Tzw. PROTOTYP funkcji to coś bardzo podobnego do deklaracji funkcji. Prototyp służy do przekazania kompilatorowi pewnych informacji o funkcji jeszcze przed użyciem tej funkcji w programie. Dla przykładu, gdy pisałeś pierwszą linię programu: void main(void) podałeś nie tylko nazwę funkcji - main, lecz także umieściliśmy tam dwukrotnie słowo void. Dokładnie o znaczeniu tych słów napiszemy w dalszej części książki. Na razie zwróćmy jedynie uwagę, że podobnych "dodatkowych" informacji dotyczących funkcji clrscr() w naszym programie nie ma. ________________________________________________________________ Zwróć uwagę, że zapisy: main() int main(void) main(void) { { { } } } są całkowiecie równoważne. Fakt, że słowa kluczowe void (w nawiasie) i int (przed funkcją i tylko tam!) mogą zostać pominięte wskazuje, że są to wartości domyślne (default settings) przyjmowane automatycznie. Funkcja clrscr() została napisana przez programistów z firmy BORLAND i znajduje się gdzieś w osobnym pliku dołączonym do kompilatora C++. Aby móc spokojnie posługiwać się tą funkcją w swoich programach, powinieneś dołączyć do swojego programu informację w jakim pliku dyskowym znajduje się opis funkcji clrscr(). Taki (dość szczegółowy) opis funkcji nazywa się właśnie prototypem funkcji. Aby dodać do programu tę (niezbędną) informację * naciśnij [F6] by przejść do okna edytora * ustaw migający kursor na początku tekstu programu * naciśnij [Enter] dwukrotnie, by dodać dwie nowe puste linie do tekstu programu * na samym początku programu wpisz: #include Takie specjalne linie (zwróć uwagę na podświetlenie) rozpoczynające się od znaku # (ASCII 35) nie są właściwie normalną częścią składową programu. Nie stanowią one jednej z instrukcji programu, mówiącej komputerowi CO NALEŻY ROBIĆ, lecz stanowią tzw. dyrektywę (rozkaz) dla kompillatora C++ - W JAKI SPOSÓB KOMPILOWAĆ PROGRAM. Dyrektywa kompilatora (ang. compiler directive) powoduje dokonanie określonych działań przez kompilator na etapie tłumaczenia programu na kod maszynowy. W danym przypadku dyrektywa #include .... (ang. include - włącz, dołącz) powoduje włączenie we wskazane miejsce zawartości zewnętrznego tekstowego pliku dyskowego - np.: CONIO.H, (plik CONIO.H nazywany ˙także "plikiem nagłówkowym" znajduje się w podkatalogu \INCLUDE). Kompilator dołącza zawartość pliku CONIO.H jeszcze przed rozpoczęciem procesu kompilacji programu. Naciśnij kombinację klawiszy [Ctrl]+[F9]. Spowoduje to kompilację i uruchomienie programu (Run). Przykładowy program powinien tym razem przekompilować się bez błędów. Po dokonaniu kompilacji powinien szybko błysnąć ekran użytkownika. Po tym błysku powinien nastąpić powrót do roboczego środowiska IDE kompilatora C++. Jeśli nie zdążyłeś się przyjrzeć i chcesz spokojnie sprawdzić, co zrobił Twój program - naciśnij kombinację klawiszy [Alt]+[F5]. Dzięki działaniu funkcji clrscr() ekran będzie całkowicie czysty. [S] Compiler directive - DYREKTYWA KOMPILATORA ________________________________________________________________ Dyrektywa kompilatora to rozkaz wyjaśniający kompilatorowi C++ w jaki sposób dokonywać kompilacji programu. Dyrektywy kompilatora zawsze rozpoczynają się od znaku # (ang. hash). Kompilatory C++ posiadają pewien dodatkowy program nazywany PREPROCESOREM. Preprocesor dokonuje przetwarzania tekstu programu jescze przed rozpoczęciem właściwej kompilacji. Dokładniej rzecz biorąc #include jest właściwie dyrektywą preprocesora (szczegóły w dalszej części książki). ________________________________________________________________ [Z] - Propozycje zadań do samodzielnego wykonania. ________________________________________________________________ 1. Spróbuj poeksperymentować "zjadając" kolejno różne elementy w poprawnie działającym na początku programie: - litera w nazwie funkcji - średnik na końcu wiersza - cudzysłów obejmujący tekst do wydrukowania - nawias ( lub ) w funkcji printf() - nawias klamrowy { lub } - znak dyrektywy # - całą dyrektywę #include Porównaj komunikaty o błędach i zgłaszaną przez kompilator liczbę błędów. Czy po przekłamaniu jednego znaku kompilator zawsze zgłasza dokładnie jeden błąd? ________________________________________________________________ ______________________________________________________________________ EOF