Zagadnienia

1. Wprowadzenie

Dodatkowe materiały do tych zajęć są udostępniane uczestnikom za pomocą platformy Moodle. http://moodle.mimuw.edu.pl

W szczególności wszystkie informacje organizacyjne są sukcesywnie zamieszczane na wydziałowym Moodle'u.

1.1. Założenia wstępne

Materiały do niniejszego wykładu składają się z dwu części:

  • podręcznika (plik wykład.pdf),

  • slajdów (plik slajdy.pdf).

Podręcznik jest zbudowany na bazie slajdów, co oznacza, że treść slajdów jest także zawarta w podręczniku, a poszczególne opisy z podręcznika komentują, uzupełniają i rozszerzają materiał przedstawiony w slajdach.

Wykład został podzielony na części tematyczne, które nie zawsze odpowiadają 90-minutowym jednostkom zajęć. Doświadczenia przy prowadzeniu zajęć według tego wykładu pozwalają zaproponować następujący podział materiału na poszczególne wykłady:

  1. Wstęp do programowania obiektowego.

  2. Wstęp do C++: historia, założenia, instrukcje proste.

  3. Wstęp do C++: instrukcje złożone.

  4. Wstęp do C++: typy.

  5. Wstęp do C++: funkcje, zarządzanie pamięcią, struktura programu.

  6. Klasy.

  7. Dziedziczenie: wstęp.

  8. Dziedziczenie: hierarchie klas, konstruktory i destruktory w hierarchiach, polimorfizm.

  9. Operatory.

  10. Klasówka.

  11. Wyjątki.

  12. Szablony.

  13. STL: wstęp.

  14. STL: dalsze omówienie.

  15. Strumienie.

Gdyby udało się wygospodarować dodatkowy wykład, to warto by było go poświęcić na pokazanie przykładowego innego języka programowania wspierającego paradygmat obiektowy (więcej na ten temat dalej w tym rozdziale).

Na początku zajęć można przeprowadzić ankietę, pozwalającą lepiej się zorientować w umiejętnościach studentów. Oto przykład takiej ankiety (chodzi o policzenie osób należących do poszczególnych kategorii, niektóre kategorie nie są rozłączne):

  • Programowałam/em w C++.

  • Programowałam/em w języku obiektowym.

  • Programowałam/em w C.

  • Programowałam/em w innym języku.

  • Nigdy nie programowałam/em.

Ten wykład zakłada, że jego uczestnicy (zgodnie z programem zajęć na wydziale MIM UW) przeszli podstawowy kurs programowania w jakimś języku wysokiego poziomu (np. w Pascalu). Nie jest natomiast wymagana znajomość języka C. Nie zakłada się tu również wcześniejszej znajomości jakiegoś języka obiektowego. Gdyby na pytanie o wcześniejsze programowanie część uczestników odpowiedziała negatywnie, przeprowadzenie niniejszych zajęć w 60 godzin byłoby wysoce niewskazane. Nauczenie się programowania w małej skali (stosowania pętli, rekurencji, wskaźników, tablic itp.) wymaga zdecydowanie więcej czasu niż pięć spotkań proponowanych w niniejszym wykładzie.

1.2. Cele wykładu

Niniejszy wykład służy osiągnięciu dwu celów.

Pierwszym celem jest nauczenie programowania obiektowego. Cel ten jest realizowany przez przedstawienie ogólnych założeń i zasad tego paradygmatu programowania, a następnie pokazanie ich realizacji w przykładowym języku programowania.

Drugim celem jest nauczenie programowania w języku C++. Wykład omawia wszystkie istotne elementy tego złożonego języka, z szablonami włącznie. Z zasady nie zawiera natomiast informacji o bibliotekach do języka C++ (choć niektóre z nich, np. Boost, są niezwykle interesujące). Jedynym wyjątkiem jest STL, ale włączenie go do wykładu wynika z tego, że STL stał się częścią biblioteki standardowej C++. Pominięte są te konstrukcje, które są typowe tylko dla C lub mało istotne (jak np. printf czy unie) lub są powszechnie uważane za niebezpieczne i przestarzałe (takie jak instrukcja skoku).

1.3. Sposób prowadzenia zajęć

Sprawy organizacyjne.

Zajęcia z programowania są z natury rzeczy zajęciami praktycznymi, więc nie da się ich przeprowadzić bez laboratorium komputerowego. Na wydziale MIM UW te zajęcia są prowadzone w formie semestralnego wykładu (15 tygodni). W każdym tygodniu odbywają się dwie godziny zajęć wykładowych i dwie laboratoryjno-ćwiczeniowych. Ta liczba godzin zajęć jest wystarczająca (choć mogłaby być większa), natomiast można też zorganizować te zajęcia z dwiema godzinami ćwiczeń tablicowych i dwiema godzinami laboratoriów w każdym tygodniu. Klasówkę lepiej zorganizować na wykładzie, przede wszystkim dlatego, że praktyka pokazuje, że do opanowania przedstawionego tu materiału potrzeba dużo ćwiczeń. Gdyby można było zwiększyć liczbę godzin przewidzianych na realizację niniejszych zajęć, to na pewno należałoby te godziny przede wszystkim przeznaczyć na dodatkowe ćwiczenia laboratoryjne.

1.4. Plan wykładu

Co będzie na wykładach.

  • Podstawy obiektowości [1].

  • Elementy C w C++ [2-4].

  • Programowanie obiektowe w C++ (klasy, dziedziczenie, metody wirtualne, szablony, …) [pozostałe wykłady].

  • Być może: Smalltalk, Delphi, Java, C# [tylko jeden z tych tematów i tylko jeśli starczy czasu].

Wykład zaczyna się od wprowadzenia ogólnych zasad programowania obiektowego. Następnie zaczynają się zajęcia z C++. Ponieważ nie zakłada się znajomości C najpierw przedstawiona jest imperatywna część C++, czyli te elementy tego języka, które nie używają obiektowości. W pewnym uproszczeniu można to nazwać elementami C w C++, ale ten wykład w ogóle nie uwzględnia tych konstrukcji języka C, które w C++ są zbędne lub nieużywane, jak na przykład funkcji printf, zamiast której od początku używany jest operator << (na początku pomijając bardziej zaawansowane zagadnienia z nim związane, jak np. sposób definiowania go).

Ponieważ pierwszym tematem tego wykładu jest programowanie obiektowe bardzo cenne byłoby pokazanie oprócz języka C++ jakiegoś innego języka obiektowego. Jest to niestety niezwykle trudne ze względu na czas - tak programowanie obiektowe jak i język C++ są bardzo obszernymi tematami, więc zwykle nie udaje się wygospodarować dodatkowego wolnego wykładu. Gdyby jednak się udało, to warto by było pokazać jeden z wymienionych języków ze względu na podane jego cechy:

  • Smalltalk: czysta obiektowość i kompletnie odmienne podejście autorów do tworzonego języka niż w C++ (inna realizacja kapsułkowania, automatyczne zarządzanie pamięcią, integracja ze środowiskiem wykonania).

  • Delphi: niezwykła łatwość tworzenia programów z interfejsami graficznymi, wykorzystanie znajomości Pascala wśród studentów, istotnie odmienna składnia niż w C++.

  • Java: inna realizacja obiektowości, automatyczne zarządzanie pamięcią, bezpłatny dostęp i powszechność implementacji i narzędzi.

  • C#: połączenie łatwości tworzenia interfejsów graficznych z Delphi i modelu obiektowości z Javy.

Oczywiście powyższa lista nie jest kompletna, kolejnymi ciekawymi kandydatami są takie języki jak Python czy Ruby.

1.5. Zaliczanie

Zaliczenie ćwiczeń:

  • obecności,

  • klasówka,

  • program zaliczeniowy.

Egzamin na koniec wykładu:

  • trzeba będzie napisać fragment programu w C++,

  • 1,5 - 2 godz.

Ponieważ część praktyczna jest niezwykle istotna na tym wykładzie, konieczne jest uwzględnienie jej w końcowej ocenie. Na wydziale MIM UW zwykle zaliczenie polega na napisaniu klasówki w okolicy połowy semestru, programu zaliczeniowego (pisanego poza zajęciami) i egzaminu. Przy czym zaliczenie programu jest konieczne dla otrzymania pozytywnej oceny końcowej. Oczywiście zamiast jednego dużego programu można wymagać wielu małych, ale kluczowe jest, by do zaliczenia tego przedmiotu było wymagane zdobycie praktycznej umiejętności programowania. Oczywiście nie jest istotne, by studenci nauczyli się na pamięć składni C++, dlatego tak na klasówce jak i na egzaminie powinni mieć dostęp do wszelkich materiałów drukowanych (notatki z zajęć, książki).

1.6. Wybór języka programowania

Czemu C++?

  • Bardzo popularny.

  • Dostępny w wielu implementacjach.

  • Łatwo dostępna literatura.

Wykład z programowania musi być oparty na jakimś narzędziu umożliwiającym praktyczne przećwiczenia nabytej wiedzy. W przypadku programowania obiektowego naturalnym wyborem jest jakiś obiektowy język programowania. W tym wykładzie wybrano jednak C++, czyli język hybrydowy. Powodem jest to, że jest to bardzo popularny język, którego implementacje istnieją dla praktycznie wszystkich platform. Istnieje wiele środowisk (IDE) do tworzenia programów w C++, a literatura, tak drukowana jak i internetowa, jest przebogata. Bardzo ważnym powodem wyboru C++ było również to, że znajomość tego języka jest bardzo pożądana na innych zajęciach prowadzonych na MIM UW.

Zastrzeżenia

  • C++ nie jest jedynym językiem obiektowym.

  • C++ nie jest najlepszym językiem obiektowym.

  • w C++ można pisać programy nie mające nic wspólnego z programowaniem obiektowym.

  • C++ jest trudnym językiem, z bardzo rozbudowaną składnią i subtelną semantyką.

Należy jednak też wskazać wady języka C++ jako narzędzia do nauki programowania obiektowego. Po pierwsze, pamiętajmy o tym, że istnieje wiele różnych języków obiektowych, nie jest więc tak, że tylko C++ stosuje się w programowaniu obiektowym. Nie jest to też najlepszy język obiektowy. Z dwóch powodów. Po pierwsze nie jest językiem czysto obiektowym (takim jak np. Smalltalk, czy praktycznie czysto obiektowym, tak jak Java czy C#), jest językiem hybrydowym. Można w nim programować tylko imperatywnie, można tylko obiektowo. Dla niektórych ta właśnie cecha będzie zresztą największą zaletą C++. Po drugie, określenie ”najlepszy język” jest z natury rzeczy mylące, gdyż fałszywie sugeruje istnienie bezwzględnej gradacji języków programowania (liniowego porządku mówiąc po ludzku), która byłaby powszechnie akceptowana. Innymi słowy - po prostu nie ma najlepszego języka programowania obiektowego, aczkolwiek zapewne wielu programistów ma swój ulubiony język programowania i uważa go za najlepszy dla siebie.

Warto też na samym początku zauważyć, że C++ nie jest językiem łatwym. Wynika to przede wszystkim ze sposobu jaki powstał - jako rozszerzenie innego, dużego i wcale nie tak prostego, języka programowania - C. C++ zawiera bardzo wiele ciekawych (i zwykle niebanalnych) mechanizmów, a konieczność pogodzenia zgodności z imperatywnym (i dość niskopoziomowym) językiem C mechanizmów programowania obiektowego spowodowała, że niektóre konstrukcje C++ nie są tak zgrabne, jak by mogły być w języku tworzonym od nowa.

Czego nie będzie na wykładach

  • Opisu poszczególnych implementacji C++.

  • Opisu poszczególnych bibliotek i rozszerzeń języka C++.

Powstało tak wiele implementacji języka C++, że nie sposób ich wszystkich wymienić na wykładzie. Co więcej, często te implementacje dostarczają pewnych specyficznych dla siebie udogodnień. A ponieważ sam język podlega rozwojowi (w chwili pisania tego tekstu ciągle oczekiwana jest nowa wersja standardu C++), często jest tak, że poszczególne implementacje różnią się między sobą stopniem zaimplementowania nowego (lub przyszłego) standardu języka. Z oczywistych powodów na tym wykładzie nie omawiamy tych zagadnień. Koncentrujemy się wyłącznie na obowiązującym standardzie C++. Oczywiście laboratorium wymaga użycia jakiejś konkretnej implementacji, ale na wykładzie nie czynimy żadnych założeń na temat tego, jaka implementacja została wybrana. Również nie omawiamy tu żadnej z licznych bibliotek stworzonych dla języka C++. Sam język C++ ze standardową biblioteką jest bardzo obszernym tematem, wymagającym poświęcenia mu całego semestru zajęć. Jednocześnie jest to bardzo bogate narzędzie, pozwalające na pisanie bardzo zaawansowanego, profesjonalnego oprogramowania.

Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.

Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.