powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка расстановки ударений в словах.
16 сообщений из 16, страница 1 из 1
Проверка расстановки ударений в словах.
    #39509438
Alero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые участники форума!
Прохожу курс по программированию на С++ и столкнулся со следующей задачей. Заранее спасибо за внимание к моей проблеме.
Ниже условие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Учительница задала Пете домашнее задание — в заданном тексте расставить ударения в словах, после чего поручила 
Васе проверить это домашнее задание. Вася очень плохо знаком с данной темой, поэтому он нашел словарь, в котором 
указано, как ставятся ударения в словах. К сожалению, в этом словаре присутствуют не все слова. Вася решил, что 
в словах, которых нет в словаре, он будет считать, что Петя поставил ударения правильно, если в этом слове Петей 
поставлено ровно одно ударение.

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

Вам дан словарь, которым пользовался Вася и домашнее задание, сданное Петей. Ваша задача — определить количество ошибок, 
которое в этом задании насчитает Вася.

Входные данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Вводится сначала число N — количество слов в словаре (0 ≤ N ≤ 20000).

Далее идет N строк со словами из словаря. Каждое слово состоит не более чем из 30 символов. Все слова состоят из маленьких 
и заглавных латинских букв. В каждом слове заглавная ровно одна буква — та, на которую попадает ударение. Слова в словаре 
расположены в алфавитном порядке. Если есть несколько возможностей расстановки ударения в одном и том же слове, то эти 
варианты в словаре идут в произвольном порядке.

Далее идет упражнение, выполненное Петей. Упражнение представляет собой строку текста, суммарным объемом не более 300000 
символов. Строка состоит из слов, которые разделяются между собой ровно одним пробелом. Длина каждого слова не превышает 
30 символов. Все слова состоят из маленьких и заглавных латинских букв (заглавными обозначены те буквы, над которыми Петя 
поставил ударение). Петя мог по ошибке в каком-то слове поставить более одного ударения или не поставить ударения вовсе.

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

Код: plaintext
Выведите количество ошибок в Петином тексте, которые найдет Вася.

Примечание к примеру


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1. В слове cannot, согласно словарю возможно два варианта расстановки ударения. Эти варианты в словаре могут быть 
перечислены в любом порядке (т.е. как сначала cAnnot, а потом cannOt, так и наоборот).

Две ошибки, совершенные Петей — это слова be (ударение вообще не поставлено) и fouNd (ударение поставлено неверно). 
Слово thE отсутствует в словаре, но поскольку в нем Петя поставил ровно одно ударение, признается верным.

2. Неверно расставлены ударения во всех словах, кроме The (оно отсутствует в словаре, в нем поставлено ровно одно ударение). 
В остальных словах либо ударные все буквы (в слове PAGE), либо не поставлено ни одного ударения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sample Input 1:
4
cAnnot
cannOt
fOund
pAge
thE pAge cAnnot be fouNd
Sample Output 1:
2
Sample Input 2:
4
cAnnot
cannOt
fOund
pAge
The PAGE cannot be found
Sample Output 2:
4

Решая эту пришёл к тому, что в программе должен присутствовать перевод всех слов из словаря и из задания
в один регистр для последующего определения совпадения слов из задания и из словаря. Т.е. проверить слово
без учета ударения встречается в словаре или нет.
Пытался колдовать с tolower() и toupper(). И вот что получилось. Привожу только кусок кода, но поскольку
единого решения у меня нет, привожу то на чём застопорился.

Код: plaintext
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.
#include <iostream>
#include <cstring>
#include <cctype>
#include <set>
#include <string>
#include <locale>

using namespace std;

int main() 
{
    int N;
    locale loc;
    string word;
    set <string> dict;
    set <string> dict2;
    for (int i = 0; i < N; i++){ // наполнение словаря
        cin >> word;
        dict.insert(word);
    }
    for (auto now = dict.begin(); now != dict.end(); now++) { // иду по словам словаря
        word = "";       // обнуляю переменную для присваивания ей слова, буквы которого переведены в один регистр
        for (auto c : *now){ //иду по буквам слова            
            word = toupper(c, loc);           
            cout << word; // для себя для проверки выводил полученный результат от перевода в регистр - действительно
            dict2.insert(word); // в этой переменной все буквы в словах заглавные           
        }
    }
    for (auto now = dict2.begin(); now != dict2.end(); now++) { // для проверки иду по словарю, в котором все слова должны
        cout << *now; // состоять из заглавных букв, но почему-то выводит только используемые буквы в алфавитном порядке, что понятно, т.к. это set, НО когда через cin>>word заполнял множество словами, при выводе 
                               //выводились элементы такими какими их задавали
    }
}


В общем я в тупике и не знаю как дальше решать. Помогите/подскажите пожалуйста как осуществить перевод всех слов в один регистр с возможностью дальнейшей работы с ними как со строками.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509498
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alero
Решая эту пришёл к тому, что в программе должен присутствовать перевод всех слов из словаря и из задания
в один регистр для последующего определения совпадения слов из задания и из словаря. Т.е. проверить слово
без учета ударения встречается в словаре или нет.



Не понимаю пока, в чём твоя проблема, но мысль неудачная уже ясно.
Если ты приводишь слова в один регистр букв, то очевидно, что ты теряешь информацию о том, где проставлено ударение, и вся работа теряет смысл.

Ты правильно понял, что ИСКАТЬ в словаре нужно без учёта регистра, это да, но САМО СЛОВО С УДАРЕНИЕМ там тоже должно присутствовать.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509821
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. Чтоб по set делать поиск надо хотя-бы ключи подбить к одному регистру. А ударение хранить как value.
И наверное не set а multi-set.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509844
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохраняем словарь в set: каждое слово в двух написаниях: с ударением и без.

Проверка: читаем слово, считаем количество ударений если >1 - ошибка,
ищем слово в словаре - нашли - правильно
убираем ударение, ищем в словаре - нашли - ошибка.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509939
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду так. Вместо

cAnnot
cannOt

Сделать multi-set

key="cannot", value=2 (на второй букве ударение)
key="cannot", value=5
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509948
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня проще:
Код: plaintext
1.
2.
3.
cAnnot
cannOt
cannot

Для проверки достаточно поиска без доп. переборов. И value не надо. С value это уже не set, а map.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509952
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля проверки достаточно поиска без доп. переборов. И value не надо. С value это уже не set, а map.
Дима. А так?
key="cannot2"
key="cannot5"

Перевернул мульти-мап в сет.

И свойства вроде сохранил. Искать по прежнему можно как в дереве.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509983
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. А так?
key="cannot2"
key="cannot5"
Так лучше
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509990
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм.. Чтоб по set делать поиск надо хотя-бы ключи подбить к одному регистру. А ударение хранить как value.
В set есть параметр компаратор. Вовсе незачем менять регистр ключей.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39509999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonДима. А так?
key="cannot2"
key="cannot5"
Так лучше
Или вообще так. Хардкор!
Два ударения.
key="cannot(2,5)"

P.S. Жаль нет Базиста. Он-бы одобрил.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39510043
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм.. Чтоб по set делать поиск надо хотя-бы ключи подбить к одному регистру. А ударение хранить как value.
И наверное не set а multi-set.

Как бы я намекал, намекал...

Не set, а map.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39510061
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да зачем эти мэпы и прочие усложнения.
Храним все в set, одно слово - один ключ, где заглавная буква это допустимое ударение.
Если слово допускает несколько вариантов ударения, то храним их все в одном ключе, напр: cAnnOt
При проверке ищем ключ без учета регистра, а затем проверяем ударение.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39510846
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДа зачем эти мэпы и прочие усложнения.
Храним все в set, одно слово - один ключ, где заглавная буква это допустимое ударение.
Если слово допускает несколько вариантов ударения, то храним их все в одном ключе, напр: cAnnOt
При проверке ищем ключ без учета регистра, а затем проверяем ударение.

А зачем?

Код: plaintext
std::map< std::string, std::vector< std::string> >
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39510888
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чтобы окончательно добить бедную учительницу, Вася качает Trie,
делает
Код: plaintext
1.
trie::trie_map<char, int> dictionary;


И получает справочник куда можно положить все слова всех языков мира и компактно.

Петя получает зачот. Вася качает свои скиллы в С++. А учительница получает
множественные оргазмы.
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39511247
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAnatoly MoskovskyДа зачем эти мэпы и прочие усложнения.
Храним все в set, одно слово - один ключ, где заглавная буква это допустимое ударение.
Если слово допускает несколько вариантов ударения, то храним их все в одном ключе, напр: cAnnOt
При проверке ищем ключ без учета регистра, а затем проверяем ударение.

А зачем?

Код: plaintext
std::map< std::string, std::vector< std::string> >


Первый вариант по памяти выигрывает) Хотя в общем случае, если организовать второй вариант следующим образом:

Код: plaintext
1.
map< std::string, std::set< std::string> >



то мы снова проиграем по памяти, но выиграем при поиске

maytonИ чтобы окончательно добить бедную учительницу, Вася качает Trie,
делает
Код: plaintext
1.
trie::trie_map<char, int> dictionary;


И получает справочник куда можно положить все слова всех языков мира и компактно.

Петя получает зачот. Вася качает свои скиллы в С++. А учительница получает
множественные оргазмы.

Василий попытается понять что это такое и семестр неожиданно закончится)
...
Рейтинг: 0 / 0
Проверка расстановки ударений в словах.
    #39511303
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка расстановки ударений в словах.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]