Wprowadzenie Programowanie Obiektowe Mateusz Cicheński
Paradygmaty programowania C++ Krótki przykład Kompilacja i linkowanie Makefile Przydatne flagi kompilatora Zaliczenie przedmiotu Harmonogram roku Omówienie Projektu 1 Plan zajęć
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; } swith (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 strukturalne
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 proceduralne
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
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 ; } Programowanie obiektowe c.d.
Programowanie proceduralne Skupia się na: Algorytmie Danych Podstawowa jednostka danych Struktura Programowanie obiektowe 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 Różnice między PP a 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 Własności PO
1. #ifndef _CAR 2. #define _CAR car.h Dyrektywy preprocesora 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 Przykład w C++ (1)
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; 13. cout << " wheels and max speed equals to " << maxspeed; 14. cout << "\n"; 15. } Przykład w C++ (2) car.cpp
1. #include <iostream> 2. #include "car.h" main.cpp 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. } Przykład w C++ (3)
$ g++ main.cpp o main 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 Kompilacja C++
$ g++ c car.cpp o car.o $ g++ c main.cpp o main.o $ g++ *.o o main main main.o car.o Linkowanie C++
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
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 Makefile - przykład
-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 Flagi kompilatora g++
Zaliczenie przedmiotu harmonogram i zasady
Data Zadanie 12-10-2015 Wybór Projektu 1 26-10-2015 Przesłanie sprawozdania do Projektu 1 23-11-2015 Oddanie Projektu 1 w trakcie zajęć 7-12-2015 Wybór Projektu 2 21-12-2015 Przesłanie sprawozdania do Projektu 2 18-01-2016 Oddanie Projektu 2 w trakcie zajęć Harmonogram
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 Ocena z laboratorium
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 Warunki realizacji projektu
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
Finalny projekt powinien zawierać: Kod źródłowy aplikacji Skompilowane biblioteki używane przez aplikację (.dll) Sposób kompilacji (zwłaszcza gdy nietypowy) Skompilowaną wersję aplikacji (release) Zaktualizowane sprawozdanie Opis działania aplikacji (np. opis interakcji z użytkownikiem, opis sztucznej inteligencji) Wymagania c.d.
Sprawozdanie [6 pkt], w tym: [3 pkt] diagram klas [3 pkt] spis wymagań 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 Punktacja
Nazwa projektu Single-User Dungeon Okręty Scorched Earth Labirynt Generator wierszy Manager zasobów Kalendarz Arkanoid Gra platformowa Wyścigi Typ Gra Gra Gra Gra Aplikacja użytkowa Aplikacja Użytkowa Aplikacja użytkowa Gra Gra Gra Spis projektów
Możliwość wydawania poleceń, które wpływają na osiągane postępy w grze Możliwość zapisania/odczytania stanu gry Tematyka gry dowolna Single-User Dungeon
Popularna gra w statki Możliwość zapisania/odczytania stanu gry Prosta sztuczna inteligencja Okręty
Obliczanie trajektorii pocisku Możliwość zapisania/odczytania stanu gry Prosta sztuczna inteligencja Scorched Earth - wariacja
Generowanie losowych labiryntów Możliwość zapisania/odczytania stanu gry Wprowadzenie statystki: liczba ruchów gracza względem minimalnej liczby ruchów Labirynt
Możliwość wczytania słownika, z którego mają powstać wiersze Określanie parametrów wiersza Zastosowanie zasad gramatyki przy konstrukcji zdań Generator wierszy
Np. ewidencja pracowników firmy, katalogowanie zbiorów muzycznych Możliwość zapisania/odczytania stanu aplikacji (tj. danych użytkownika) Manager zasobów
Zarządzanie wpisami w kalendarzu Możliwość zapisania/wczytania wydarzeń (format ical) Kalendarz
Możliwość tworzenia własnych poziomów (prosty format pliku lub edytor) Zapisywanie listy rekordów Sterowanie klawiaturą Arkanoid
Możliwość tworzenia własnych poziomów (prosty format plików lub edytor) Sterowanie klawiaturą Możliwość zapisania/wczytania stanu gry Wykrywanie kolizji Gra platformowa
Wykrywanie kolizji Tryb ducha powtórzenie przejazdu gracza przez komputer Sterowanie klawiaturą Wyścigi
Dziękuję za uwagę następne zajęcia: Składnia C++, cz. 1