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

Файлы. Найти слово, встречающееся в каждом предложении - C++

Восстановить пароль Регистрация
 
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
21.03.2013, 20:51     Файлы. Найти слово, встречающееся в каждом предложении #1
Уже сломал голову с ней, решил кучу других задач. Но эта... вынос мозга. Попытки запихнуть в векторы , массивы - крах. Каждое слово цепляет знак пунктуации и не воспринимается для сравнения. SOS SOS SOS SOS SOS!!!!!!!!!!!!!


Дан файл, содержащий текст на русском языке. Найти слово, встречающееся в каждом предложении, или сообщить, что такого слова нет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
21.03.2013, 20:57     Файлы. Найти слово, встречающееся в каждом предложении #2
А с map или multimap не пробовал?
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
21.03.2013, 21:05  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #3
Пока не касался этих классов... Теперь, видимо, надо . )) Но можно ли решить её именно векторами или массивами...
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
21.03.2013, 21:49     Файлы. Найти слово, встречающееся в каждом предложении #4
Конечно можно Делаешь вектор который хранит указатель на массив и т.д. Но слишком много гемороя, лучше map используй.
Ключ = слово, значение количество, и потом просто сравниваешь которое значение равняеться количеству предложений
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.03.2013, 21:59     Файлы. Найти слово, встречающееся в каждом предложении #5
если по простому в лоб, то берем текст и разбиваем его на предложения. получаем массив предложений. но предложения нам не особо нужны, нам нужны слова этих предложений. поэтому разбиваем еще каждое предложение на массив слов. в итоге у нас получается массив массивов слов. ищем самый маленький массив слов. и проверяем каждое слово этого короткого массива на предмет присутствия в других массивах. вот и все.
самое сложное тут пожалуй разбить правильно на предложения и на слова, чтобы слова были без всяких дополнительных знаков вроде запятих, точек и т.п.
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
21.03.2013, 22:17  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #6
Теория, парни, понятная, но вот на практике - Я пока без практики, тут и завис. Может у кого примеры кода есть?
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
21.03.2013, 22:23     Файлы. Найти слово, встречающееся в каждом предложении #7
Нахождение слов
И подсчет слов в предложении
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.03.2013, 02:31     Файлы. Найти слово, встречающееся в каждом предложении #8
Ну, вот такой вариант:
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
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
 
int main() 
{
    setlocale (0, "Russian");
    std::ifstream ifs("D:/file.txt");
    if (ifs.is_open())
    {
        std::vector<std::string> lines;
        std::string temp;
        std::istringstream iss;
        std::map<std::string, unsigned> map;
        unsigned countOfLines = 0;      //количество строк
        
        while (std::getline(ifs, temp, '\n'))
        {
            iss.str(temp);
            lines.assign(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>()); //закидываем слова с строки в массив
            std::sort(lines.begin(), lines.end());
            lines.erase(std::unique(lines.begin(), lines.end()), lines.end());  //удаляем повторяющиеся слова; теперь в строке только неповторяющиеся слова
            
            for (auto& str : lines) map[str]++; //все слова запихиваем в карту
            
            countOfLines++;
            iss.clear();
        }
        
        for (auto it = map.begin(), end = map.end(); it != end; ++it)
        {
            if ((*it).second == countOfLines)   //если слово равно количеству строк в тексте, значит оно встречается в каждой строке
            {
                std::cout<<"Да, во всех строках есть хотя бы одно повторяющиеся слово: \""<<(*it).first<<"\"\n\n";
                return 0;
            }
        }
        std::cout<<"Нет, во всех строках нет повторяющихся слов\n\n";
       
    }
    else
        std::cout<<"Error opening file.\n";
    
    return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
22.03.2013, 02:50     Файлы. Найти слово, встречающееся в каждом предложении #9
На самом деле, это задание легко решается с помощью множеств. Достаточно находить пересечения множества слов каждого из предложений с результирующим множеством изначально инициализированным словами первого предложения. Таким, образом, либо в результирующем множестве останутся только общие для всех предложений слова, либо, если таких слов нет, на одном из шагов оно станет пустым.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.03.2013, 11:49     Файлы. Найти слово, встречающееся в каждом предложении #10
rangerx, Резонно.
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
#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <iterator>
#include <algorithm>
 
#include <boost/algorithm/string.hpp>
 
int main()
{
   std::ifstream ifs("file.txt");
   std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
   boost::replace_all(str, "\n", "");
   std::vector<std::string> sentences;
   boost::split(sentences, str, boost::is_any_of(".?!"), boost::token_compress_on);
   if (sentences.back().empty())
   {
      sentences.pop_back();
   }
   std::vector<std::vector<std::string>> words;
   std::for_each(sentences.begin(), sentences.end(), [&words](const std::string& sentence)
   {
      std::vector<std::string> local;
      boost::split(local, sentence, boost::is_any_of(" ,:"), boost::token_compress_on);
      words.emplace_back(std::move(local));
   });
   std::set<std::string> repeatable_words(words.at(0).begin(), words.at(0).end());
   for (auto pos = words.begin(); pos != words.end() && !repeatable_words.empty(); ++pos)
   {
      std::set<std::string> local(pos->begin(), pos->end());
      std::set<std::string> result;
      std::set_intersection(repeatable_words.begin(), repeatable_words.end(), local.begin(), local.end(),
      std::inserter(result, result.end()));
      repeatable_words = result;
   }
   if (repeatable_words.empty())
   {
      std::cout << "There is no repeatable words in file" << std::endl;
   }
   else
   {
      std::copy(repeatable_words.begin(), repeatable_words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
   }
}
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
22.03.2013, 22:24  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #11
Парни, спасибо за поддержку. Когда напишу свою первую мега-программу, вспомню всех, кто помогал. ))))))))
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
23.03.2013, 20:12  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #12
Выдает такие ошибки при компиляции. Как исправить?
Файлы. Найти слово, встречающееся в каждом предложении


Цитата Сообщение от yuron_477 Посмотреть сообщение
Ну, вот такой вариант:
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
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
 
int main() 
{
    setlocale (0, "Russian");
    std::ifstream ifs("D:/file.txt");
    if (ifs.is_open())
    {
        std::vector<std::string> lines;
        std::string temp;
        std::istringstream iss;
        std::map<std::string, unsigned> map;
        unsigned countOfLines = 0;      //количество строк
        
        while (std::getline(ifs, temp, '\n'))
        {
            iss.str(temp);
            lines.assign(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>()); //закидываем слова с строки в массив
            std::sort(lines.begin(), lines.end());
            lines.erase(std::unique(lines.begin(), lines.end()), lines.end());  //удаляем повторяющиеся слова; теперь в строке только неповторяющиеся слова
            
            for (auto& str : lines) map[str]++; //все слова запихиваем в карту
            
            countOfLines++;
            iss.clear();
        }
        
        for (auto it = map.begin(), end = map.end(); it != end; ++it)
        {
            if ((*it).second == countOfLines)   //если слово равно количеству строк в тексте, значит оно встречается в каждой строке
            {
                std::cout<<"Да, во всех строках есть хотя бы одно повторяющиеся слово: \""<<(*it).first<<"\"\n\n";
                return 0;
            }
        }
        std::cout<<"Нет, во всех строках нет повторяющихся слов\n\n";
       
    }
    else
        std::cout<<"Error opening file.\n";
    
    return 0;
}
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
23.03.2013, 20:23  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #13
Юзаю VS2010/
Выдаёт такое:
Файлы. Найти слово, встречающееся в каждом предложении

Цитата Сообщение от ForEveR Посмотреть сообщение
rangerx, Резонно.
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
#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <iterator>
#include <algorithm>
 
#include <boost/algorithm/string.hpp>
 
int main()
{
   std::ifstream ifs("file.txt");
   std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
   boost::replace_all(str, "\n", "");
   std::vector<std::string> sentences;
   boost::split(sentences, str, boost::is_any_of(".?!"), boost::token_compress_on);
   if (sentences.back().empty())
   {
      sentences.pop_back();
   }
   std::vector<std::vector<std::string>> words;
   std::for_each(sentences.begin(), sentences.end(), [&words](const std::string& sentence)
   {
      std::vector<std::string> local;
      boost::split(local, sentence, boost::is_any_of(" ,:"), boost::token_compress_on);
      words.emplace_back(std::move(local));
   });
   std::set<std::string> repeatable_words(words.at(0).begin(), words.at(0).end());
   for (auto pos = words.begin(); pos != words.end() && !repeatable_words.empty(); ++pos)
   {
      std::set<std::string> local(pos->begin(), pos->end());
      std::set<std::string> result;
      std::set_intersection(repeatable_words.begin(), repeatable_words.end(), local.begin(), local.end(),
      std::inserter(result, result.end()));
      repeatable_words = result;
   }
   if (repeatable_words.empty())
   {
      std::cout << "There is no repeatable words in file" << std::endl;
   }
   else
   {
      std::copy(repeatable_words.begin(), repeatable_words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
   }
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
23.03.2013, 20:34     Файлы. Найти слово, встречающееся в каждом предложении #14
Ну, в первом варианте попробуйте заменить строчку на это:
C++
1
for (unsigned i = 0; i<lines.size(); ++i) map[lines[i]]++; //все слова запихиваем в карту
или обновите студию. Во втором нужна установка Boost.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2013, 20:37     Файлы. Найти слово, встречающееся в каждом предложении
Еще ссылки по теме:

C++ Дан текст. Найти слово встречающееся в каждом предложении или сообщить что такого слова нет
C++ Текстовые файлы. Определить, в каком по счету предложении впервые встретилось заданное слово

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

Или воспользуйтесь поиском по форуму:
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
23.03.2013, 20:37  [ТС]     Файлы. Найти слово, встречающееся в каждом предложении #15
Да, теперь успешно. Спасибо еще раз )) Вопрос: а в чем была причина? с auto не сталкивался пока толком...
Yandex
Объявления
23.03.2013, 20:37     Файлы. Найти слово, встречающееся в каждом предложении
Ответ Создать тему
Опции темы

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