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 14-16 Strona przedmiotu: ztv.ire.pw.edu.pl/proe (będzie uruchomiona w przyszłym tygodniu)
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 w sumie 25+25=50 punktów. Laboratorium 50 punktów Kolokwium poprawkowe na ostatnim wykładzie (wybrane kolokwium)
Zaliczenie Aby otrzymać ocenę pozytywną z przedmiotu należy: zdobyć co najmniej 25 punktów z laboratorium, zdobyć co najmniej 25 punktów z kolokwiów, zdobyć w sumie co najmniej 50 punktów.
Laboratorium Środa 16:15 Piątek 8:15 Piątek 12:15 Piątek 14:15 Czwartek 14:15 Dodatkowy termin piątek 16:15? Na zapisach pierwszeństwo mają osoby z danego roku przypisane do grupy!
Laboratorium Zadania wykonywane są samodzielnie! Zadania 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 DreamSpark) i LLVM w ios. Środowisko g++ jest dowolne (np. CodeBlocks, Eclipse). Zabronione jest oddawanie programów w DevCPP, C++ Builder, itp. Dokumentacja doxygen 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
Programowanie strukturalne: przykład 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 ilość rzutów i wypisujemy sumę wyrzuconych oczek.
Projekt Kości w C Prosta struktura 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 funkcja 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 funkcji 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ę już w głównym programie (wywołanym przez main) podobnie jak dla struktur.
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++ Poprzedzając maina deklaracją i definicją klasy Kosc 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 skoń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, czyli: Funkcje te dostosowują się do typów zmiennych. 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), czyli dla naszego przykładu będziemy mieli trzy pliki: Kosc.h - deklaracje klasy Wymuszenie faktu, że plik może być includowany jedynie raz Proszę nie zapominać o tym średniku!
Podział na pliki Kosc.cpp 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 char[1024] 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 wygenerowania z plików.cpp plików (w C++ pliki.obj lub.o) w innym języku bliższym sprzętowi, zwykle w formie binarnej, często zoptymalizowany. Z każdego pliku.cpp otrzymujemy plik.obj lub.o Linker służy do łączenia wszystkich plików.obj lub.o w finalny program. program.cpp kosci.cpp KOMPILATOR program.obj kosci.obj LINKER program.exe
Kompilator i linker Klasyczne błędy kompilatora: Klasyczne błędy linkera:
Tworzenie projektu w Visual Studio (Windows) - pokaz
Tworzenie projektu w g++ (Linux) - pokaz 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, my przyjmiemy następujące: 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 -> ilosc_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++ C zwykle podejście od ogółu do szczegółu piszemy maina i dopiero uszczegóławiamy elementy, w C++ - określamy obiekty, opisujemy je i dopiero potem łączymy je w większą aplikację. Możliwość przeciążania funkcji (2 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