Advertisement
-Peer-

Транспонирование англо-латинского словаря с синонимами

Sep 5th, 2019
1,486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. /* ТРАНСПОНИРОВАНИЕ АНГЛО–ЛАТИНСКОГО СЛОВАРЯ (С СИНОНИМАМИ) */
  2. /*
  3. Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.
  4.  
  5. К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латино-английский. За неимением лучшего он решил сделать второй словарь из первого.
  6.  
  7. Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.
  8.  
  9. Помогите Васе выполнить работу по созданию латино-английского словаря из англо-латинского.
  10.  
  11. Входные данные
  12.  
  13. В первой строке содержится единственное целое число N — количество английских слов в словаре. Далее следует N описаний. Каждое описание содержится в отдельной строке, в которой записано сначала английское слово, затем отделённый пробелами дефис, затем разделённые запятыми с пробелами переводы этого английского слова на латинский. Переводы отсортированы в лексикографическом порядке. Порядок следования английских слов в словаре также лексикографический.
  14.  
  15. Все слова состоят только из маленьких латинских букв, длина каждого слова не превосходит 15 символов. Общее количество слов на входе не превышает 100000.
  16.  
  17. Выходные данные
  18.  
  19. В первой строке программа должна вывести количество словарных записей в соответствующем данному латино-английском словаре. Со второй строки выведите сам словарь, в точности соблюдая формат входных данных. В частности, первым должен идти перевод лексикографически минимального латинского слова, далее — второго в этом порядке и т.д. Внутри перевода английские слова должны быть также отсортированы лексикографически.
  20. */
  21.  
  22. #include <iostream>
  23. #include <string>
  24. #include <set>
  25. #include <map>
  26.  
  27. using namespace std;
  28.  
  29. int main ()
  30. {
  31.   int n; // число записей в англо-латинском словаре
  32. // ВВОД
  33.   try { // можно обойтись и без try-throw-catch, но тогда программа может работать вхолостую!
  34.     if (!cin) throw (0); // необязательно
  35.     cin >> n;
  36.     if (n < 1) throw (0);
  37.    }
  38.    catch (int) {
  39.     cout << 0; // если словарь пуст, выводим 0
  40.     return 0;
  41.    }
  42.    map <string, set <string>> Lat_Eng; // латино-английский словарь
  43.    string Term, Trans;
  44. // ВВОД ПО СЛОВАМ И ЗАПОЛНЕНИЕ СЛОВАРЯ
  45.     for (int i = 0; i < n; ++i)
  46.         {
  47.             cin >> Term >> Trans; // считываем слово и дефис
  48.             while (cin && ('\n' != cin.peek ()))
  49.                 {
  50.                     cin >> Trans; // считываем перевод…
  51.                     // запятая в конце слова не нужна:
  52.                     if (',' == Trans [Trans.length () - 1]) Trans.pop_back ();
  53.                     // добавляем пару в латино-английский словарь:
  54.                     Lat_Eng [Trans].insert (", " + Term);
  55.                 }
  56.         }
  57. // ВЫВОД РЕЗУЛЬТАТОВ
  58.     cout << Lat_Eng.size () << endl; // выводим число записей в латино-английском словаре
  59.     for (auto article : Lat_Eng)
  60.         {
  61.             string Junk = " "; // начинаем с пробела!
  62.             for (auto tr : article.second) Junk += tr; // собираем все переводы в одну строку,
  63.             Junk [1] = '-'; // исправляем первую запятую на дефис
  64.             cout << (article.first + Junk + '\n'); // выводим словарную запись
  65.         }
  66.    
  67.     return 0;
  68. }
  69.  
  70. /*
  71. _ПОЯСНЕНИЯ_
  72.  
  73. ✓ По соображениям рационализма в программе отсутствует создание англо-латинского словаря.
  74. ✓ Все входные данные объединяются в пары, которые сразу же помещаются в латино-английский словарь.
  75. ✓ Лексикографическая сортировка словарных записей, а также синонимичных переводов внутри каждой из них, реализуются АВТОМАТИЧЕСКИ в соответствии с заявленными характеристиками классов map и set.
  76. ✓ Число 0 — количество записей в латино-английском словаре — должно быть выведено на экран в любом из случаев не обрабатываемых алгоритмом!
  77. Код программы НЕ претендует на совершенство.
  78. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement