Форум программистов, компьютерный форум CyberForum.ru

Работа со строками. Как найти фразу? - C++

Восстановить пароль Регистрация
 
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
29.03.2010, 15:22     Работа со строками. Как найти фразу? #1
Вот фрагмент из задачи:
Далее в новой строки следует зашифрованный текст объёмом не более 10^5 символов. Если находится последовательность "Имя" hate "Предмет", не разделённая другими именами, предметами, точками, или словом hate, то считаем, что ученик с именем "Имя" ненавидит предмет "Предмет". Текст ограничен концом исходного файла.
Собственно вопрос. А как находить таки последовательности? До этого там считывается из файла список учеников и предметов (например в 2-мерный массив, но мне кажется так не пойдёт...) а потом их надо как-то сравнивать с данным текстом и находить такие последовательности... И как считывать текст? Весь сразу в большой массив или последовательно как-то?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2010, 15:22     Работа со строками. Как найти фразу?
Посмотрите здесь:

C++ Работа со строками как с массивом символов
C++ Работа со строками. Найти длину самого короткого слова.
C++ Как вывести 10 раз одну и туже фразу?
Работа со строками (вычислить сумму введенных чисел, найти процентное содержание каждой цифры во введенной последовательности) C++
C++ Как написать фразу I Love You, что б интересно было её разгадать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
29.03.2010, 16:26     Работа со строками. Как найти фразу? #2
Цитата Сообщение от WiDe Посмотреть сообщение
А как находить таки последовательности?
Регулярные выражения
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
29.03.2010, 16:38  [ТС]     Работа со строками. Как найти фразу? #3
Ну что, никто не знает что ли??? Вот например, мы создадим 2 структуры типа:
C++
1
2
3
struct pupils {
char pup[20];
};
и
C++
1
2
3
struct predmet {
char prd[20];
};
Далее создадим массивы данных структур. В первом массиве будут храниться имена всех учеников, а во втором - названия всех предметов. Далее циклом можно будет перебирать так : брать первый элемент массива первой структуры (первое имя) и брать первое название предмета. Потом начинать сравнивать. Потом брать второе название предмета и тд, пока не кончутся. Далее уже брать второе имя ученика и опять всё повторять. Но у меня вопрос, как вот сравнивать то. Вот у меня есть последовательность например: uchenik[0].pup , hate, predm[0].prd Как мне их найти в тексте?

Добавлено через 59 секунд
rangerx, спасибо, сейчас почитаю.

Добавлено через 8 минут
Быстренько пробежался по статье... Как я понял, инструмент мощный, только думаю вряд ли у меня его примут... Там же ведь придётся дополнительно библиотеку подключать. Скажут ещё что надо было всё на стандартных делать....
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
29.03.2010, 16:45     Работа со строками. Как найти фразу? #4
Цитата Сообщение от WiDe Посмотреть сообщение
Там же ведь придётся дополнительно библиотеку подключать. Скажут ещё что надо было всё на стандартных делать....
Ничего не надо подключать.
Предположим надо найти фразы вида first_word some_word second_word, где some_word - любое слово.
Ищем в тексте слово first_word, пропускаем слово следующее за ним (some_word), если следующее за some_word слово second_word - нашли то что нужно.
Вот тебе и грубый алгоритм как это сделать.
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
29.03.2010, 16:47  [ТС]     Работа со строками. Как найти фразу? #5
Хм, спасибо, сейчас буду пробовать. Если что, то отпишусь...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.03.2010, 17:47     Работа со строками. Как найти фразу? #6
Так?
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
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
 
int main()
{
    std::string textfromfile("Mice hate cats and cats hate mice. If people hate money, life will be happier");
    std::string punctuation(".,:;!?(){}\'\"\\*&%$^#@");
    size_t index;
    //Удаление знаков препинания
    while((index=textfromfile.find_first_of(punctuation))!=std::string::npos)
        textfromfile.erase(index, 1);
    std::stringstream ss(textfromfile);
    std::vector<std::string> words;
    std::map<std::string, std::string> h;
    //Разбиение строки на слова и помещение их в вектор
    while(ss >> textfromfile)
        words.push_back(textfromfile);
    //Поиск слова hate
    for(std::vector<std::string>::const_iterator it=words.begin()+1; it!=words.end()-1; ++it)
        if((*it=="hate")&&(*(it-1)!="hate")&&(*(it+1)!="hate"))
            //Помещение пары в ассоциативный контейнер
            h[*(it-1)]=*(it+1);
    //Вывод результатов
    std::cout << "Let's find out, what they hate..." << std::endl;
    for(std::map<std::string, std::string>::const_iterator it=h.begin(); it!=h.end(); ++it)
        std::cout << it->first << " don't love " << it->second << std::endl;
    system("pause");
    return 0;
}
Добавлено через 14 минут
upd, невнимательно прочитал задание. Строки 11-14 надо удалить, а после 23 нужно поставить проверку на условие, не разделяется ли последовательность знаками препинания:
C++
1
if((punctuation.find(*((it-1)->rbegin()))==std::string::npos)&&(punctuation.find(*((it+1)->begin()))==std::string::npos))
Выглядит излишне громоздко, но предложение "This emotions are bad: envy, hate and anger" разберет правильно.
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
29.03.2010, 17:53  [ТС]     Работа со строками. Как найти фразу? #7
Интересный вариант. Вот на этом месте
C++
1
if((*it=="hate")&&(*(it-1)!="hate")&&(*(it+1)!="hate"))
я так понял вы просто берёте слова слева и справа. Но мне нужны только слова из определённого списка так сказать. Тогда мне надо будет просто их ещё сравнивать с допустимыми словами и уже только потом помещать в контейнер?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2010, 17:57     Работа со строками. Как найти фразу?
Еще ссылки по теме:

Дан файл. В новый файл записать самую длинную фразу и фразу с наибольшим количеством слов C++
C++ Работа со строками, как с массивами
C++ Преобразование типов, как понять фразу из учебника

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.03.2010, 17:57     Работа со строками. Как найти фразу? #8
Верно. Если ты будешь сравнивать слова со словами из списка, тогда проверку знаков препинания можно вообще убрать.
Yandex
Объявления
29.03.2010, 17:57     Работа со строками. Как найти фразу?
Ответ Создать тему
Опции темы

Текущее время: 15:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru