PROE wykład 1 dr inż. Jacek Naruniec
Informacje o przedmiocie Prowadzący: dr inż. Jacek Naruniec, J.Naruniec@ire.pw.edu.pl, pokój 11, konsultacje w poniedziałki w godzinach 15-17 Inne godziny konsultacji w razie potrzeby w inne dni w 11 lub po uprzednim umówieniu się. Strona przedmiotu: ztv.ire.pw.edu.pl/proe (będzie uruchomiona w przyszłym tygodniu, na razie jest z poprzedniego roku)
Zaliczenie Progi punktowe: >= 90 punktów - 5 >= 80 punktów - 4,5 >= 70 punktów - 4 >= 60 punktów - 3,5 >= 50 punktów - 3 < 50 punktów - 2 2 sprawdziany wykładowe (terminy zostaną podane na kolejnych wykładach), za 25+25=50 punktów. Laboratorium 50 punktów Kolokwium poprawkowe na ostatnim wykładzie (wybrane jedno kolokwium)
Zaliczenie Aby otrzymać ocenę pozytywną z przedmiotu należy: zdobyć co najmniej 1/3 punktów z każdego z projektów (3, 5, 5), zdobyć co najmniej 25 punktów z kolokwiów, zdobyć co najmniej 25 punktów z laboratoriów, zdobyć w sumie co najmniej 50 punktów.
Laboratorium Terminy: Środa 16:15 Czwartek 14:15 Piątek 8:15 Piątek 12:15 Piątek 14:15 Piątek 16:15 Na zapisach pierwszeństwo mają osoby przypisane do tego terminu z Eresa!
Laboratorium Zadania wykonywane są samodzielnie! Zadania i projekty można oddawać zarówno na komputerach laboratoryjnych (system linuksowy i Windows) jak i na własnych komputerach (zarówno w systemie linuksowym jak i Windows). Dopuszczalne są jedynie 3 kompilatory - linuksowy g++, kompilator Visual Studio, wersja min. 2010 (studenci WEiTI mają darmowy dostęp do VS poprzez MS Imagine) i LLVM w ios. Zabronione jest oddawanie programów w DevCPP, C++ Builder, itp. Dokumentacja doxygen wymagana jest tylko do drugiego projektu (6, 7, 8, 9).
Laboratorium Za każdy rozpoczęty tydzień opóźnienia w oddawaniu projektów laboratoryjnych maksymalna ilość punktów do zdobycia obniżana jest o 20% (pierwszy tydzień 20%, drugi 40% itd.) Zaliczenie projektu odbywa się na ostatnich zajęciach przewidzianych dla tego projektu, np. dla projektu realizowanego na zajęciach 2,3,4 zaliczenie odbywa się na 4 zajęciach Administratorem laboratorium jest inż. Paweł Szczęsny, pok. 14 tel. 22 234 5385
Literatura Bjarne Stroustrup, "Programowanie. Teoria i praktyka z wykorzystaniem C++." Bruce Eckel, "Thinking in C++ Bjarne Stroustrup, "Język C++ Jerzy Grębosz, "Symfonia C++" Jerzy Grębosz, "Pasja C++"
Treść wykładu i efekty kształcenia Treść wykładu: Zapoznanie się z możliwościami języka obiektowego C++ Zapoznanie z możliwościami podstawowych bibliotek C++ Nowy standard C++11 Efekty kształcenia: Zdobycie podstawowej wiedzy o programowaniu obiektowym. Zdobycie umiejętności pisania własnych aplikacji C++. Zdobycie umiejętności pisania dokumentacji doxygen.
Jak uczyć się programowania? Samo czytanie/słuchanie/rozumienie nie wystarczy! Samodzielne programowanie. W razie kłopotów książki i Google.
Programowanie obiektowe Czym jest obiekt? obiekt może być odwzorowaniem rzeczywistego bytu (np. Samolot, Tabela, Nazwisko, Świat), obiekt może być czymś bardzo ogólnym jak i czymś bardzo szczegółowym: Kształt, Okno, Pojazd Imię, RodzajMatrycy, ObrazKolorowy obiekt może być częścią innego obiektu (Piksel będzie częścią obiektu Obraz) obiekt w zasadzie może reprezentować wszystko jest podstawą programowania obiektowego -> wszystkie programy powinny być realizowane w ramach obiektów obiekty muszą mieć sensowne powiązania, łączyć się logicznie Nie musi mieć fizycznego odwzorowania (np. Parametry)
Programowanie strukturalne (C): przykład Jak wyglądał program w klasycznym C? Projekt: Kości - rzucamy pewną liczbą kości, każda może mieć inną liczbę ścian ponumerowanych od 1 do liczby ścian, - wczytujemy z wejścia liczbę rzutów i rzucamy kośćmi, - wypisujemy sumę wyrzuconych oczek.
Projekt Kości w C Prosta struktura jednej kości: Dodajemy funkcję losowania wyniku kości, wyniki wpisywane są do pola struktury:
Projekt Kości w C
Projekt Kości w C++ Klasa zamiast struktury: słowo kluczowe class zamiast struct o tym będzie później publiczne elementy klasy o tym też będzie później konstruktor klasy, można na razie rozumieć jako funkcję inicjalizującą elementy klasy metoda składowa klasy, można ją uruchamiać jedynie dla obiektów tej klasy wyjaśnienie, czy też definicja zadeklarowanego wyżej konstruktora klasy Kosc; innymi słowy wcześniej była tylko DEKLARACJA, to jest DEFINICJA Definicja metody klasy Kosc
Projekt Kości w C++ Deklaracja i definicja klasy z poprzedniego slajdu nie powoduje jeszcze utworzenia obiektu! jest to dopiero pewien schemat jakie pola klasy będą występować i jak się będą zachowywać. Tworzenie konkretnych obiektów odbywa się w programie (wywołanym przez main).
Projekt Kości C++ Kiedy program dotrze do tej linijki, stworzy się obiekt typu Kosc i automatycznie uruchomi się jego konstruktor: Ta liczba boków dotyczy dokładnie obiektu nowa_kosc, w innych obiektach może mieć inną wartość!
Projekt Kości C++ W pierwszej linijce programu wykona się: - stworzenie obiektu typu Kosc, - wywołanie konstruktora Kosc::Kosc(), który przypisuje liczbę boków na 5 Wywołanie kodu:
Projekt Kości C++ Proszę pamiętać! zmienne same się nie zainicjalizują to co im wpiszemy będzie wpisane, to co nie wpiszemy jest nieznane (stąd dziwne wartości typu -858993460 czy -52) Często korzystanie ze zmiennych niezainicjalizowanych kończy się błędem aplikacji. Wywołanie funkcji losujwyniknakosci() z naszej klasy: Sensowna wartość, bo funkcja przypisała dla zmiennej klasy wartość losową <1..5>, tu akurat 1
Kości w C++ Można oczywiście przypisywać ręcznie wartości pól klasy (w tym przypadku dlatego, że są one w sekcji public): Kod ASCII litery c
Kości w C++ Tak samo możemy stworzyć tablicę obiektów typu Kosc i dla każdego z obiektów wpisać inne wartości każdy obiekt jest osobnym bytem, więc może mieć różne wartości. Procedura konstruktora (Kosc::Kosc()) wywoła się tyle razy, ile jest obiektów (tutaj 10).
Kości w C++ Zamiast printf-ów i scanf-ów zwykle w C++ wywołuje się operacje strumieniowe: cin i cout, które powodują odpowiednio wczytanie/wpisanie danych z/do strumienia. Ważny jest tu kierunek strumienia - << lub >>. Jeśli chcemy wpisać do strumienia, to do niego kierujemy znaki: cout << zmienna. Jeśli wartość chcemy wpisać do zmiennej wpisujemy cin >> zmienna. Funkcje te dostosowują się do typów zmiennych. Do zatrzymywania programów nie korzystamy z system( pause ). generalnie to samo, ale preferowane endl
Kości C++ Nasza aplikacja może więc wyglądać następująco: Obiekt zamiast struktury, nie musimy już wywoływać: bo to odbywa się w konstruktorze.
Podział na pliki Często stosuje się zasadę, że jedna klasa to jeden plik.h i jeden plik.cpp o nazwie takiej jak nazwa klasy (ewentualnie nazwa klasy poprzedzona literą C). Dla naszego przykładu będziemy mieli trzy pliki: kosc.h, kosc.cpp i np. program.cpp Kosc.h - deklaracja klasy Wymuszenie faktu, że plik może być includowany jedynie raz Proszę nie zapominać o tym średniku!
Podział na pliki Kosc.cpp definicja składowych klasy Musimy znać deklaracje Klasy! Nazwy bibliotecznych plików nagłówkowych piszemy bez końcówki (bez.h).
Podział na pliki Program.cpp (czy jakkolwiek byśmy chcieli, ale musi zawierać funkcję main) Bibliotekom standardowym z C zwykle dodaje się przedrostek c i wtedy otrzymujemy bibliotekę w C++ Wymagana dla operacji strumieniowych (cin, cout) stringi będziemy stosować zamiast tablic typu char Nasz program musi znać klasę Kosc O tym będzie później wykorzystanie standardowej przestrzeni nazw C++, tutaj aby można było bezpośrednio używać cin i cout. Zwykle piszemy to na początku każdego programu w C++.
Kompilator i linker Kompilator służy do kompilacji, czyli generowania z plików.cpp plików w innym języku bliższym sprzętowi, zwykle w formie binarnej. Z każdego skompilowanego pliku.cpp otrzymujemy plik.obj lub.o. Linker służy do łączenia wszystkich plików.obj,.o i bibliotek dodatkowych w jeden, finalny program. program.cpp kosci.cpp KOMPILATOR program.obj kosci.obj LINKER program.exe
Kompilator i linker Klasyczne błędy kompilatora (w większości składniowe): Klasyczne błędy linkera (jest deklaracje jakiejś funkcji, natomiast nie ma definicji):
Tworzenie projektu w Visual Studio (Windows) - pokaz
Tworzenie projektu w g++ (Linux) Makefile Mamy 3 pliki kosc.h, kosc.cpp i naszprogram.cpp (linux jest wrażliwy na wielkość liter, proszę uważać) W naszprogram.cpp mamy maina, więc chcemy w rezultacie otrzymać skompilowany program naszprogram. MakeFile: naszprogram: kosc.o [tabulacja] g++ naszprogram.cpp kosc.o o naszprogram kosc.o: kosc.cpp [tabulacja] g++ -c kosc.cpp
Nazewnictwo funkcji, klas i zmiennych Istnieje wiele standardów nazewnictwa, ale należy się trzymać tego, który wybraliśmy, np.: Wszystko nazywamy albo w języku polskim albo angielskim, nie mieszamy. Nazwa zmiennych, funkcji i klas powinna jak najwięcej mówić o ich roli (zamiast x, xx, xxx, xxxx, y, yyy, yy1 -> liczba_znakow, liczba_iteracji ) Nazwy funkcji zaczynają się małą literą, kolejne części wielką, np. mojasupernowafunkcja. Nazwy zmiennych zaczynają się małą literą, kolejne części także małą, oddzielone podkreśleniem (np. ilosc_znakow, slowo, is_ready itd.). Nazwy klas zaczynają się wielką literą i kolejne części także (np. MojaSuperKlasa).
Goto
Inne różnice między C a C++ Możliwość przeciążania funkcji (dwie funkcję mogą się tak samo nazywać, ale mieć różne parametry przy wywołaniu zostanie wykonana pasująca do parametrów). W C++ funkcje mogą być używane zarówno wewnątrz struktur jak i klas. Klasy mają sekcje (prywatne, publiczne, chronione), struktury nie. C++ obsługuje wyjątki, C nie. Alokowanie pamięci poprzez new (zamiast malloc), zwalnianie poprzez delete (zamiast free). Nowy standard C++11 wprowadza szereg nowych możliwości.
Języki obiektowe C++, C#, Java, Python C++ jest uważany za najbardziej niskopoziomowy język obiektowy.
Witam w programowaniu obiektowym