1 Programowanie Komputerów 3FZ materiały pomocnicze do laboratorium
2 Spis treści ZAJĘCIA 1. ZAPOZNANIE SIĘ ZE ŚRODOWISKIEM PRACY I REALIZACJA PROSTYCH FUNKCJI W JĘZYKU C++.... 3 1. ZAPOZNANIE SIĘ ZE ŚRODOWISKIEM PRACY... 3 Praca w sieci lokalnej... 3 Sposób logowania... 3 Katalogi robocze... 3 Programy narzędziowe... 3 Praca w środowisku VisualC++... 3 Tworzenie projektu... 3 Kompilacja... 6 Uruchamianie programu... 6 Praca krokowa... 7 2. OPRACOWANIE PROSTYCH PROGRAMÓW W JĘZYKU C++... 7 ZAJĘCIA 2: DEFINIOWANIE KLASY... 8 TWORZENIE SZKIELETU... 8 ZAGADNIENIA Z TEGO ĆWICZENIA OBEJMUJĄ UMIEJĘTNOŚĆ:... 8 ZAJĘCIA 3: ROZBUDOWA KLAS: KONSTRUKTOR, KONSTRUKTOR KOPIUJĄCY, DESTRUKTOR, DYNAMICZNA ALOKACJA PAMIĘCI, FUNKCJE OPERATOROWE... 10 ZAGADNIENIA Z TEGO ĆWICZENIA OBEJMUJĄ UMIEJĘTNOŚĆ:... 10 ZAJĘCIA 4: ROZBUDOWA PROJEKTU.... 11 ZAGADNIENIA Z TEGO ĆWICZENIA OBEJMUJĄ UMIEJĘTNOŚĆ:... 11 ZAJĘCIA 5: DZIEDZICZENIE I FUNKCJE WIRTUALNE... 12
3 Zajęcia 1. Zapoznanie się ze środowiskiem pracy i realizacja prostych funkcji w języku C++. 1. Zapoznanie się ze środowiskiem pracy Praca w sieci lokalnej Laboratorium prowadzone jest na komputerach wyposażonych w system operacyjny Windows NT. Ponadto katalogi robocze są umieszczone na serwerze plikowym pracującym pod kontrolą systemu Linux. Sposób logowania Aby się zalogować do systemu należy wykonać następujące czynności: 1. Sprawdzić czy w miejscu Domena znajduje się KPE, jeśli nie to ją należy wybrać. 2. W miejscu Użytkownik należy podać identyfikator grupy FZ3labxy, x oznacza numer grupy laboratoryjnej; y oznacza numer zespołu w grupie (w tym semestrze jest jedna grupa laboratoryjna zatem dla wszystkich osób x=1, przykładowy identyfikator FZ3lab11) 3. W miejsce hasło nic nie wpisujemy Uwaga! Identyfikatory FZ3labxy zostaną nadane zespołom przez prowadzącego zajęcia i są ważne do końca semestru oraz związane z zespołem a nie z konkretnym komputerem. Katalogi robocze Pliki robocze (źródłowe) należy tworzyć w katalogach umieszczonych na serwerze plikowym, dysk h:\. Jedynie na tym dysku sieciowym można tworzyć pliki i podkatalogi. Programy narzędziowe Programy narzędziowe (kompilator), z których korzysta się podczas zajęć umieszczone są na serwerze plikowym. Praca w środowisku VisualC++ Aby uruchomić środowisko programisty należy z menu Start Programy wybrać grupę Microsoft Visual C++ 6.0 a następnie wybrać pozycję o tej samej nazwie. Tworzenie projektu Aby utworzyć nowy projekt należy wybrać File New a następnie zakładkę Projects.
4 Ponieważ program przedmiotu dotyczy tylko podstaw programowania obiektowego w języku C++, zatem na zajęciach będziemy korzystać tylko z jednego z dostępnych typ typów projektów czyli: Win32 Console Application. Aby utworzyć nowy projekt należy podać jego nazwę w polu Project name: i wskazać lokalizację, w której ma być on utworzony (w naszym przypadku wybieramy dysk sieciowy h:!). Ten typ projektu zapewnia łatwą komunikację z urządzeniami zewnętrznymi i tworzy program działający w trybie okienka konsolowego. W przypadku pomyłki w typie projektu zaleca się usunięcie projektu i utworzenie nowego wg podanych wyżej zasad. Ponadto zaleca się podawanie nazw projektów identyfikujących kolejne zajęcia. Pole z nazwą katalogu jest uaktualniane automatycznie (w razie potrzeby można zmienić miejsce składowania plików projektu). Następnie wskazujemy zawartość tworzonego projektu. Chcąc tworzyć własny program wybieramy zazwyczaj pusty projekt (Empty Project). Struktura plików automatycznie utworzonego projektu jest pokazana w okienku Workspace po wybraniu trybu File View. Po utworzeniu nowego projektu wybieramy menu lokalnego File New tworzymy nowy plik C++ Source File.
5 Następnie w polu File name: wpisujemy nazwę nowego pliku z rozszerzeniem cpp. Pamiętaj jeśli będzie odznaczona opcja Add to project: wtedy utworzony nowy plik nie będzie dołączony do aktywnego projektu. Przełączenie widoku na ClassView pokaże strukturę klas i funkcji (jeśli zostały zdefiniowane) w projekcie. Struktura klas jest tworzona na podstawie deklaracji w plikach nagłówkowych (Header Files). Do projektu można wstawiać pliki już istniejące (źródłowe albo nagłówkowe lub inne) przez otworzenie menu lokalnego (naciśnięcie prawego klawisza myszki) dla konkretnego folderu (Source Files, Header Files) i wybranie pliku, który ma być dołączony.
6 Kompilacja Narzędzia umożliwiające kompilację i konsolidację znajdują się w menu Build. Poszczególne pliki źródłowe można kompilować z osobna poleceniem Compile (po uprzednim wskazaniu pliku) albo wybrać Build *.exe, aby przeprowadzić proces kompilacji (gdy nie ma modułów obj bądź są przestarzałe) i konsolidacji. Można również wybrać opcję Rebuild all, aby skompilować wszystkie pliki źródłowe i przeprowadzić konsolidację. Alternatywnie można posłużyć się klawiszami skrótów lub paletą narzędziową Build (można ją włączyć/wyłączyć Tools Customize Toolbars). Wyniki kompilacji i konsolidacji (w szczególności lista błędów) są pokazywane w dolnym panelu. W przypadku pojawienia się błędu można dwukrotnie kliknąć na linii z komunikatem o błędzie co spowoduje przeniesienie kursora w panelu edycyjnym do odpowiedniej linii w celu skorygowania błędu. Uruchamianie programu Po utworzeniu programu exe można go uruchomić aby zobaczyć efekty pracy przez wybranie polecenia Build Execute albo klikając wykrzyknik na palecie Build.
7 Rezultat działania zobaczymy w postaci okienka konsolowego. Po zakończeniu działania proces jest wstrzymywany i czeka na reakcję użytkownika. Wykonanie programu spowoduje także wybranie polecenia Build Start Debug Go albo kliknięcie ikony (Go) z palety Build. Porównaj działanie obu sposobów. Praca krokowa Praca krokowa polega na wstrzymywaniu działania programu po wykonaniu instrukcji zakodowanych w jednej linii. Rozpoczęcie tego trybu pracy odbywa się przez wybranie Build Start Debug Step Into (albo Run to cursor). Wykonanie pojedynczej linii programu odbywa się przez Debug Step Over. Wygodniejsze jest jednak korzystanie z palety uruchomieniowej. W czasie pracy krokowej dolny panel zawiera listę zmiennych (obiektów) tworzonych w trakcie działania programu umożliwiając śledzenie zmian ich wartości. Ponadto w Panelu Watch możemy utworzyć własną listę zmiennych których zawartości chcemy podglądać. Zakończenie pracy krokowej i powrót do trybu edycji odbywa się przez wybranie polecenia Debug Stop debugging z menu albo z palety uruchomieniowej. 2. Opracowanie prostych programów w języku C++ Zagadnienia zostaną podane na zajęciach przez prowadzącego.
8 Zajęcia 2: Definiowanie klasy Otwórz przestrzeń roboczą którą utworzyłeś na poprzednich zajęciach poleceniem File Open Workspace i wskaż plik *.dsw. Tworzenie szkieletu Utwórz nowy projekt w swojej przestrzeni roboczej. W trakcie tworzenia projektu zaleca się utworzenie szkieletu przez wybór An empty project. Przełącz panel z zawartością Workspace w tryb widoku klas (ClassView) Z menu lokalnego dla listy klas wybierz New Class i podaj tylko nazwę klasy Osoba a następnie zaakceptuj klikając OK. Zwróć uwagę na to, że w Widoku klas (po rozwinięciu) pojawia nazwa klasy oraz lista automatycznie utworzonych składników, którymi są pewne szczególne funkcje składowe o nazwach takich jak nazwa klasy. Te funkcje to konstruktor i destruktor Po powrocie do widoku plików (FileView) zauważysz, że utworzone zostały dwa pliki Osoba.cpp i Osoba.h. Ten ostatni plik zawiera szkielet klasy (deklarację) z dwoma funkcjami tj. konstruktorem i destruktorem, których ciała, zdefiniowane w Osoba.cpp, są puste. Przełącz panel na widok ClassView. Aby dodać składnik klasy: daną albo funkcję, należy z menu lokalnego dla klasy Osoba wybrać odpowiednio Add Member Variable albo Add Member Function. Zwróć uwagę na menu lokalne dla poszczególnych składników klasy. Znajdują się tam m.in. polecenia Go to Declaration i Go to Definition ułatwiające poruszanie się zwłaszcza po dużym wielomodułowym projekcie. Staraj się korzystać z tych ułatwień. Dwukrotne kliknięcie na nazwie funkcji powoduje przejście do definicji funkcji. Stwórz dodatkowy plik, w którym będzie znajdować się funkcja główna. W tym celu z menu File należy wybrać opcję New, w zakładce Files zaznaczyć C++ Source File i podać nazwę dołączanego pliku. Funkcję główną: void main() należy umieścić właśnie w tym pliku. Będzie ona widoczna także w folderze Globals w Widoku klas. Zagadnienia z tego ćwiczenia obejmują umiejętność: deklarowania i definiowania danych składowych: prywatnych i publicznych; deklarowania i definiowania funkcji składowych publicznych; wykorzystania mechanizmu ustawiania danych składowych; zastosowania wskaźnika this; zabezpieczania danych składowych przed modyfikacją;
9 dołączania plików nagłówkowych w całym projekcie; korzystania z wbudowanych funkcji bibliotecznych (m.in. iostream.h, sting.h); opracowania funkcji głównej tak, by demonstrowała (testowała) działanie poszczególnych funkcji składowych opracowanej klasy;
10 Zajęcia 3: Rozbudowa klas: konstruktor, konstruktor kopiujący, destruktor, dynamiczna alokacja pamięci, funkcje operatorowe. Zagadnienia z tego ćwiczenia obejmują umiejętność: zainicjowania danych składowych obiektu obydwu klas w konstruktorze; zdefiniowania konstruktora z parametrami dla jednej z klas; zdefiniowania konstruktora domyślnego (np. z argumentami domniemanymi) dla drugiej klasy; ustawiania składowych klasy w liście inicjalizacyjnej konstruktora; dynamicznego tworzenia tablic przydział pamięci za pomocą operatora new; zwalniania dynamicznie przydzielonej pamięci za pomocą operatora delete; zdefiniowania operatora przypisania; zdefiniowania funkcji operatorowej według instrukcji w ćwiczeniu; zdefiniowania funkcji zaprzyjaźnionych; zdefiniowania operatorowych funkcji (<<, >>) skojarzonych ze standardowymi strumieniami wyjścia, wejścia; zdefiniowania konstruktora kopiującego; opracowania funkcji głównej tak, by demonstrowała (testowała) działanie poszczególnych funkcji składowych opracowanych klas
11 Zajęcia 4: Rozbudowa projektu. Zagadnienia z tego ćwiczenia obejmują umiejętność: dołączenia kolejnej klasy do projektu; zainicjowania danych składowych obiektu obydwu klas w konstruktorze; deklarowania i definiowania funkcji składowych nowej klasy tak, by wykorzystywały one wcześniej zdefiniowane funkcje klasy utworzonej na poprzednich zajęciach; zdefiniowania konstruktora z argumentami domniemanymi; dynamicznego tworzenia tablic przydział pamięci za pomocą operatora new; zwalniania dynamicznie przydzielonej pamięci za pomocą operatora delete; zdefiniowania operatora przypisania dla nowej klasy; zdefiniowania funkcji operatorowej: operator[]; zdefiniowania konstruktora kopiującego dla nowej klasy; zdefiniowania operatorowych funkcji (<<, >>) skojarzonych ze standardowymi strumieniami wyjścia, wejścia; opracowania funkcji głównej tak, by demonstrowała (testowała) działanie powyższych funkcji;
12 Zajęcia 5: Dziedziczenie i funkcje wirtualne. Zagadnienia z tego ćwiczenia obejmują umiejętność: zastosowania mechanizmu dziedziczenia; wykorzystania mechanizmu funkcji wirtualnych; dołączenia kolejnych klas do projektu; zdefiniowania konstruktorów: domyślnego i kopiującego według instrukcji w ćwiczeniu; dynamicznego przydzielenia i zwalniania pamięci dla tablicy wskaźników; opracowania funkcji głównej tak, by demonstrowała (testowała) działanie wszystkich funkcji;