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

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

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

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

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

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

В txt-файле найти заданное слово или фразу и поменять её на другое слово или фразу - C++
Привет народ! Помогите чем сможете. Короче нужна программа, которая в txt-файле ищет заданное слово или фразу и меняет её опять же на...

Работа со строками. Найти длину самого короткого слова. - C++
Даны слова разделенные пробелами. Найти длину самого короткого слова.

Работа со строками, как с массивами - C++
Написать программу, которая принимает у пользователя строку и выводит ее по 4 символа по каждой строке. Например, строка Программирование...

Работа со строками как с массивом символов - C++
Работаю в Borland C++3.1 Нt понимаю почему не компиллируется, выдает постоянно ошибку - "Unable to open file 'TCLASS.LIB' " ...

Работа со строками. Как удалить символ с строки - C++
Здраствуйте помогите пожалуйста. не знаю как удалать символы с строки знаю что с помощью ERASE но не знаю как помогите пожалуйста!

Работа со строками (вычислить сумму введенных чисел, найти процентное содержание каждой цифры во введенной последовательности) - C++
Помогите написать программу, очень надо... Вопрос стипушеньки...пожалуйста) С клавиатуры вводится последовательность чисел,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
29.03.2010, 16:26 #2
Цитата Сообщение от WiDe Посмотреть сообщение
А как находить таки последовательности?
Регулярные выражения
1
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 минут
Быстренько пробежался по статье... Как я понял, инструмент мощный, только думаю вряд ли у меня его примут... Там же ведь придётся дополнительно библиотеку подключать. Скажут ещё что надо было всё на стандартных делать....
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 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 - нашли то что нужно.
Вот тебе и грубый алгоритм как это сделать.
1
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
29.03.2010, 16:47  [ТС] #5
Хм, спасибо, сейчас буду пробовать. Если что, то отпишусь...
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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" разберет правильно.
1
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"))
я так понял вы просто берёте слова слева и справа. Но мне нужны только слова из определённого списка так сказать. Тогда мне надо будет просто их ещё сравнивать с допустимыми словами и уже только потом помещать в контейнер?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
29.03.2010, 17:57 #8
Верно. Если ты будешь сравнивать слова со словами из списка, тогда проверку знаков препинания можно вообще убрать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2010, 17:57
Привет! Вот еще темы с ответами:

Работа со строками. Как вывести последнее слово палиндром в моей строке? - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main(){ char *str = new...

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

Найти фразу в строке - C++
Здравствуйте, есть String s с данными = &quot;,Железнодорожный вокзал,понёс убыток,из-за,столкновения двух,поездов,в то время, как...

Найти в тексте самое длинное слово и самую длинную фразу - C++
В школе преподаватель написал на доске не большой текст. Вызвал к доске ученика и попросил его найти в тексте самое длинное слово и самую...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.03.2010, 17:57
Ответ Создать тему
Опции темы

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