Programowanie obiektowe 2010/2011
1
Laboratorium 11 STL
Zad. 1.
Napisz program, który spyta użytkownika o rozmiar tablicy, utworzy ją i wypełni kolejnymi liczbami
naturalnymi. Uwzględnij sytuację, gdy tabliac nie może być utworzona za pomocą wyjątku.
Wykorzystaj klasę vector (
http://www.cplusplus.com/reference/stl/vector/
Zad. 2.
Usuń z tablicy utworzonej w poprzednim zadaniu liczby podzielne przez 3. Zmodyfikuj odpowiednio rozmiar
tablicy.
Zad. 3.
Utwórz tablicę 20 elementową. Wypełnij tablicę liczbami losowymi. Wyprowadź te, które są podzielne przez 3.
Wykorzystaj kontener vector. Do wskazania elementu tablicy wykorzystaj iterator.
Zad. 4.
Utwórz tablicę 20 elementową. Wypełnij tablicę liczbami losowymi, tak aby były poukładane rosnąco.
Wykorzystaj kontener vector, iterator oraz funkcję insert(iterator, element), która wstawia
element na pozycji wyznaczonej iteratorem. Wyświetl wartości w tablicy.
Zad. 5.
Utwórz tablicę wyrazów. Posortuj je alfabetycznie i wyświetl na ekranie.
Zad. 6.
Utwórz tablicę wyrazów. Posortuj je według rozmiaru i wyświetl na ekranie.
Zad. 7.
Napisz program, który wczytuje tekst z pliku i zapamiętuje wyrazy w tablicy. Następnie prosi użytkownika o
podanie wyrazu i sprawdza, czy wyraz znajduje się w tekście.
Zad. 8.
Klasa queue (kolejka) (
http://www.cplusplus.com/reference/stl/queue/
) zawiera następujące funkcje:
bool empty() const - zwraca true, jeśli kolejka jest pusta
size_type size() – zwraca ilość elementów w kolejce
typ& front() - zwraca referencję do elementu znajdującego się na początku kolejki
typ& back() - zwraca referencję do elementu znajdującego się na końcu kolejki
void push(const typ& element) - wstawia element na koniec kolejki
void pop() - usuwa element z początku kolejki
Opracować funkcję LiczUjemne, której zadaniem jest zliczenie liczb ujemnych w kolejce. Sama kolejka ma
pozostać niezmieniona:
Zad. 9.
Opracuj klasę zbior_znakow, która pozwala wykonywać podstawowe operacje na znakach: dodawanie
nowego elementu do zbioru, wypisywanie liczby elementów w zbiorze, sprawdzanie, czy dany znak należy do
zbioru.
Wykorzystaj kontener STL set.
Opracuj klasę vect, która pozwala manipulować tablicami dynamicznymi liczb całkowitych. – rozmiar tablicy
jest definiowany w momencie tworzenia tablicy. Klasa powinna zawierać operatory:
[ ] – indeksowanie elementów
== - porównywanie elementów
<< - wyprowadzania, zapis cout << v wyświetla wektor v w postaci:
<liczba1, liczba2, …, liczban>
Klas vect jest klasą pochodna klasy vector.
class vect : public vector<int> {
vect(int);
friend ostream & operator << (ostream &, vect &);
};
Programowanie obiektowe 2010/2011
2
Zad. 10.
Opracuj klasę bit_array, która pozwala wykonywać działania na tablicach bitów. Rozmiar tablicy bitów jest
podawany w momencie tworzenia tablicy. Uwzględnić następujące operatory:
+=, zapis t += n oznacza ustawienie bitu n na wartość 1
-=, zapis t -= n oznacza ustawienie bitu n na wartośc 0
[], operator indeksowania, wykorzystywany tylko do pobierania wartości określonego bitu
++, zapis t++ oznacza przypisanie wartości 1 wszystkim bitom
--, zapis t-- oznacza przypisanie wartości 0 wszystkim bitom
<<, zapis cout << v wyświetla zawartość v w postaci:
<* bit1, bit2, …, bitn *>
Klasa bit_array jest klasą pochodną klasy vector<bool> :
class bit_arrray : public vector<bool> {
public:
bit_array(int=16);
int operator[] (int) const;
void operator += (int);
void operator -+ (int);
void operator ++ ();
void operator – ();
void operator ++ ();
friend ostream & operator << (ostream &, bit_array &);
};
Zadania domowe
Zad. 11.
Napisz funkcję lotto(), która pobiera liczbę pól na kuponie i liczbę wybieranych numerów. Zwraca wektor
losowo wybieranych numerów. Do potasowania liczb użyj funkcji random_shuffle() z grupy algorytmów
STL ( #include <algoritm> )
Zad. 12.
Sprawdź, że warunkiem wykorzystania algorytmu find jest istnienie w klasie, której obiekty porównujemy
operatora porównania ==.
Zad. 13.
Sprawdź, że warunkiem wykorzystania algorytmu sort jest istnienie w klasie, której obiekty porównujemy
operatora porównania <.
Zad. 14
Dany jest plik z ocenami studentów. Każdy student opisany jest za pomocą nazwiska i ocen z 5 przedmiotów.
Napisz program, który obliczy dla każdego studenta średnią ocenę i wyświetli wykaz tych ocen posortowanych
według nazwisk studetów. Do sortowania wykorzystaj funkcję sort z algorytmów STL.
Wczytywanie z pliku:
program < plik.dat
Przykład pliku:
nowak 3 3 4.5 3.5 4 4 5
kowalski 4 4
adamski 5 4.5 5 5 5 4.5 0
Funkcja główna programu:
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
Programowanie obiektowe 2010/2011
3
struct Student_info {
string nazwisko;
vector<double> oceny;
};
istream& czytaj(istream&, Student_info&);
double ocena(const Student_info& s);
bool porownaj(const Student_info&, const Student_info&);
int dodaj (const vector<double> &a);
int main() {
vector<Student_info> studenci;
Student_info daneStd;
string::size_type maxdl = 0; // dlugosc najdluzszego nazwiska
while (czytaj(cin, daneStd)) {
maxdl = max(maxdl, daneStd.nazwisko.size());
studenci.push_back(daneStd); // wstaw do wektora
}
sort(studenci.begin(), studenci.end(), porownaj);
for (vector<Student_info>::size_type i = 0; i != studenci.size(); ++i) {
cout << studenci[i].nazwisko
<< string(maxdl + 1 - studenci[i].nazwisko.size(), ' ');
double ocena_srednia = ocena(studenci[i]);
int prec = cout.precision();
cout << setprecision(3) << ocena_srednia << setprecision(prec);
cout << endl;
}
return 0;
}