WPROWADZENIE Programowanie Obiektowe Mateusz Cicheński
PLAN ZAJĘĆ Paradygmaty programowania C++ Krótki przykład Kompilacja i linkowanie Makefile Przydatne flagi kompilatora Zaliczenie przedmiotu Harmonogram roku Omówienie Projektu 1
PROGRAMOWANIE STRUKTURALNE Aplikacja posiada kod składający się z hierarchicznie ułożonej sekwencji struktur programistycznych. Sekwencje Instrukcje wyboru Pętle Instrukcje skoku cout << Witaj świecie\n ; int i = 5; result = result % 15; if (i == 0) { result = result 15; } switch (option) { case 1: cout << option 1 ; break; case 2: cout << option 2 ; break; default: cout << none ; break; } for (int i = 0; i < 5; i++) { result += i; } while (n > 0) { n--; } do { n--; } while (n > 0); break; continue; label: goto label;
PROGRAMOWANIE PROCEDURALNE Aplikacja podzielona jest na niezależne części (procedury, funkcje), które przetwarzają dane. Dane przekazywane są przez parametry jako wskaźniki lub referencje. Procedura void sum(int a, int b, int& result) { result = a + b; } Funkcja int sum(int a, int b) { return a+b; }
PROGRAMOWANIE OBIEKTOWE Aplikacja zdefiniowana jest przez zbiór obiektów, które są wystąpieniami klas. Sterowanie odbywa się poprzez wymianę komunikatów między obiektami. Obiekty posiadają swój stan (pola) oraz komunikaty (metody), które umożliwiają wymianę informacji.
PROGRAMOWANIE OBIEKTOWE C.D. Deklaracja klasy obiektu class Car { private: int wheels; protected: int maxspeed; public: Car(int wheels); void printinfo(); } Implementacja jego metod Car::Car(int wheels) { this->wheels = wheels; maxspeed = 10; } void Car::printInfo() { cout << Ten samochód ma << wheels; cout << oraz osiąga prędkość maksymalną << maxspeed; cout << \n ; }
RÓŻNICE MIĘDZY PP A PO Programowanie proceduralne Programowanie obiektowe Skupia się na: Algorytmie Danych Podstawowa jednostka danych Struktura Klasa Podstawowa operacja Funkcja (procedura) Metoda (komunikat) Cel operacji Wykonanie zadania Manipulacja obiektem Sposób dostępu do danych Wszystko jest publiczne (z wyjątkiem zmiennych lokalnych) Klasy posiadają zdefiniowany zbiór metod dostępnych publicznie
WŁASNOŚCI PO Abstrakcja możliwość definiowania własnych klas odzwierciedlających rzeczywistość Hermetyczność ukrywanie informacji obiekty stają się niezależne od siebie pod względem implementacji, liczy się tylko interfejs wymiany informacji Dziedziczenie możliwe jest tworzenie hierarchii klas, bez konieczności redefiniowania funkcjonalności obiektu z którego dziedziczymy Polimorfizm możliwość podstawiania pod zmienną określonego typu wystąpień różnych klas, przy równoczesnym zapewnieniu zgodności z pełnym typem obiektu
Dyrektywy preprocesora PRZYKŁAD W C++ (1) 1. #ifndef _CAR 2. #define _CAR 3. 4. class Car { 5. private: 6. int wheels; 7. protected: 8. int maxspeed; 9. public: 10. Car(int wheels); 11. void printinfo(); 12. }; 13. 14. #endif car.h
1. #include <iostream> 2. #include "car.h" 3. 4. using namespace std; 5. 6. Car::Car(int wheels) { 7. this->wheels = wheels; 8. maxspeed = 10; 9. } 10. 11. void Car::printInfo() { 12. cout << "This car has " << wheels; PRZYKŁAD W C++ (2) 13. cout << " wheels and max speed equals to " << maxspeed; 14. cout << "\n"; 15. } car.cpp
PRZYKŁAD W C++ (3) 1. #include <iostream> main.cpp 2. #include "car.h" 3. 4. using namespace std; 5. 6. int main(int argc, char** argv) 7. { 8. Car* car = new Car(4); 9. car->printinfo(); 10. return 0; 11. }
$ g++ main.cpp o main KOMPILACJA C++ 1. In function `main': 2. main.cpp:(.text+0x94): undefined reference to `Car::Car(int)' 3. main.cpp:(.text+0xa5): undefined reference to `Car::printInfo()' car.h main.cpp car.cpp
$ g++ c car.cpp o car.o $ g++ c main.cpp o main.o $ g++ *.o o main LINKOWANIE C++ main main.o car.o
MAKEFILE Ułatwia kompilację złożonych systemów Posiada prostą składnię: <cel> : [ <zależności> ]* [ <TAB> <polecenie> <endl> ]+ Oraz ciekawe rozszerzenia, np. makra: <nazwa> = <wartość>
MAKEFILE - PRZYKŁAD 1. OBJS = car.o main.o 2. CC = g++ 3. DEBUG = -g 4. CFLAGS = -Wall -c $(DEBUG) 5. LFLAGS = -Wall $(DEBUG) 6. 7. all : $(OBJS) 8. $(CC) $(LFLAGS) $(OBJS) -o main 9. 10. main.o : main.cpp car.h 11. $(CC) $(CFLAGS) main.cpp 12. 13. car.o : car.h car.cpp 14. $(CC) $(CFLAGS) car.cpp 15. 16. clean: 17. rm *.o main 18. Makefile
FLAGI KOMPILATORA G++ -c kompilacja bez linkowania -o plik docelowy -g dodaje informacje wykorzystywane przez debugger -Wall włączenie wszystkich flag dotyczących ostrzeżeń, pozwala m.in. wykryć konstrukcje, które uważane są za wątpliwe, a które łatwo zmienić -MM generuje wpis dla Makefile dotyczący zależności $ g++ -MM main.cpp main.o: main.cpp car.h
ZALICZENIE PRZEDMIOTU harmonogram i zasady
HARMONOGRAM Data Zadanie 27-10-2014 Wybór Projektu 1 17-11-2014 Przesłanie sprawozdania do Projektu 1 8-12-2014 Oddanie Projektu 1 w trakcie zajęć 22-12-2014 Wybór Projektu 2 12-01-2015 Przesłanie sprawozdania do Projektu 2 26-01-2015 Oddanie Projektu 2 w trakcie zajęć
OCENA Z LABORATORIUM Aby zaliczyć przedmiot należy zrealizować dwa projekty. Projekty oceniane są wg skali punktowej, która jest następnie przeliczana na wartości procentowe wg tabeli: Przedział procentowy <0-50) <50-60) <60-70) <70-80) <80-90) <90-100) Ocena 2.0 3.0 3.5 4.0 4.5 5.0 Oceną końcową jest średnia arytmetyczna ocen z projektów. Spóźnienie względem harmonogramu skutkuje uzyskaniem oceny o pół stopnia niższej za każdy tydzień opóźnienia
WARUNKI REALIZACJI PROJEKTU Można: używać grafiki z Internetu używać bibliotek zewnętrznych wzorować się na istniejących programach (kopiować pomysły) Nie można: wykorzystywać cudzego kodu
WYMAGANIA Sprawozdanie powinno zawierać: Imiona i nazwiska autorów z numerami indeksu Krótki opis projektu Wymagane biblioteki Diagram klas wykorzystywanych w aplikacji Spis wymagań (specyfikacja projektu)
WYMAGANIA C.D. Finalny projekt powinien zawierać: Kod źródłowy aplikacji Skompilowane biblioteki używane przez aplikację (.dll) Sposób kompilacji (zwłaszcza gdy nietypowy) Zaktualizowane sprawozdanie Opis działania aplikacji (np. opis interakcji z użytkownikiem, opis sztucznej inteligencji)
Sprawozdanie [6 pkt], w tym: [3 pkt] diagram klas [3 pkt] spis wymagań PUNKTACJA Finalny projekt [14 pkt], w tym: [2 pkt] zgodność ze sprawozdaniem [4 pkt] zastosowanie paradygmatu PO (abstrakcja, enkapsulacja, dziedziczenie, polimorfizm) [4 pkt] wykorzystanie mechanizmów języka C++ (wskaźniki, konstruktory, destruktory, metody wirtualne, późne wiązanie, dyrektywy preprocesora, wyjątki, przestrzenie nazw, wzorce, STL etc.) [4 pkt] bezawaryjna praca aplikacji, formatowanie kodu, komentarze w kodzie
SPIS PROJEKTÓW Nazwa projektu Typ Wymaga GUI? Max. liczba osób Single-User Dungeon Gra Nie 2 Okręty Gra Nie 1 Scorched Earth Gra Nie 2 Labirynt Gra Nie 1 Generator wierszy Aplikacja użytkowa Nie 2 Kalkulator w ONP Aplikacja użytkowa Nie 1 Manager zasobów Aplikacja Użytkowa Nie 1 Kalendarz Aplikacja użytkowa Nie 1 Arkanoid Gra Tak 2 Gra platformowa Gra Tak 3 Wyścigi Gra Tak 2
SINGLE-USER DUNGEON Możliwość wydawania poleceń, które wpływają na osiągane postępy w grze Możliwość zapisania/odczytania stanu gry Tematyka gry dowolna Przykładowe klasy: Hero Monster Goblin Troll
OKRĘTY Popularna gra w statki Możliwość zapisania/odczytania stanu gry Prosta sztuczna inteligencja Przykładowe klasy: Board Ship Cruiser Battleship
Obliczanie trajektorii pocisku SCORCHED EARTH - WARIACJA Możliwość zapisania/odczytania stanu gry Prosta sztuczna inteligencja Przykładowe klasy: Tank Weapon Cannon Laser
Generowanie losowych labiryntów Możliwość zapisania/odczytania stanu gry LABIRYNT Wprowadzenie statystki: liczba ruchów gracza względem minimalnej liczby ruchów Przykładowe klasy: Maze Item Rope Key
GENERATOR WIERSZY Możliwość wczytania słownika, z którego mają powstać wiersze Określanie parametrów wiersza Zastosowanie zasad gramatyki przy konstrukcji zdań Przykładowe klasy: Poem Word Adjective Adverb
Zapisywanie historii sesji KALKULATOR ONP Tworzenie zmiennych i możliwość wykorzystania ich w kolejnych operacjach Zachowanie składni zgodnie z zasadami Odwrotnej Notacji Polskiej Przykładowe klasy: Trace Operand Number UserVariable * + - a b c * d e ab+cde*-*
MANAGER ZASOBÓW Np. ewidencja pracowników firmy, katalogowanie zbiorów muzycznych Możliwość zapisania/odczytania stanu aplikacji (tj. danych użytkownika)
KALENDARZ Zarządzanie wpisami w kalendarzu Możliwość zapisania/wczytania wydarzeń (format ical) Przykładowe klasy: Day Event SingleTimeEvent ContinousEvent
ARKANOID Możliwość tworzenia własnych poziomów (prosty format pliku lub edytor) Zapisywanie listy rekordów Sterowanie klawiaturą Przykładowe klasy: Racket Block NormalBlock MovingBlock
GRA PLATFORMOWA Możliwość tworzenia własnych poziomów (prosty format plików lub edytor) Sterowanie klawiaturą Możliwość zapisania/wczytania stanu gry Wykrywanie kolizji Przykładowe klasy: Player Enemy WorldBlock DestructibleBlock SolidBlock
WYŚCIGI Wykrywanie kolizji Tryb ducha powtórzenie przejazdu gracza przez komputer Sterowanie klawiaturą Przykładowe klasy: Obstacle Vehicle SmallCar SportCar
DZIĘKUJĘ ZA UWAGĘ następne zajęcia: Składnia C++, cz. 1