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

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

01.02.2016, 13:20. Показов 12301. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2016, 13:20
Ответы с готовыми решениями:

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

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

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

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

8
1489 / 782 / 172
Регистрация: 05.12.2015
Сообщений: 2,351
01.02.2016, 14:00 2
Можно сразу пихать все в multimap<string, string>. Можно даже в map<string, string>.
0
Dimension
583 / 451 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
01.02.2016, 15:06 3
Лучший ответ Сообщение было отмечено Виктор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  [ТС] 4
Спасибо большое! Выручили. Такой краткости мне достичь не удавалось. Теперь полдня буду разбираться с 13-18 строками вашего кода
0
Dimension
583 / 451 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
01.02.2016, 23:47 5
Виктор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 6
Dimension, скажите, пожалуйста, почему там в 14 строчке запятая, а не точка с запятой?
тут
while(isalpha(a[j]))
where+=a[j], j++;
0
Jesus loves me
Эксперт С++
5173 / 3146 / 354
Регистрация: 12.12.2009
Сообщений: 7,947
Записей в блоге: 2
28.07.2016, 21:49 7
Цитата Сообщение от elllkk Посмотреть сообщение
запятая, а не точка с запятой?
кому-то было фигурные скобки лень писать
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 58
06.08.2017, 21:14 8
Dimension, расскажите пожалуйста, что делает в 8 строке cin.get(); ?
0
186 / 53 / 19
Регистрация: 23.12.2016
Сообщений: 162
06.08.2017, 22:41 9
Цитата Сообщение от Kastaneda Посмотреть сообщение
кому-то было фигурные скобки лень писать
Так вроде можно было еще сократить, если лень лишнее писать:

C++
1
where+=a[j++];
Или я ошибаюсь?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2017, 22:41

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.