Przygotować program tworzący tablicę dwuwymiarową zawierającą zestawy 10 2, 10 4, 10 6 liczb losowych zmiennoprzecinkowych. Korzystając z funkcji bibliotecznych uporządkować zawartość każdego (a) wiersza (b) kolumny. Tak uzyskane tablice wpisać do plików wynikowych. wczytujący zestawy 10 2, 10 3, 10 4, 10 5, linii z dowolnego pliku tekstowego do zmiennej reprezentującej dwuwymiarowy wektor, przy czym każdy wiersz jest wektorem utworzonym z kolejnych słów wczytanej linii. Korzystając z funkcji bibliotecznych uporządkować zawartość każdego wiersza rosnąco. Uzyskaną zawartość wpisać do plików, Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce. Tablica : pojemnik na dane identycznego typu. Dostęp do poszczególnych danych jest bezpośredni poprzez ich numer w tablicy. Dynamiczny przydział pamięci tablicy liczby Statyczny przydział pamięci dla tablicy znaków nazwa_pliku 1
Statyczny przydział pamięci : pamięć przydzielana jest przed rozpoczęciem działania programu i pozostaje przydzielona do zakończenia jego wykonywania. double statyczna_tablica2d[5][10]; // 5 wierszy o 10 elementach każdy Dynamiczny przydział pamięci : pamięć przydzielana jest w trakcie wykonywania programu co umożliwia przydzielenie pamięci o takiej wielkości jaka jest aktualna potrzebna. double **dynamiczna_tablica2d; pamięć na wskaźniki do 5 wierszy *dynamiczna_tablica = new double [5]; for (int i=0; i<5;++i) *dynamiczna_tablica[i]= new double [10]; pamięć na 10 elementów każdego wiersza Dostęp do danych jest poprzez wskazanie numeru wiersza i kolumny: statyczna_tablica 2D[3][8] =32.2; dynamiczna_tablica 2D[3][8]= statyczna_tablica 2D[3][8]; Ale w C++ : char c_slowo[10]; string s_slowo ; Czym się roznią? //Program kopiuje linia po linii zadany plik do wektora lancuchow //wprowadza obiekt klasy vector #include <string> #include <fstream> int main() { biblioteka funkcji obsługujących kontener vector vector <string> wektor_lancuchow; ifstream plik_do_czytania("wektor.cpp"); // plik do przeczytania Obiekty klasy vector tak, jak tablice zajmują ciągły obszar pamięci. Pamięć jest przydzielana dynamicznie, zazwyczaj większa niż deklarowana, aby uniknąć drogiej czasowo alokacji. Przy inicjowaniu obiektu nie trzeba podawac rozmiaru. string linia; while(getline(plik_do_czytania, linia)) wektor.push_back(line); // Dopisz linie na koncu wektora // wydrukuj dodajac numer wiersza: for(int i = 0; i < wektor_lancuchow.size(); i++) // wektor_lancuchow.size() ilośc ilementow wektora cout << i << ": " << wektor_lancuchow[i] << endl; Wektor. cpp 2
Deklaracja obiektu kontenera vector vector<type> variable_name (number_of_elements); vector<type> variable_name; Przykład: Wektor ma number_of_elements składowych zainicjowanych 0!! Wektor vector<int> stopnie (5); // deklaracja wektora z 5 int vector<double> wartosci (20,0); // deklaracja wektora z danymi typu double, o // rozmiarze 20 i wartosciach zaincjowanych 0 vector<string> nazwa; // deklaracja wektora z łańcuchami // na razie pusty (zawiera 0 łańcuchów) int main(){ vector<double> stopnie_studentow(20); // znamy ilosc studentow do obsluzenia for (vector<double>::size_type i = 0; i < 20; i++) // aby być pewnym, ze nie będzie // bledu zakresu indeksow { cout << wprowadz oceny studenta # " << i+1 << ": " ; cin >> stopnie_studentow[i]; return 0; Mało wydajne!!! Jeśli nie znamy ilości studentów, to mamy metodę dodawania do końca: push_back(). Jest tez metoda ucinania wektora od końca pop_back() Są metody do wstawiania w dowolne miejsce wektora insert() i kasowania z dowolnego miejsca remove(). 3
//kopiuj okreslona liczbe linii z okreslonej ksiązki do wektora lancuchow #include <string> #include <fstream> #define SIZE 50 void czytaj_ksiazke(ifstream &, int, vector<string> & ); int main() { char book_name[size]="thinkinginc++2vone.txt"; int ILE=22; vector<string> wektor_linii; // wektor lancuchow ifstream plik_do_czytania(book_name); if (plik_do_czytania.is_open()) czytaj_ksiazke(input, ILE, wektor_linii); czytaj.dev cout <<"wektor ma "<< wektor_linii.size() << " linii ksiazki" << book_name <<" \n" ; for(int i = 0; i < how_many; i++) cout << i+1 << ": " << wektor_linii[i] << endl; cin.get(); void czytaj_ksiazke(ifstream & wejscie, int ile_linii, vector<string> & wynik){ string line; for (int i=0; i<ile_linii; i++) { getline(wejscie, line); wynik.push_back(line); // Dopisz linie na koncu wektora Iterator: alternatywny dostęp do elementów wektora vector<int>::iterator it; Iterator trzeba zadeklarować. Iterator ten obsługuje dowolna zmienna typu vector<int> Iterator wskazuje na it-ty element wektora. vector<int> values; //... (ustalenie własnosci wektora) for (vector<int>::iterator it = values.begin(); it!= values.end(); ++it) { cout << *it << endl; // it to jakby wskaźnik do i-tego elementu wektora values 4
Przykłady standardowych funkcji z biblioteki <algorithm> działających na obiektach klasy vector sort ( values.begin(), values.end()); //sortuje wartości wektora od początku //do końca reverse (values.begin(), values.end()); // odwraca kolejność elementów w //wektorze random_shuffle (values.begin(), values.end()); // tasuje losowo wartości //wektora const int num_zeros = count (values.begin(), values.end(), 0); // zlicza ile jest 0 wśród wartości wektora Przygotuj_pliki. dev 5