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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
#1

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

29.03.2010, 15:22. Просмотров 586. Ответов 7
Метки нет (Все метки)

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

В txt-файле найти заданное слово или фразу и поменять её на другое слово или фразу C++
C++ Работа со строками
C++ Работа со строками как с массивом символов
C++ Работа со строками. Найти длину самого короткого слова.
C++ Работа со строками
Работа со строками (вычислить сумму введенных чисел, найти процентное содержание каждой цифры во введенной последовательности) C++
Дан файл. В новый файл записать самую длинную фразу и фразу с наибольшим количеством слов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
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++
2299 / 1669 / 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
Эксперт С++
5767 / 3416 / 255
Регистрация: 08.02.2010
Сообщений: 7,441
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++ Работа со строками. Как удалить символ с строки
В заданном тексте найти самое длинное слово и самую длинную фразу C++

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

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

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