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
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.
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).
rankingi
- na studiach wieczorowych: (html)
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):
- ...
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).