Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ТРАНСПОНИРОВАНИЕ АНГЛО–ЛАТИНСКОГО СЛОВАРЯ (С СИНОНИМАМИ) */
- /*
- Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.
- К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латино-английский. За неимением лучшего он решил сделать второй словарь из первого.
- Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.
- Помогите Васе выполнить работу по созданию латино-английского словаря из англо-латинского.
- Входные данные
- В первой строке содержится единственное целое число N — количество английских слов в словаре. Далее следует N описаний. Каждое описание содержится в отдельной строке, в которой записано сначала английское слово, затем отделённый пробелами дефис, затем разделённые запятыми с пробелами переводы этого английского слова на латинский. Переводы отсортированы в лексикографическом порядке. Порядок следования английских слов в словаре также лексикографический.
- Все слова состоят только из маленьких латинских букв, длина каждого слова не превосходит 15 символов. Общее количество слов на входе не превышает 100000.
- Выходные данные
- В первой строке программа должна вывести количество словарных записей в соответствующем данному латино-английском словаре. Со второй строки выведите сам словарь, в точности соблюдая формат входных данных. В частности, первым должен идти перевод лексикографически минимального латинского слова, далее — второго в этом порядке и т.д. Внутри перевода английские слова должны быть также отсортированы лексикографически.
- */
- #include <iostream>
- #include <string>
- #include <set>
- #include <map>
- using namespace std;
- int main ()
- {
- int n; // число записей в англо-латинском словаре
- // ВВОД
- try { // можно обойтись и без try-throw-catch, но тогда программа может работать вхолостую!
- if (!cin) throw (0); // необязательно
- cin >> n;
- if (n < 1) throw (0);
- }
- catch (int) {
- cout << 0; // если словарь пуст, выводим 0
- return 0;
- }
- map <string, set <string>> Lat_Eng; // латино-английский словарь
- string Term, Trans;
- // ВВОД ПО СЛОВАМ И ЗАПОЛНЕНИЕ СЛОВАРЯ
- for (int i = 0; i < n; ++i)
- {
- cin >> Term >> Trans; // считываем слово и дефис
- while (cin && ('\n' != cin.peek ()))
- {
- cin >> Trans; // считываем перевод…
- // запятая в конце слова не нужна:
- if (',' == Trans [Trans.length () - 1]) Trans.pop_back ();
- // добавляем пару в латино-английский словарь:
- Lat_Eng [Trans].insert (", " + Term);
- }
- }
- // ВЫВОД РЕЗУЛЬТАТОВ
- cout << Lat_Eng.size () << endl; // выводим число записей в латино-английском словаре
- for (auto article : Lat_Eng)
- {
- string Junk = " "; // начинаем с пробела!
- for (auto tr : article.second) Junk += tr; // собираем все переводы в одну строку,
- Junk [1] = '-'; // исправляем первую запятую на дефис
- cout << (article.first + Junk + '\n'); // выводим словарную запись
- }
- return 0;
- }
- /*
- _ПОЯСНЕНИЯ_
- ✓ По соображениям рационализма в программе отсутствует создание англо-латинского словаря.
- ✓ Все входные данные объединяются в пары, которые сразу же помещаются в латино-английский словарь.
- ✓ Лексикографическая сортировка словарных записей, а также синонимичных переводов внутри каждой из них, реализуются АВТОМАТИЧЕСКИ в соответствии с заявленными характеристиками классов map и set.
- ✓ Число 0 — количество записей в латино-английском словаре — должно быть выведено на экран в любом из случаев не обрабатываемых алгоритмом!
- Код программы НЕ претендует на совершенство.
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement