Advertisement
Guest User

May Be

a guest
Dec 9th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <iomanip>
  6.  
  7. using namespace std;
  8.  
  9. char** add_mem_for_str(char **, int);//Выделяет память для строк
  10. void sort_words(char **, int);//Сортировка по алфавиту или количеству гласных букв
  11. void show_words(char **, int);//Выводит массив слов
  12. char** read_from_file(char **, int *);//Чтение данных с файла
  13. char* str_to_word(char *);//Удаляет из слова посторонние символы и возвращает указатель
  14. void find_shortests(char **, int *, int);//Ищет 5 самых коротких слова и записывает индексы в массив shortest
  15.  
  16. int main()
  17. {
  18.     setlocale(LC_ALL, "Russian");
  19.     char **words = NULL;
  20.     int menu = 0;
  21.     int size = 0;//размер массива строк и указатель на него
  22.     int shortests[5] = { -1, -1, -1, -1, -1 };//индексы самых коротких слов
  23.  
  24.     words = read_from_file(words, &size);//Чтение данных из файла
  25.  
  26.     do
  27.     {
  28.         cout << "1. Сортировать\n";
  29.         cout << "2. Вывести на экран\n";
  30.         cout << "3. Загрузить файл\n";
  31.         cout << "------------\n";
  32.         cout << "0. Выход\n";
  33.  
  34.         cin >> menu;
  35.        
  36.         switch (menu)
  37.         {
  38.         case 1:// Сортировка
  39.             sort_words(words, size); // сортировка
  40.             show_words(words, size); // вывод массива в консоль
  41.             break;
  42.         case 2:// Показать
  43.             show_words(words, size);
  44.             find_shortests(words, shortests, size);
  45.             cout << endl;
  46.             cout << "\n5 самых коротких слова: ";
  47.             for (int i = 0; i < 5; ++i)
  48.                 cout << words[shortests[i]] << ' ';
  49.             break;
  50.         case 3:// Задать путь к файлу
  51.             words = read_from_file(words, &size);
  52.             if (words != NULL)
  53.                 continue;
  54.             else
  55.                 cerr << "\aНе удалось открыть файл!";
  56.             break;
  57.         case 0:
  58.             break;
  59.         default:
  60.             cerr << "\aНеверный пункт меню!\n";
  61.             break;
  62.         }
  63.     } while (menu != 0);
  64.     return 0;
  65. }
  66.  
  67. char** read_from_file(char **words, int *size)
  68. {
  69.     string name_file;
  70.     char *tmp;
  71.     tmp = new char[300];
  72.  
  73.     cout << "Введите путь к файлу: ";
  74.     cin >> name_file;
  75.  
  76.     ifstream fin;
  77.     fin.open(name_file, ios_base::in);
  78.     if (!fin.is_open())
  79.     {
  80.         cerr << "\aОшибка при открытии файла!\n";
  81.         return NULL;
  82.     }
  83.     else
  84.     {
  85.         int i;
  86.         words = add_mem_for_str(words, 0);
  87.         for (i = 0; !fin.eof(); ++i)
  88.         {
  89.             if ((i + 1) % 10 == 0) // если кратно 10
  90.                 words = add_mem_for_str(words, i + 10); // выделяем память еще для 10 слов
  91.             fin >> tmp;
  92.             tmp = str_to_word(tmp);
  93.             strcpy(words[i], tmp);
  94.         }
  95.  
  96.         *size = i - 1;
  97.     }
  98.     delete[] tmp;
  99.     return words;
  100. }
  101.  
  102. char ** add_mem_for_str(char ** words, int size)
  103. {
  104.     if (size == 0)
  105.     {
  106.         if (words != NULL) // освобождаем память в случае повторного открытия файла
  107.         for (int i = 0; i < size; ++i)
  108.             delete[] words[size];
  109.         words = new char*[10];
  110.         for (int i = 0; i < 10; ++i)
  111.             words[i] = new char[100];
  112.         return words; // выход из функции
  113.     }
  114.     char **tmp = new char*[size];
  115.     for (int i = 0; i < size; ++i)
  116.         tmp[i] = new char[100];
  117.     for (int i = 0; i < size - 10; ++i)
  118.         strcpy(tmp[i], words[i]);
  119.     for (int i = 0; i < size; ++i)
  120.         delete[] words[size];
  121.     return tmp;
  122. }
  123.  
  124. void sort_words(char **words, int size)
  125. {
  126.     char *tmp = NULL;
  127.     int flag = 0;
  128.  
  129.     do
  130.     {
  131.         flag = 0; // показывает, нужно ли сортировать массив
  132.         for (int i = 0; i < size - 1; ++i)
  133.         {
  134.             if (strcmp(words[i], words[i + 1]) < 0)
  135.             { // если words[i] < words[i + 1] меняем местами
  136.                 flag = 1;
  137.                 tmp = words[i];
  138.                 words[i] = words[i + 1];
  139.                 words[i + 1] = tmp;
  140.             }
  141.         }
  142.     } while (flag); // выполняется, пока не будет полностью отсортирован
  143. }
  144.  
  145. void find_shortests(char **words, int *shortests, int size)
  146. {
  147.     int min_len = 0;
  148.     int len = 0;
  149.     for (int i = 0; i < 5; ++i)
  150.     {
  151.         min_len = 100;
  152.         for (int j = 0; j < size; ++j)
  153.         {
  154.             len = (int)strlen(words[j]);
  155.             if (len < min_len)
  156.             if (j != shortests[0] && j != shortests[1] && j != shortests[2] && j != shortests[3] && j != shortests[4])
  157.             {
  158.                 min_len = len;
  159.                 shortests[i] = j;
  160.             }
  161.         }
  162.     }
  163. }
  164.  
  165. void show_words(char ** words, int size)
  166. {
  167.     for (int i = 0; i < size; ++i)
  168.     {
  169.         cout << setw(5) << i << " ";
  170.         cout << words[i] << endl;
  171.     }
  172. }
  173.  
  174. char *str_to_word(char *str)
  175. {
  176.     int len = strlen(str);
  177.     char *tmp = new char[len];
  178.     char *pch = strtok(str, " /?,.\'\";:1234567890()"); // Делим строку на лексемы
  179.  
  180.     if (pch != NULL)//?
  181.         strcpy(tmp, pch);
  182.     while (pch != NULL)
  183.     {
  184.         pch = strtok(NULL, " /?,.\'\";:1234567890()");
  185.         if (pch != NULL)
  186.             strcat(tmp, pch); // Склеиваем полученные лексемы в одну строку
  187.     }
  188.     return tmp;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement