Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <cctype>
- using namespace std;
- template <class T> //внутри вмсето т будет подставлент тип данных
- struct Vector
- {
- T* arr; //создаем указатель на массив
- int N = 0; //индекс нулевой
- int maxSize; //макс размер вектора
- Vector(int n) //ф-ия вектор которая принимает число н - макс размер вектора
- {
- maxSize = n;
- arr = new T[maxSize]; //выделение памяти(ячеек) под массив
- }
- void push_back(T data) //ф-ия вставки элемента
- {
- /*Заносит элемент в массив
- Если места нет, то создаёт вместо этого массива новый,
- в два раза больше предыдущего, и
- заносит все, что было в старом, в него*/
- if (N == maxSize - 1)
- {
- T* temp = arr;
- arr = new T[maxSize *= 2];
- for (int i = 0; i < N; i++)
- arr[i] = temp[i];
- delete[] temp;
- }
- arr[N++] = data;
- }
- int load(string filename) //ф-ия загрузки файла которая принимает аргумент имя файла
- {
- string data;
- ifstream file(filename); // создаем объект класса ifstream
- if (!file) //если нету файла
- {
- cout << "error\n"; //выводит ошибку
- return 0;
- }
- while (file >> data) //пока не считало все
- {
- for (int i = data.length()-1; i >= 0; i--)
- {
- if (!isalpha(data[i])) //проверка data[i] является ли он строчной или прописной буквой алфавита.
- {
- data.pop_back(); //удаляет последний элемент
- }
- }
- for (int i = 0; i < data.length(); i++)
- data[i] = tolower(data[i]); //преобразование прописных букв в строчные
- if (data.length() > 0)
- push_back(data); //добавление элемента в конец вектора
- }
- return 1;
- }
- void q_sort()
- {
- recQSort(0, N - 1);
- }
- //сортирует слова по алфавиту
- void recQSort(int left, int right) //функция быстрой сортировки
- {
- if (right - left <= 0) //если нету слов
- return;
- else
- {
- T pivot = arr[right]; //присваиваем последий элемент(крайнюю границу)
- int leftPtr = left - 1, rightPtr = right;
- while (true)
- {
- while (arr[++leftPtr] < pivot);
- while (rightPtr > 0 && arr[--rightPtr] > pivot);
- if (leftPtr >= rightPtr)
- break;
- else
- {
- T temp = arr[leftPtr];
- arr[leftPtr] = arr[rightPtr];
- arr[rightPtr] = temp;
- }
- }
- T temp = arr[leftPtr];
- arr[leftPtr] = arr[right];
- arr[right] = temp;
- int partitition = leftPtr;
- recQSort(left, partitition - 1);
- recQSort(partitition + 1, right);
- }
- }
- void freq_anal() //сколько раз слово встречается в тексте
- {
- int ptr = 0, counter = 1;
- while (ptr < N) //пока переменная меньше макс ращмера вектора
- {
- if (arr[ptr] != arr[ptr + 1]) //если слова не одинаковы
- {
- cout << arr[ptr] << " - " << counter << '\n'; //выводит что слово встречается один раз в тексте
- counter = 0;
- }
- ptr++;
- counter++;
- }
- }
- };
- int main()
- {
- string fname;
- int n;
- cout << "print size: ";
- cin >> n;
- Vector<string> v(n);
- cout << "print file name: ";
- cin >> fname;
- int c = v.load(fname);
- if (c)
- {
- v.q_sort();
- v.freq_anal();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement