Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.12.2016
Сообщений: 11

Найти слова, встречающиеся и в вопросительных, и в восклицательных предложениях, но не в повествовательных

09.07.2017, 21:54. Показов 2052. Ответов 3

Студворк — интернет-сервис помощи студентам
Условие: дан текст, состоящий из предложений, разделённых знаками препинания из набора «.?!». Предложения в свою очередь состоят из слов, отделённых друг от друга пробелами. Найти слова (без учёта регистра) и их количество, которые встречаются одновременно и в вопросительных, и в восклицательных предложениях, но не встречаются в повествовательных.
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
84
85
86
87
88
89
90
91
92
/*
Дан текст, состоящий из предложений, разделённых знаками препинания из набора «.?!». 
Предложения в свою очередь состоят из слов, отделённых друг от друга пробелами. 
Найти слова (без учёта регистра) и их количество,
которые встречаются одновременно и в вопросительных, и в восклицательных предложениях, но не встречаются в повествовательных.
*/
#include <algorithm> 
#include <fstream> 
#include <string> 
#include <set> 
#include <vector> 
#include<iterator> 
 
using namespace std; 
 
ifstream in("input.txt"); 
ofstream out("output.txt"); 
 
int main() 
{ 
    int k = 0;
    set <string> set_inter; // set для хранения слов из вопросительных предложений
    set <string> set_exc; // set для хранения слов из восклицательных предложений
    set <string> set_dot; //set для хранения слов из повествовательных предложений
    set <string> set_cross; // set для хранения пересечения
    set <string> set_dif; // set для хранения разницы 
    string data; 
    string sub = ""; 
    getline(in, data); 
    for (int i = 0; i < data.length(); i++) 
    { 
        k++;
        sub += data[i];
        if (data[i] == '?') // заполняем set с вопросительными предложениями
        { 
        
            
            set_inter.insert(sub.substr(0, sub.size()-1));
            
            sub = ""; 
            k = 0;
        }
        if ( data[i] == '!' ) // заполняем set с вопросительными предложениями
        {
            set_exc.insert(sub.substr(0, sub.size()-1));
            sub = ""; 
            k = 0;
        } 
        if ( data[i] == '.') // заполняем set с повествовательными предложениями
        {
            set_dot.insert(sub.substr(0, sub.size()-1));
            sub = ""; 
            k = 0;
        }
    }
        // Ищем пересечение между вопросительными и восклицательными предложениями:
    set_intersection(set_inter.begin(), set_inter.end(), set_exc.begin(), set_exc.end(), inserter(set_cross, set_cross.begin()));
        // Ищем разницу между повествовательными предложениями и set_cross: 
    set_difference(set_dot.begin(), set_dot.end(), set_cross.begin(), set_cross.end(), inserter(set_dif, set_dif.begin())); 
    out << "set_inter(?): ";
    for (set<string>::iterator it = set_inter.begin(); it != set_inter.end(); it++)
    {
        out << *it <<" ";
    }
    out << endl;
    out << "set_exc(!): ";
    for (set<string>::iterator it = set_exc.begin(); it != set_exc.end(); it++)
    {
        out << *it <<" ";
    }
    out << endl;
    out << "set_dot(.): ";
    for (set<string>::iterator it = set_dot.begin(); it != set_dot.end(); it++)
    {
        out << *it <<" ";
    }
    out << endl;
    out << "set_cross(!*?): ";
    for (set<string>::iterator it = set_cross.begin(); it != set_cross.end(); it++)
    {
        out << *it <<" ";
    }
    out << endl;
    out << "Result: ";
    for (set<string>::iterator it = set_dif.begin(); it != set_dif.end(); it++) 
    {
        out << *it << " "; 
    }
    out << endl;
    out << endl;
    out << "kolichestvo= " << set_dif.size();
}
Вот, что у меня получается:
input.txt:
Восклицательное предложение! Вопросительное предложение? Повествовательное предложение.
output.txt:
set_inter(?): Вопросительное предложение
set_exc(!): Восклицательное предложение
set_dot(.): Повествовательное предложение
set_cross(!*?):
Result: Повествовательное предложение


kolichestvo= 1
То есть всё дело в set_difference и set_intersection в сетах типа string. Как это можно исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2017, 21:54
Ответы с готовыми решениями:

Найти слова, встречающиеся и в повествовательных, и в восклицательных предложениях
Дан текст, состоящий из предложений, разделенных знаками препинания из набора «.?!». Предложения в свою очередь состоят из слов, отделенных...

Используя set найти слова встречающиеся одновременно в вопросительных и восклицательных предложениях
Дан текст, состоящий из предложений, разделённых знаками препинания из набора «.?!». Предложения в свою очередь состоят из слов, отделённых...

Найти слова, которые встречаются одновременно и в повествовательных, и в вопросительных предложениях
Дан текст, состоящий из предложений, разделённых знаками препинания из набора «.?!». Предложения в свою очередь состоят из слов, отделённых...

3
Заблокирован
09.07.2017, 22:01
Ты уж определись, у тебя set-ы хранят слова или предложения.
Цитата Сообщение от Laiviano Посмотреть сообщение
sub = "";
sub.clear() лучше

Работу с set_intersection и set_difference не смотрел.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
09.07.2017, 22:22
Чот я не понял. В сеты надо слова запихивать, а не предложнния
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
10.07.2017, 11:50
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
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <regex>
#include <set>
#include <sstream>
#include <iterator>
using namespace std;
auto low=[](const string &s) {
    string str=s;
    if(ispunct(str.back())) str=str.substr(0,str.length()-1);
    for_each(str.begin(),str.end(),[](char &c) {
        c=tolower(c);
    });
    return str;
};
 
int main() {
    
    set<string>point {};
    set<string>ridl {};
    set<string>excl {};
    
    set<string>res{},res2 {};
 
    ifstream ff("tr.txt");
    
    string s {},txt {};
    
    while(getline(ff,s)) txt+=s+" ";
    
    regex e("(.*?)(\\.|\\!|\\?)");
    
    for(auto it=sregex_iterator(txt.begin(),txt.end(),e); it!=sregex_iterator(); ++it) 
    {
        string sent=it->str();
        
        istringstream ss(sent);
 
        if(sent.back()=='.') 
        {
            transform(istream_iterator<string>(ss),istream_iterator<string>(),inserter(point,point.begin()),low);
            
        } else if (sent.back()=='?') 
        {
            transform(istream_iterator<string>(ss),istream_iterator<string>(),inserter(ridl,ridl.begin()),low);
            
        } else transform(istream_iterator<string>(ss),istream_iterator<string>(),inserter(excl,excl.begin()),low);
    }
    
    set_intersection (excl.begin(), excl.end(), ridl.begin(), ridl.end(),inserter(res,res.begin()));
    
    set_difference(res.begin(),res.end(),point.begin(),point.end(),inserter(res2,res2.begin()));
 
    for(const auto&x:res2) 
    {
        cout<<x<<endl;
    }
    
    cout<<res2.size()<<endl;
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2017, 11:50
Помогаю со студенческими работами здесь

Найти слова, которые встречаются одновременно и в вопросительных и в восклицательных предложениях
Дан текст, состоящий из предложений, разделённых знаками препинания из набора «.?!». Предложения в свою очередь состоят из слов, отделённых...

Вывести слова и их количество в повествовательных предложениях
Согласно задаче, дан текст, состоящий из вопросительных, повествовательных и восклицательных предложений. Нужно вывести в output такие...

Из двух предложений удалить слова, встречающиеся в обоих предложениях. Вывести на экран предложения и удаленные слова
Из двух предложений удалить слова, встречающиеся в обоих предложениях. Вывести на экран полученные предложения и удаленные слова. Выручите,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru