kurs programowania w C++

Celem zajęć jest zapoznanie studentów z językiem programowania C++.

wymagane przygotowanie
  • Umiejętność programowania w języku ansi C.
  • Znajomość podstawowych struktur danych (tablice, listy, drzewa).
literatura

Literatura papierowa:

  • B.Stroustrup: Język C++. WNT, Warszawa 2000.
  • S.B.Lippman, J.Lajoie: Podstawy języka C++. WNT, Warszawa 2001.
  • C.L.Tondo, B.P.Leung: Podstawy języka C++. Ćwiczenia i rozwiązania. WNT, Warszawa 2001.
  • J.Grębosz: Symfonia C++ (tom 1, 2, 3). Oficyna Kallimach, Kraków 2002.
  • J.Grębosz: Pasja C++ (tom 1, 2). Oficyna Kallimach, Kraków 2003.
  • N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydawnictwo Helion, Gliwice 2003.

Literatura elektroniczna:

terminy

Studia wieczorowe:

  • wykład: środa 16-17 s.105
  • laboratorium: środa 17-20 s.108

powrót na początek strony


laboratorium

zasady zaliczenia przedmiotu
ogólnie:
W semestrze będzie opublikowanych (na tej stronie) kilkanaście prostych zadań do zaprogramowania. Za każde poprawnie zaprogramowane zadanie i oddane w terminie można będzie dostać określoną liczbę punktów (od 10 do 20).
terminy:
Zadania do zaprogramowania będą ogłaszane w tygodniu poprzedzającym termin ich realizacji. Zadania należy oddawać w wyznaczonym terminie. Spóźnienia nie będą tolerowane, za wyjątkiem uzasadnionych sytuacji: choroba potwierdzona zwolnieniem lekarskim, wezwanie do Sądu, itp.
prezentacje:
Programy należy prezentować osobiście w czasie pracowni (proszę nie wysyłać programów pocztą elektroniczną, ani nie przekazywać ich poprzez kolegów czy koleżanki). W trakcie prezentacji programu trzeba się liczyć z pytamiami dotyczącymi zadania: metoda rozwiązania, zastosowane konstrukcje językowe, wykorzystane klasy/obiekty z STL, itp.
oceny:
Aby zaliczyć laboratorium na ocenę dostateczną trzeba do końca semestru zdobyć 50% z wszystkich możliwych do uzyskania punktów; na ocenę bardzo dobra trzba będzie zgromadzić 90% punktów; oceny pośrednie pozostją w liniowej zależności od przedstawionych wymagań granicznych.
listy zadań
7.03.2007 (zadanie 1): posortowana lista
Napisz program, który wczyta ze standardowego wejścia cin ciąg liczb zespolonych i umieści je na liście jedno- lub dwukierunkowej w porządku rosnącym względem ich modułów. Na końcu program powinien wypisać na standardowym wyjściu cout wszystkie liczby w takiej kolejności w jakiej zostały umieszczone na liście.
Wskazówki:
1. Program główny powinien po sobie posprzątać, czyli usunąć z pamięci wolnej (sterta) wszystkie utworzone w niej obiekty.
2. Klasa LZ dla liczb zespolonych powinna mieć metodę wyliczającą jej moduł.
3. W klasie Wezel reprezentującym pojedynczy węzeł w liście powinien być zdefiniowany destruktor usuwający całą listę.
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.
Przypomnienie: Moduł liczby zespolonej z=(a,b) to odległość kartezjańska od punktu zespolonego (0,0), czyli |z|=pierwiastek(a2+b2).
Dane wejściowe:
    n
    re1 im1
    re2 im2
    ...
    ren imn 
14.03.2007 (zadanie 2): sygnały świetlne
Dwaj młodociani marynarze mieszkający w dużym nadmorskim mieście chcieli potrenować wysyłanie sygnałów świetlnych alfabetem Morse'a. O umówionej godzinie po zmierzchu wyszli więc na dachy swoich domów z latarkami, aby powysyłać do siebie komunikaty (pierwszy marynarz: zakupilem odpowiednie napoje ale mam tesciowa na glowie --../.-/-.-/..-/.--./../.-.././--/ ---/-../.--./---/.--/.././-../-./.././ -./.-/.--./---/.---/./ .-/.-.././ --/.-/--/ -/./.../-.-./../---/.--/.-/ -./.-/ --./.-../---/.--/.././, drugi marynarz: mecz ogladamy u mnie bo wyslalem zone na zakupy --/./-.-./--../ ---/--./.-../.-/-../.-/--/-.--/ ..-/ --/-./.././ -.../---/ .--/-.--/.../.-../.-/.-.././--/ --../---/-././ -./.-/ --../.-/-.-/..-/.--./-.--/). Niestety nie mogli się oni umówić, bo okazało się, że na linii prostej łączącej dachy ich domów znajdują się przeszkody i nie chodzi tu o żony i teściowe lecz o inne budynki. Swoje latarki muszą więc umieścić na specjalnych wysięgnikach, tak aby strumień światła mógł dotrzeć z wysięgnika na jednym dachu do powierzchni drugiego i na odwrót.
Napisz program, który pozwoli obliczyć im jak długie wysięgniki powinni oni zainstalować. Dane do programu, to ciąg informacji o przeszkodach, czyli współrzędne i wysokości przeszkód, przy czym współrzędne to ich odległości od domu pierwszego marynarza w kierunku domu drugiego z nich (wszystkie przeszkody leżą na prostej łączącej domy marynarzy) uporządkowane w kolejności rosnącej; dodatkowo jako pierwsza i ostatnia przeszkoda są podane domy obu marynarzy.
Dane wejściowe:
    n
    0 wys0
    odl1 wys1
    ...
    odln-2 wysn-2
    odln-1 wysn-1 
Wskazówki:
1. Najwyższa przeszkoda widoczna z dachu na którym stoi marynarz to taka, w której stosunek różnicy wysokości do odległości jest największy. Potem z twierdzenia Talesa można obliczyć długość wysięgnika na przeciwległym dachu.
2. Program powinien przechowywać dane na liście dwukierunkowej. Można skorzystać listy z poprzedniego zadania, ale należy ją trochę zmodyfikować: należy dopisać operację wstawiania zaczynając od końca listy, przy wstawianiu przekazuj do metody referencję do wskaźnika na dany element, zmień pola z danymi (odległość, wysokość, współczynnik kątowy dla pierwszej i ostatniej przeszkody, czyli tangensy dla domów marynarzy).
3. Do wyznaczania elementu maksymalnego (względem wartości tangensów) dopisz osobne procedury.
4. Metody wstawiające i szukające maksimów mają być rekurencyjne.
5. Program główny powinien po sobie posprzątać, czyli usunąć z pamięci wolnej (sterta) wszystkie utworzone w niej obiekty.
6. W klasie Wezel reprezentującym pojedynczy węzeł w liście powinien być zdefiniowany destruktor usuwający całą listę.
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

21.03.2007 (zadanie 3): sito Eratostenesa
Napisz program, który wczyta ze standardowego wejścia ciąg liczb (aż do napotkania zera) i dla każdej z nich odpowie na standardowym wyjściu czy jest ona pierwsza czy nie.
Do rozwiązania tego zadania wykorzystaj sito Eratostenesa, które powinno być tablicą statyczną static int *sito w klasie Matematyka; elementami tej tablicy mogą być liczby całkowite będące najmniejszymi podzielnikami pierwszymi indeksów; rozmiar tablicy ma określać statyczna stała całkowita static const int N; zastanów się jak zainicjalizować tą tablicę.
Wskazówki:
1. Program ma udzielać odpowiedzi wypisując rozkład liczby na czynniki pierwsze.
2. Program powinien udzielać poprawnych odpowiedzi dla wszystkich liczb typu int bez względu na rozmiar sita Eratostenesa.
Komentarz: Jeśli w tablicy będziemy trzymali najmniejsze podzielniki pierwsze indeksów, to w tablicy rozmiaru 20 powinny się znaleźć następujące wartośći: 1, 1, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19 (dwie pierwsze wartości związane z indeksami 0 i 1 są neutralnymi jedynkami).
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

28.03.2007 (zadanie 4): kalendarz gregoriański
Zdefiniuj klasę Data do przechowywania daty w obowiązującym obecnie kalendarzu gregoriańskim. Przyjmij, że pierwszym dniem w tym kalendarzu jest 15 października 1582 roku, czyli dzień w którym papież Grzegorz XIII zarządził zmianę kalendarza (poprzednio obowiązywał kalendarz juliański). W kalendarzu tym ustalono nowy sposób rozstrzygania, czy rok jest przestępny czy nie (czy luty ma 29 czy 28 dni):
  • rok jest zwykły jeśli nie dzieli się przez 4, a przestępny jeśli dzieli się przez 4, chyba że...
  • dzieli się przez 100, wtedy jest rokiem zwykłym, za wyjątkiem...
  • lat podzielnych przez 400, które zawsze są przestępne.
Zaprojektuj tą klasę tak, aby publiczne pola z danymi były stałe, a więc obiekt takiej klasy można zainicjalizować tylko raz i nie można go będzie potem modyfikować. Dostarcz chronionej metody wbudowanej do sprawdzania, czy rok jest przestępny, i wykorzystaj ją w prywatnej metodzie badającej poprawność daty (wywoływanej w konstruktorze). Konstruktor domyślny powinien pobierać bieżącą datę systemową. W definicji klasy umieść także prywatną metodę do obliczania ile dni upłunęło od początkowej daty w kalendarzu gregoriańskim. Zdefiniuj publiczną metodę statyczną do obliczania jaka jest różnica (wyrażona w dniach) pomiędzy dwiema datami - parametrem tej metody niech będą stałe referencje do dat. Wykorzystaj do tego celu statyczną tablicę z ilością dni, które upłynęły od początku roku do końca danego miesiąca:
    static int Data::dniodpoczroku[2][13] = {
        {0,31,59,90,120,151,181,212,243,273,304,334,365}, // lata zwykłe
        {0,31,60,91,121,152,182,213,244,274,305,335,366} // lata przestępne
    }; 
Program główny ma wczytać ze standardowego wejścia jakąś datę i obliczyć ile dni upłynęło od tej daty do dzisiaj (jak podana data będzie się znajdowała w przyszłości, to wynik powinien być ujemny) oraz jaki to był (będzie) dzień tygodnia.
Wskazówki:
1. Klasa Data powinna być wyposażona w metodę podającą dzień tygodnia (typ wyliczeniowy DzinTygodnia).
2. W klasie Data powinna znaleźć się metoda opis() mająca służyć do prezentacji daty w postaci łańcucha znakowego typu string (na przykład: "sroda, 28 marca 2007").
Pytanie retoryczne: Zastanów się, czy potrzebny będzie konstruktor. A co z destruktorem?
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

4.04.2007 (zadanie 5): stos i kolejka
Zaprojektuj klasy stos (dziedziczącą po klasie lista) i kolejka (dziedziczącą po klasie stos), które będą adoptowały listę do operacji FIFO na kolejce i LIFO na stosie. Napisz krótki program testowy sprawdzający działanie twoich struktur danych (dane do programu odczytaj z pliku).
Komentarz: Wykorzystaj zaprogramowaną wcześniej klasę lista do zarządzania listą jednokierunkową zbudowaną na obiektach klasy wewnętrznej wezel (w licie przechowuj wartrości całkowite).
Wskazówka: Zastosuj niepubliczne dziedziczenie.
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

11.04.2007: odbieram zaległe zadania
Nie zadaję żadnego nowego zadania, aby nie zepsuć wesołych Świąt i nie wysuszyć mokrego Dyngusa!

18.04.2007 (zadanie 6): tablica bitów
Zdefiniuj klasę TabBit reprezentującą tablicę bitów. Najprościej implementuje się taką strukturę danych za pomocą zwykłej tablicy typu int[], przeznaczając na zapamiętanie bitu całe słowo. Jest to rozwiązanie proste, ale bardzo rozrzutne co do zużywanej pamięci - tablica bitów pamiętana w ten sposób jest kilkadziesiąt razy obszerniejsza niż potrzeba. A więc takie rozwiązanie nas nie satysfakcjonuje, szczególnie gdy trzeba posługiwać się w programie wieloma dużymi tablicami (chodzi o tablice zawierające tysiące a nawet miliony bitów).
Należy zatem tak zaprojektować tablice bitowe, aby przydzielona pamięć była wykorzystywana co do bitu (modulo rozmiar słowa). W klasie TabBit zdefiniuj operator indeksowania, który umożliwiałby zarówno czytanie z tablicy, jak również pisanie do niej. Oto fragment kodu, który powinien się skompilować i uruchomić:
    TabBit t(72);          // tablica 72 bitow
    t[0] = 1;              // ustawienie bitu 0-ego bitu na 1
    t[71] = true;          // ustawienie bitu 71-go bitu na 1
    bool b = t[0];         // odczytanie bitu 0-ego
    t[40] = b;             // ustawienie bitu 40-go
    t[36] = t[38] = t[71]; // przepisanie bitu 71-go do bitow 38-go i 36-go
    cout<<t<<endl;         // wysietlenie zawartosci tablicy bitow na ekranie 
Ponieważ nie można zaadresować pojedynczego bitu (a tym samym nie można ustamowić referencji do niego), więc trzeba się posłużyć specjalną techniką umożliwiającą dostęp do pojedynczego bitu w tablicy. Robi się to poprzez zastosowanie obiektów niewidocznej dla programisty klasy pomocniczej, umiejącej odczytać i zapisać pojedynczy bit:
    class TabBit
    {
        typedef unsigned long long slowo; // komorka w tablicy
        static int rozmiarSlowa; // rozmiar slowa w bitach
        friend istream & operator >> (istream &we, TabBit &tb);
        friend ostream & operator << (ostream &wy, const TabBit &tb);
        class Ref; // klasa pomocnicza dla operatora indeksowania
        class Zakres {}; // klasa wyjatku
    protected:
        slowo *tab;
        int dl;
    private:
        void _TabBit (const TabBit &tb);
    public:
        explicit TabBit (int rozm);
        TabBit (const TabBit &tb);
        ~TabBit ();
    public:
        TabBit & operator = (const TabBit &tb);
    private:
        bool czytaj (int i) const;
        bool pisz (int i, bool b);
    public:
        bool operator[] (int i) const; // operator indeksowania dla czytania
        Ref operator[] (int i); // operator indeksowania dla pisania
        int rozmiar () const { return dl; } // rozmiar tablicy
    }; 
Klasa Ref jest klasą pomocniczą, która umożliwia zaimplementowanie operatora indeksowania rozróżniającego czytanie i pisanie w klasie TabBit - zastanów się jak powinna ona być zaimplementowana. Do kompletu podefiniuj operatory koniunkcji, alternatywy i alternatywy wykluczającej (operatory zaprzyjaźnione) operujące na tablicach bitów, oraz operatory przypisania połączone z wymienionymi operatorami bitowymi. Nie zapomnij też o operatorach czytania ze strumienia wejściowego i pisania do strumienia wyjściowego.
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

25.04.2007 (zadanie 7): długie liczby
Zdefiniuj klasę LiczbaCalk reprezentującą liczbę całkowitą o nieograniczonym zakresie. Liczby te powinny być kodowane binarnie w systemie uzupełnienia dwójkowego U2. Do pamiętania długich liczb całkowitych wykorzystaj klasę TabBit z poprzedniego zadania.
    class LiczbaCalk
    {
    protected:
        TabBit *bity;
    public:
        LiczbaCalk ();
        LiczbaCalk (int n);
        LiczbaCalk (const LiczbaCalk &lc);
        ~LiczbaCalk ();
        LiczbaCalk & operator= (const LiczbaCalk &lc);
    // ...
    }; 
Klasa LiczbaCalk powinna być wyposażona w konstruktor domyślny (wartość domyślna nowoutworzonej liczby ma wynosić 0), konstruktor inicjalizowany wartością typu int, konstruktor kopiujący, destruktor i operator przypisania kopiującego. W klasie LiczbaCalk zdefiniuj operatory umożliwiające wykonywanie obliczeń arytmetycznych (dodawanie, odejmowanie, mnożenie, dzielenie, modulo). Trzeba przy tym pamiętać, że klasa reprezentyjąca długą liczbę może być dość duża i nie powinno się (o ile to możliwe) przekazywać jej przez wartość za pomocą stosu. Można więc zdefiniować po dwie wersje każdego operatora arytmetycznego: jeden jako funkcja zaprzyjaźniona a drugi jako składowy operator przypisania.
    class LiczbaCalk
    {
    // ...
    public:
        friend istream operator>> (istream &we, LiczbaCalk &lc);
        friend ostream operator<< (ostream &wy, const LiczbaCalk &lc);
    public:
       friend LiczbaCalk operator+ (const LiczbaCalk &ll, const LiczbaCalk &lp);
       LiczbaCalk & operator+= (const LiczbaCalk &lp);
    // ...
    }; 
Do obliczeń arytmetycznych mogą ci się przydać operatory bitowe wraz z przesunięciami. Zaprogramuj także zaprzyjaźnione operatory do czytania ze stumienia wejściowego operator>> i pisania do strumienia wyjściowego operator<< długich liczb całkowitych w postaci dziesiętnej.
Na koniec napisz program, który obliczy i wypisze na standardowym wyjściu 100!, wykorzystując do tego celu długie liczby całkowite.
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

23.05.2007 (zadanie 8): bezpieczne pliki
Zaimplementuj klasy opakowujące pliki: PlikWejsciowy dla plików tekstowych do czytania ifstream oraz PlikWyjsciowy dla plików tekstowych do pisania ofstream. Definiując obie klasy posłuż się techniką zdobywania zasobów poprzez inicjalizację: pliki należy otwierać w konstruktorze (jeśli okaże się to nieżmożliwe zgłoś wyjątek) i zamykać w destruktorze. Podczas inicjalizacji plików zadbaj o to, by ustawienie flagi ios_base::badbit lub ios_base::failbit powodowało automatyczne zgłoszenie wyjątku ios_base::failure.
Klasa PlikWejsciowy powinna umieć odczytać całą linię danych (wyciągając ze strumienia znak przejścia do nowej linii bez umieszczania go w wyniku) zwracającą obiekt typu string, a także liczby całkowitą int i rzeczywistą double z pominięciem początkowych białych znaków. Klasa PlikWyjsciowy powinna umieć zapisać obiekt typu string, pojedynczy znak char, liczbę całkowitą int, liczbę rzeczywistą double, a także znak przejścia do nowej linii. W klasie PlikWejsciowy zdefiniuj zaprzyjaźnone operatory do czytania operator>> a w klasie PlikWyjsciowy operatory do pisania operator<<.
Następnie napisz program, który przetestuje zachowanie się obiektów obu klas (również w~sytuacjach wyjątkowych) - program powinien odczytać z pliku ciąg liczb całkowitych i zapisać go w odwrotnej kolejności do tego samego pliku tekstowego (z początku nie wiadomo ile liczb jest zapisanych w pliku z danymi).
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

6.06.2007 (zadanie 9): manipulatory
Zdefiniuj własny manipulator bezparametrowy clearline dla strumienia wejściowego, który będzie usuwał wszystkie znaki, aż do napotkania znaku przejścia do nowej linii (ten znak także należy usunąć ze strumienia) lub znaku końca pliku. Zdefiniuj również manipulator z parametrem ignore (int x), którego zadaniem będzie pominięcie x znaków ze strumienia wejściowego, chyba że wcześniej zostanie wyjęty znak przejścia do nowej linii lub stumień się skończy.
Dla strumienia wyjściowego zdefiniuj bezparametrowy manipulator colon, który wypisze dwukropek i odstęp. Zdefiniuj także manipulator z parametrem index (int x), który wypisze liczbę x w nawiasach kwadratowych.
Na koniec napisz program testujący zdefiniowane przez ciebie manipulatory (odczytaj po pierwszym wyrazie z każdej linii, wypisz zawartość tablicy, itp).
Uwaga: Podziel program na pliki nagłówkowe i źródłowe.

20.06.2007 (zadanie 10): szablony
(1) Zdefiniuj szablon funkcji cmp(T,T) do porównywania obiektów tych samych klas za pomocą operatora <= (funkcja ma zwracać 0 gdy obiekty są równe, albo -1 lub 1 gdy pierwszy obiekt jest odpowiednio większy lub mniejszy od drugiego). Zdefiniuj też sablon funkcji exch(T&,T&) do zamiany wartości między obiektami tych samych klas za pomocą operatora =. Na koniec zdefiniuj szablon funkcji sortującej dane umieszczone w tablicy sort(T[],int) tylko za pomocą porównań i zamian. Przetestuj swoją metodę sortowania na tablicy liczb rzeczywistych double[] oraz na tablicy łańcuchów znakowych char*[] (potrzebna będzie specjalizowana wersja funkcji porównującej łańcuchy znakowe).
(2) Zdefiniuj szablon klasy dla stosu (może też być kolejka). W stosie należy przechowywać obiekty typu określonego parametrem szablonu. Napisz też wersję specjalizowaną stosu dla wskaźników i referencji (w tej ostatniej specjalizacji nie będzie kopiowania pamiętanych wartości przy inicjalizacji).
Uwaga: Podziel program na pliki nagłówkowe i źródłowe. Wszystkie definicje dotyczące szablonów umieść w plikach nagłówkowych.

5.07.2007 (zadanie dodatkowe): kalkulator ONP
Napisz program interaktywnego kalkulatora. Kalkulator ten powinien interpretować i obliczać wyrażenia zapisane w systemie ONP. Program ma odczytywać polecenia ze standardowego wejścia cin, wykonywać obliczenia i ewentualnie wypisywać wyniki na standardowe wyjście cout. Wszelkie komentarze i uwagi czynione przez program mają być wysyłane na standardowe wyjście dla błędów clog. Program powinien rozpoznawać trzy rodzaje poleceń:
set zm = wyrażenieONP
Utworzenie nowej zmiennej zm i przypisanie jej warości obliczonego wyrażenia wyrażenieONP. Jeśli zmienna zm była zdefiniowana już wcześniej, to należy tylko zmodyfikować przypisaną do niej wartość. Zmienne pamiętaj w kolekcji asocjacyjnej dostępnej w STL'u (na przykład map albo hash_map).
print wyrażenieONP
Obliczenie wartości wyrażenia wyrażenieONP i wypisanie jej na standardowym wyjściu. Wyrażenie będzie zapisane w postaci postfiksowej (Odwrotna Notacja Polska). Czytając kolejne tokeny wyrażenia program powinien je zamieniać na elementy obliczalne (zaprojektuj kompletną hierarchię klas związaną zliterałami, zmiennymi i funkcjami) i umieszczać w kolejce (standardowa kolekcja queue). Przy obliczaniu wartości wyrażenia należy się posłużyć stosem (standardowa kolekcja stack).
clear
Usunięcie wszystkich zminnych zapamiętanych do tej pory w kolekcji asocjacyjnej. Do do kolekcji tej mogą trafiać tylko zmienne o nazwach różnych od nazw zaprogramowanych przez ciebie i zapamiętanych w innej kolekcji asocjacyjnej przeznaczonej dla funkcji i stałych (pi, e, abs, floor, ceil, frac, min, max, sin, cos, atan, acot, log, ln, power, exp, 3--argumentowa funkcja if i inne).
Po wydaniu każdego polecenia, jeśli było ono poprawnie zapisane, to należy je powtórzyć na standardowym wyjściu dla błedów, a jeśli było niepoprawne (nieznana komenda, źle sformułowane wyrażenie, błędna nazwa, błędny literał stałopozycyjny, czy nierozpoznany operator, funkcja lub zmienna) to należy wypisać stosowny komunikat o błędzie.
rankingi
  • na studiach wieczorowych: (html)

powrót na początek strony


wykład

28.02.2007 (klasy):
  • Podstawowe cechy obiektowego języka programowania C++.
  • Definicja klasy; deklarowanie obiektów danej klasy.
  • Odwołania do składowych w obiekcie; wskaźnik this.
  • Pola i metody w klasie; definiowanie metod poza klasą.
  • Konstruktory i destruktory.
  • Tworzenie (operator new) i usuwanie (operator delete) obiektów ze sterty.
  • Standardowe wejście i wyjście (cin, cout, clog, cerr); podstawowe manipulatory.
  • Łańcuchy znakowe (string); dodawanie jako operator konkatenacji.
7.03.2007 (referencje, obiekty stałe):
  • Deklarowanie obiektów stałych z deklaratorem const.
  • Wskaźniki do stałych i stałe wskaźniki.
  • Deklarowanie referencji do obiektów.
  • Referencje do stałych obiektów jako argumenty funkcji.
14.03.2007 (przeciążanie, składowe statyczne):
  • Funkcje i metody wbudowane (inline).
  • Przeciążanie funkcji, metod i konstruktorów.
  • Parametry domyślne.
  • Konstruktor domyślny (bezargumentowy) i kopiujący.
  • Deklarowanie składowych statycznych.
  • Inicjalizacja pól statycznych.
  • Ograniczenia w metodach statycznych.
  • Oodołania do składowych statycznych.
21.03.2007 (kompozycja):
  • Klasy zagnieżdżone.
  • Obiekty składowe.
  • Lista inicjalizacyjna.
  • Składowe stałe i ich inicjalizacja.
  • Metody stałe i ich wykorzystanie w stałych obiektach.
  • Pola modyfikowalne (mutable).
28.03.2007 (dziedziczenie):
  • Istota dziedziczenia: projektowanie hierarchii klas, dostosowanie gotowej klasy do własnych potrzeb.
  • Definiowanie dziedziczenia; klasa bazowa i pochodna.
  • Zakresy widzialności składowych i dostęp do składników klasy bazowej w klasie pochodnej.
  • Dziedziczenie publiczne i niepubliczne; wybiórcze udostępnianie za pomocą deklaracji using.
  • Czego się nie dziedziczy (składowych prywatnych, konstruktorów, destruktora, przypisania kopiującego)?
  • Inicjalizacja i destrukcja obiektów w warunkach dziedziczenia.
  • Wskaźnikiem do klasy bazowej można pokazywać na obiekty klas pochodnych.
4.04.2007 (operatory):
  • Definiowanie przeciążania operatorów jako metod składowych i jako funkcji globalnych.
  • Funkcje i operatory zaprzyjaźnione.
  • Operatory których nie można przeciążać (operator zakresu ::, operator dostępu do składowych . i operator warunkowy ?:).
  • Operatory predefiniowane (przypisanie =, uzyskanie adresu &, sekwencja obliczeń , i tworzenie i usuwanie obiektów w pamięci new/new[] i delete/delete[]).
  • Jednoargumentowe operatory pre- i post- inkrementacji/dekrementacji.
  • Operator przypisania.
  • Operator indeksowania.
  • Operator wywołania funkcji.
11.04.2007 (polimorfizm):
  • Definiowanie metod wirtualnych.
  • Działanie polimorfizmu w przypadku dziedziczenia.
  • Wczesne i późne wiązanie.
  • Destruktory w klasach polimorficznych.
  • Klasy abstarkcyjne i metody czysto wirtualne.
18.04.2007 (wyjątki):
  • Zgłaszanie wyjątków (instrukcja throw) i ich wyłapywanie (instrukcja try-catch).
  • Dopasowywanie wyjątków w blokach catch.
  • Wyjątki standardowe i ich hierarchia w STL.
  • Definiowanie własnych wyjątków.
  • Specyfikacja wyjątków.
  • Specyfikacja wyjątków w metodach polimorficznych.
  • Wyjątki zgłaszane w kontruktorach.
  • W destruktorach nie wolno zgłaszać wyjątków.
25.04.2007 (zdobywanie zasobów poprzez inicjalizację):
  • Mechanizm lotu wyjątku (zwijanie stosu).
  • Zdobywanie zasobów poprzez inicjalizację.
  • Klasa auto_ptr.
9.05.2007 (strumienie):
  • Standardowe strumienie wejścia/wyjścia cin, cout, clog i cerr.
  • operatory << i >> do formatowanego wstawiania i wyjmowania ze strumienia.
  • Flagi stanu formatowania.
16.05.2007 (strumienie):
  • Obsługa błędów w strumieniach.
  • Strumienie związane z plikami ifstream i ofstream.
  • Strumienie związane z łańcuchami znakowymi istringstream i ostringstream.
  • Nieformatowane operacje wejścia/wyjścia.
23.05.2007 (manipulatory):
  • ...

powrót na początek strony


ogłoszenia

25.06.2007
Dodatkowy program bedę odbierał w czwartek 5 lipca o godzinie 16:15-18:00.
18.06.2007
Konsultacje połączone z zaliczeniem kursu odbędą się w poniedziałek 25 czerwca o godzinie 17:15-19:00.
7.03.2007
Na następnych zajęciach (14.03.2007) wyjątkowo bedę sprawdzał dzisiejszy program (posortowana lista).
28.02.2007
Dzisiejsze zajęcia z kursu C++ będą się składać z 3 godzin wykładu (bez laboratorium).

powrót na początek strony