Programowanie obiektowe 2010/2011
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 tablica nie może być utworzona – wykorzystaj do tego wyjątek.
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.
Zad. 10.
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 &);
};
1
Programowanie obiektowe 2010/2011
Zad. 11.
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. 12.
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. 13.
Sprawdź, że warunkiem wykorzystania algorytmu find jest istnienie w klasie, której obiekty porównujemy operatora porównania ==.
Zad. 14.
Sprawdź, że warunkiem wykorzystania algorytmu sort jest istnienie w klasie, której obiekty porównujemy operatora porównania <.
Zad. 15
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;
2
Programowanie obiektowe 2010/2011
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;
}
3