Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/91: Рейтинг темы: голосов - 91, средняя оценка - 4.71
5 / 5 / 1
Регистрация: 03.05.2015
Сообщений: 14

Переделка англо-латинского словаря в латинско-английский

01.02.2016, 13:20. Показов 18684. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые участники форума. Мне нужна ваша помощь вот по какой задаче с образовательного сайта:

Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.

К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латинско-английский. За неимением лучшего он решил сделать второй словарь из первого.

Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.

Помогите Васе выполнить работу по созданию латинско-английского словаря из англо-латинского.

Входные данные

В первой строке содержится единственное целое число N — количество английских слов в словаре. Далее следует N описаний. Каждое описание содержится в отдельной строке, в которой записано сначала английское слово, затем отделённый пробелами дефис (символ номер 45), затем разделённые запятыми с пробелами переводы этого английского слова на латинский. Переводы отсортированы в лексикографическом порядке. Порядок следования английских слов в словаре также лексикографический.

Все слова состоят только из маленьких латинских букв, длина каждого слова не превосходит 15 символов. Общее количество слов на входе не превышает 100000.

Выходные данные

Выведите соответствующий данному латинско-английский словарь, в точности соблюдая формат входных данных. В частности, первым должен идти перевод лексикографически минимального латинского слова, далее — второго в этом порядке и т.д. Внутри перевода английские слова должны быть также отсортированы лексикографически.

Sample Input:

3
apple - malum, pomum, popula
fruit - baca, bacca, popum
punishment - malum, multa

Sample Output:

7
baca - fruit
bacca - fruit
malum - apple, punishment
multa - punishment
pomum - apple
popula - apple
popum - fruit


Я эту задачу решал так:
1)Закинул вводимые слова с переводами в множество set <string> vvod
2)Затем составил множество переводов всех слов set <string> perevody, куда просто кидал набор переводов каждого слова
3)И, наконец создал map <string, vector <string>> otvet, куда добавлял для очередного элемента множества perevody слова, которым они соответствуют.

Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <map>
#include <string>
#include <set>
#include <vector>
using namespace std;
 
int main(){
    set <string> vvod; //Это маножество ввода
    set <string> perevody; //Это множество с переводами
    map <string, vector <string>> otvet; // Здесь будут помещаться ввыводимые данные
    
    long n;
    cin >> n;
    string wd;
    getline(cin, wd);
 
    //В этом цикле производится первичное считывание данных, тут
    //же можно и начать заполнять множество переводов
    for (int i = 0; i < n; i++){ 
        getline(cin, wd);
        vvod.insert(wd);
 
        //Приступим к заполнению множества с переводами
        int posdef = wd.find(char(45)); // переменная указывает позицию дефиса
        int numwords = 1; //переменная считает число переводов данного слова
        int l; // Переиенная будет хранить длину введённой строки
        l = wd.length();
 
        //Счиатем чивло переводов
        for (auto sym : wd){
            if (sym == ',')
                numwords++;
        }
 
        //Преобразуем введённую строку для более удобного вычленения переводов
        wd = ", " + wd.substr(posdef + 2, (l - posdef) - 1) + ",";
        int first = 0, second = 0; // Вводим переменные, которые будут хранить позицию запятой
 
        //Добавлеям слова из очередной полученной строки в массив переводов
        while (wd.find(",", second + 1) != -1){
            //первую границу приравниваем ко второй
            first = second;
 
            //вторая граница - это следующая запятая
            second = wd.find(",", second + 1);
 
            //слово - то, что находится между первай гранмцец и одного знака до второй границы
            //Добавляем слово в массив
            perevody.insert(wd.substr(first + 2, second - 2 - first));
        }
    }
 
    for (auto now : perevody){
        for (auto wordandtrans : vvod){
            int posdef1 = wordandtrans.find(char(45));
            if (wordandtrans.find(now) != -1)
            otvet[now].push_back(wordandtrans.substr(0, posdef1 - 1));
        }
    }
 
    cout << otvet.size() << endl;
    for (auto now : otvet){
        cout << now.first << " - ";
        int numw = 0, i = 0;
        for (auto n : now.second){
            numw++;
        }
        for (auto n : now.second){
            if (numw == 1)
                cout << n;
            else{
                i++;
                if (i == numw)
                    cout << n;
                else
                    cout << n << ", ";
            }
        }
        cout << endl;
    }
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2016, 13:20
Ответы с готовыми решениями:

Англо-Латинский и Латинско-Английский словарь
В общем, нам дано число n - количество англ слов. Затем в каждой строчке дается само англ. слово и его перевод на Латиницу (Обычный...

Переделка англо-латинского словаря
Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и...

Создание обратного словаря (из англо-латыньского латыно-английский)
помогите,умоляю , на питоне пытался разобраться но никак не получается Однажды, разбирая старые книги на чердаке, школьник Вася нашёл...

8
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.02.2016, 14:00
Можно сразу пихать все в multimap<string, string>. Можно даже в map<string, string>.
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
01.02.2016, 15:06
Лучший ответ Сообщение было отмечено Виктор9696 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    string a;
    string need, where;
    cin.get();
    map<string, vector<string> > m;
    for (int i = 0;i < n;i++) {
        int j = 0;
        getline(cin, a);
        while(isalpha(a[j]))
           where+=a[j], j++;
           j += 3;
           for (j;j < a.size();j++) {
               while (j < a.size() &&isalpha(a[j])) {
                   need += a[j],j++;
               }
               j++;
               m[need].push_back(where);
               need.clear();
           }
           where.clear();
    }
    cout << m.size()<<endl;
    for (auto i:m) {
        cout << i.first << " - ";
        int c = i.second.size();
        for (int j = 0;j < c;j++) {
            cout << i.second[j];
            if (j + 1 < c)
                cout << ", ";
        }
        cout << endl;
    }
    return 0;
}
Добавлено через 2 минуты
можно входные данные представить как орграф и в нем нам нужно развернуть все ребра
3
5 / 5 / 1
Регистрация: 03.05.2015
Сообщений: 14
01.02.2016, 23:09  [ТС]
Спасибо большое! Выручили. Такой краткости мне достичь не удавалось. Теперь полдня буду разбираться с 13-18 строками вашего кода
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
01.02.2016, 23:47
Виктор9696, это банальный парсинг строки 13,14 вырезаем apple , теперь во where у нас apple
затем пропускаем три символа ,это пробел тире пробел
17,18 вырезаем malum,затем пропускаем запятую (а пробел у нас пропустит новая итерация for) , теперь в need лежит malum , потом вырезаем pomum , и так пока не подойдем к концу строки


Цитата Сообщение от Виктор9696 Посмотреть сообщение
Sample Input:

apple - malum, pomum, popula
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 72
28.07.2016, 21:43
Dimension, скажите, пожалуйста, почему там в 14 строчке запятая, а не точка с запятой?
тут
while(isalpha(a[j]))
where+=a[j], j++;
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.07.2016, 21:49
Цитата Сообщение от elllkk Посмотреть сообщение
запятая, а не точка с запятой?
кому-то было фигурные скобки лень писать
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
06.08.2017, 21:14
Dimension, расскажите пожалуйста, что делает в 8 строке cin.get(); ?
0
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 167
06.08.2017, 22:41
Цитата Сообщение от Kastaneda Посмотреть сообщение
кому-то было фигурные скобки лень писать
Так вроде можно было еще сократить, если лень лишнее писать:

C++
1
where+=a[j++];
Или я ошибаюсь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2017, 22:41
Помогаю со студенческими работами здесь

Создание англо-русского словаря
Привет. Суть программы такая: пользователь вводит незнакомое слово и записывает его в отдельное поле &quot;для себя&quot;. Для того,...

Создание англо-русского словаря
Другу задали курсовой создать англо-русский словарь, реализовал начало через std::set, но есть один нюанс в задании написано...

[Словарь] Англо-Русский и Русско-Английский
Народ должен создать словарь. Пользуюсь RAD Studio 10. Посоветуйте какими компонентами и базами нужно работать?

Русско-английский и англо-русский словарь
Здравствуйте господа программисты! Мне нужна помощь. В курсовой работе есть задание &quot;Создать проект «Русско-английский и англо-русский...

Написать переводчик англо-русский и русско-английский
Здравствуйте уважаемые форумчане. Только начали изучать Пролог и вот не могу никак решить элементарную(как я думаю) проблему.. вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru