++
) i dwukierunkowy (operator ++
i --
)+, +=, -, -=, []. <, >, <=, >=
rbegin()
i rend()
for
zakresowa od C++11int tab [] = {42, 3, 5}; for(auto x: tab) { cout << x << endl; } for(auto &x: tab) { x++; }
Dodaj do szablonu klasy Wektor
z poprzednich zajęć (plik wektor.h):
Wektor::iterator
, który udostępnia operator it++
przesuwający iterator do następnego elementu sekwencji i operator *it
wydobywający wskazywany element begin()
i end()
zwracające iterator (bezpośredniego dostępu) pokazujący odpowiednio na pierwszy element oraz na pozycję za ostatnim elementemtypedef
lub using
.
Napisz program, który przetestuje działanie iteratorów w klasie Wektor
:
for
zakresowejPrzykład:
try { int a=1; throw a; } catch(int b) { // wyjatek typu int } catch(...) { // wszystkie wyjatki }
W pliku nagłówkowym wyjatki.h
zadeklaruj klasy wyjątków: Wyjatek
, ZlyIndeksWektora
i BrakPamieci
i dodaj do szablonu klasy Wektor polecenia rzucające obiekty tych klas w razie zaistnienia sytuacji wyjątkowych.
Wyjatek
, stanowi ogólną klasę wyjątków po której będą dziedziczyły wszystkie inne typy wyjątków. Klasa ta zawiera:throw Wyjatek(„Pojawil sie nieoczekiwany blad!”)
. Komunikat()
zwracająca tekst komunikatu. ZlyIndeksWektora
dziedziczy po klasie Wyjatek
. BrakPamieci
dziedziczy po klasie Wyjątek
. new
w przypadku wystąpienia błędu może także rzucać wyjątek. Można temu zapobiec wymuszając aby w przypadku błędu operator ten zwracał NULL. #include <new.h> int *a = new(std::nothrow) int[1]; if(a==0) throw "Brak pamieci";
BrakPamieci
i ZlyIndeksWektora
dziedziczą po klasie Wyjatek
, więc:Komunikat()
zwracając tekst odpowiednio sformatowany z zależności od sytuacji (od typu obiektu).
Napisz program, który wywoła sytuacje wyjątkowe dla klasy Wektor
i spowoduje rzucenie wyjątków ZlyIndeksWektora
oraz BrakPamieci
. Złap wyjątki i wypisz komunikat błedu.
Napisz program, który dokona posortowania liczb i wyrazów podanych przez użytkownika. Dane wejściowe (liczby i wyrazy) podaje użytkownik w konsoli, wpisując kolejne linie tekstu, przy czym każda linia może zawierać dowolny ciąg znaków. Jeżeli podana linia tekstu zawiera poprawnie wyrażona liczbę rzeczywistą to wówczas traktowana jest jak wartość numeryczna a nie jako łańcuch znakowy. Napis zawierający liczbę zamieniany jest na wartość numeryczną za pomocą funkcji stod(). Jeżeli operacja zakończy sie powodzeniem, wówczas liczba umieszczana jest w kolekcji z liczbami. Jeżeli operacja się nie powiedzie, gdyż napis nie zawiera liczby (funkcja w tym wypadku rzuca wyjątek std::invalid_argument
) to analizowana linia tekstu dodawana jest do kolekcji napisów. Jeżeli podana liczba wykracza poza zakres typu double
(funkcja w tym wypadku rzuca wyjątek std::out_of_range
) to linia jest ignorowana (nie jest traktowana ani jak liczba ani jak napis). Program kończy wczytywanie danych, gdy użytkownik wprowadzi pustą linię (tj. wczytany napis będzie miał długość 0). Po tym wypisywana jest sekwencja wszystkich rozpoznanych liczb w porządku rosnących wartości a nastepnie wypisywana jest sekwencja wszystkich pozostałych linii tekstu w porządku alfabetycznym. Do posortowania obu sekwencji wykorzystaj funkcję sort() z biblioteki STL.
Przykład działania programu:
zxcvbn 1234 asdf 42 3.14 qwerty 10e100000 10e2 Liczby: 3.14 42 1000 1234 Napisy: asdf qwerty zxcvbn
Rozwiązanie w postaci plików nagłówkowych *.h
i źródłowych *.cpp
umieść w Moodle Zadanie 9