Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <cstdlib>
- #include <iomanip>
- using namespace std;
- char** add_mem_for_str(char **, int);//Выделяет память для строк
- void sort_words(char **, int);//Сортировка по алфавиту или количеству гласных букв
- void show_words(char **, int);//Выводит массив слов
- char** read_from_file(char **, int *);//Чтение данных с файла
- char* str_to_word(char *);//Удаляет из слова посторонние символы и возвращает указатель
- void find_shortests(char **, int *, int);//Ищет 5 самых коротких слова и записывает индексы в массив shortest
- int main()
- {
- setlocale(LC_ALL, "Russian");
- char **words = NULL;
- int menu = 0;
- int size = 0;//размер массива строк и указатель на него
- int shortests[5] = { -1, -1, -1, -1, -1 };//индексы самых коротких слов
- words = read_from_file(words, &size);//Чтение данных из файла
- do
- {
- cout << "1. Сортировать\n";
- cout << "2. Вывести на экран\n";
- cout << "3. Загрузить файл\n";
- cout << "------------\n";
- cout << "0. Выход\n";
- cin >> menu;
- switch (menu)
- {
- case 1:// Сортировка
- sort_words(words, size); // сортировка
- show_words(words, size); // вывод массива в консоль
- break;
- case 2:// Показать
- show_words(words, size);
- find_shortests(words, shortests, size);
- cout << endl;
- cout << "\n5 самых коротких слова: ";
- for (int i = 0; i < 5; ++i)
- cout << words[shortests[i]] << ' ';
- break;
- case 3:// Задать путь к файлу
- words = read_from_file(words, &size);
- if (words != NULL)
- continue;
- else
- cerr << "\aНе удалось открыть файл!";
- break;
- case 0:
- break;
- default:
- cerr << "\aНеверный пункт меню!\n";
- break;
- }
- } while (menu != 0);
- return 0;
- }
- char** read_from_file(char **words, int *size)
- {
- string name_file;
- char *tmp;
- tmp = new char[300];
- cout << "Введите путь к файлу: ";
- cin >> name_file;
- ifstream fin;
- fin.open(name_file, ios_base::in);
- if (!fin.is_open())
- {
- cerr << "\aОшибка при открытии файла!\n";
- return NULL;
- }
- else
- {
- int i;
- words = add_mem_for_str(words, 0);
- for (i = 0; !fin.eof(); ++i)
- {
- if ((i + 1) % 10 == 0) // если кратно 10
- words = add_mem_for_str(words, i + 10); // выделяем память еще для 10 слов
- fin >> tmp;
- tmp = str_to_word(tmp);
- strcpy(words[i], tmp);
- }
- *size = i - 1;
- }
- delete[] tmp;
- return words;
- }
- char ** add_mem_for_str(char ** words, int size)
- {
- if (size == 0)
- {
- if (words != NULL) // освобождаем память в случае повторного открытия файла
- for (int i = 0; i < size; ++i)
- delete[] words[size];
- words = new char*[10];
- for (int i = 0; i < 10; ++i)
- words[i] = new char[100];
- return words; // выход из функции
- }
- char **tmp = new char*[size];
- for (int i = 0; i < size; ++i)
- tmp[i] = new char[100];
- for (int i = 0; i < size - 10; ++i)
- strcpy(tmp[i], words[i]);
- for (int i = 0; i < size; ++i)
- delete[] words[size];
- return tmp;
- }
- void sort_words(char **words, int size)
- {
- char *tmp = NULL;
- int flag = 0;
- do
- {
- flag = 0; // показывает, нужно ли сортировать массив
- for (int i = 0; i < size - 1; ++i)
- {
- if (strcmp(words[i], words[i + 1]) < 0)
- { // если words[i] < words[i + 1] меняем местами
- flag = 1;
- tmp = words[i];
- words[i] = words[i + 1];
- words[i + 1] = tmp;
- }
- }
- } while (flag); // выполняется, пока не будет полностью отсортирован
- }
- void find_shortests(char **words, int *shortests, int size)
- {
- int min_len = 0;
- int len = 0;
- for (int i = 0; i < 5; ++i)
- {
- min_len = 100;
- for (int j = 0; j < size; ++j)
- {
- len = (int)strlen(words[j]);
- if (len < min_len)
- if (j != shortests[0] && j != shortests[1] && j != shortests[2] && j != shortests[3] && j != shortests[4])
- {
- min_len = len;
- shortests[i] = j;
- }
- }
- }
- }
- void show_words(char ** words, int size)
- {
- for (int i = 0; i < size; ++i)
- {
- cout << setw(5) << i << " ";
- cout << words[i] << endl;
- }
- }
- char *str_to_word(char *str)
- {
- int len = strlen(str);
- char *tmp = new char[len];
- char *pch = strtok(str, " /?,.\'\";:1234567890()"); // Делим строку на лексемы
- if (pch != NULL)//?
- strcpy(tmp, pch);
- while (pch != NULL)
- {
- pch = strtok(NULL, " /?,.\'\";:1234567890()");
- if (pch != NULL)
- strcat(tmp, pch); // Склеиваем полученные лексемы в одну строку
- }
- return tmp;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement