0 / 0 / 1
Регистрация: 19.06.2014
Сообщений: 100
1

Найти 50 самых длинных слов в файле

26.01.2015, 17:44. Показов 1668. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Буду благодарна за помощь)

Нужно в большом файле с текстом найти 50 самых длинных слов.
Кое что сделала, но есть вопросы:
1) не знаю, как сравнить длину очередного слова с длинами слов в массиве в функции is_longer, чтобы сработала remove_if.
2) fscanf разбивает на слова или нужно использовать что-то ещё.
3) и как вычлененное слово записать в text для дальнейшей работы.

Непосредственно код:

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
#include <algorithm>    // std::remove_if
#include "French.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
 
bool is_longer(string w)//функция, определяющая, какое слово длиннее
{
    int size_w = w.size();//длина пришедшего слова
    return(size_w > 3);
}
 
int main()
{
    string text;//текущее слово
 
    const int size=2;//колличество слов
 
    vector<string> words;//vector для хранения самых длинных слов
 
    int i = 0;
 
    FILE * pFile;
    pFile = fopen("Hugo.txt", "r");
 
    if (pFile == NULL)//если файл не открылся
    {
        perror("Error opening file");
    }
    else//если файл открылся
    {
        while (fscanf(pFile, "%s")!=EOF) // читаем слово пока не конец файла 
        {       
                while (i < size)//пока массив не заполнится
                {
                    words.push_back(text);//кладём слово в массив самых длинных слов
                    i++;
                }
                if (i >= size)//если заполнился, а новое слово длиннее, чем слова в массиве
                {
                    words.erase(remove_if(words.begin(), words.end(), is_longer), words.end());//если из longer пришла правда - удаляем короткое слово из массива и удаляем мусор с помощью erase
                    words.push_back(text);//т к элементы массива сдвинулись - место последнего освободилось
                    i++;
                }
        }
        fclose(pFile);//закрываем файл
    }
    return 0;
}
Заранее БОЛЬШОЕ спасибо за Ваше время!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2015, 17:44
Ответы с готовыми решениями:

Строки: найти первое из самых длинных и последнее из самых коротких слов и поменять их местами
Помогите написать прогу) 1. Строка состоит не менее чем из двух слов. Преобразовать её по...

Поиск самых длинных и комбинированных слов в файле
Здравствуйте. У меня есть такая задача: 1. Найти 2 самых длинных комбинированных слова 2. Найти...

Найти 5 самых длинных слов
Как найти 5 самых длинных слов? #include &quot;stdafx.h&quot; #include &quot;windows.h&quot; #include &lt;iostream&gt;...

В файле найти первую из самых длинных последовательностей соседних символов, состоящую только из цифр
Посмотрите что не так с моей задачей В существующем на диске файле найти первую из самых длинных...

6
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
26.01.2015, 19:47 2
Лучший ответ Сообщение было отмечено GalkaP как решение

Решение

Вот без древних функций:
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
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <locale>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
#include <set>
 
using std::cout;
using std::cin;
using std::endl;
using std::locale;
using std::string;
 
 
int main()
{
    locale::global(locale(""));
 
    std::set<string> words; // множество слов
    std::vector<string> w50; // 50 самых длиных слов
    string s;
    string d = " .,!?:;"; // разделители слов
 
    std::ifstream ifs("d:\\data.txt");
    if (!ifs)
    {
        cout << "Error opening file." << endl;
    }
    else
    {
        while (!ifs.eof())
        {
            getline(ifs, s);
            if (s.length() == 0) continue;
 
            size_t b = 0;
            size_t found = s.find_first_of(d);
            while (found != string::npos)
            {
                if (b < found) words.insert(s.substr(b, found - b));
                b = found + 1;
                found = s.find_first_of(d, found + 1);
            }
            if (b < s.length()) words.insert(s.substr(b, s.length() - b));
        }
 
        w50.resize(words.size());
        // скопировать слова из множества в массив
        std::copy(words.begin(), words.end(), w50.begin());
        // сортировать по убыванию длины
        std::sort(w50.begin(), w50.end(), [](string a, string b) { return a.length() > b.length() || (a.length() == b.length() && a < b); });
        // удалить лишние слова
        if (w50.size() > 50) w50.resize(50);
        // вывести на экран
        std::copy(w50.begin(), w50.end(), std::ostream_iterator<string>(cout, "\n"));
 
    }
 
 
    cout << endl;
    system("pause");
    return 0;
}
1
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
26.01.2015, 20:42 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
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <set>
 
using namespace std;
struct Lcompare : binary_function<string,string, bool> 
{ 
bool operator()(const string& p, const string& q) const 
{ 
  return p.size() > q.size(); 
} 
}; 
 
 
int main()
{
    multiset<string, Lcompare > words;
    ifstream ifs("dat1.txt");
    if (!ifs)
    {
        cout << "Error opening file." << endl;
    }
    else
    {
        while (!ifs.eof())
        {
            string s;
            ifs>>s;
            words.insert(s);
        }
       // вывести на экран
        multiset<string,Lcompare >::iterator it=words.begin();
        for(int i=1;i<=50 && it!=words.end();i++)
            cout<< *it++<<endl;
    } 
    system("pause");
    return 0;
}
1
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
26.01.2015, 21:19 4
zss, у тебя слова будут вместе со знаками препинания и повторы.
Упрощённый вариант:
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
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <locale>
#include <string>
#include <algorithm>
#include <sstream>
#include <set>
#include <functional>
 
using std::cout;
using std::cin;
using std::endl;
using std::locale;
using std::string;
 
 
int main()
{
    locale::global(locale(""));
 
    // множество слов
    std::set< string, std::function<bool (string, string)> > words([](string a, string b) { return a.length() > b.length() || (a.length() == b.length() && a < b); });
    string s;
    string d = " .,!?:;"; // разделители слов
 
    std::ifstream ifs("d:\\data.txt");
    if (!ifs)
    {
        cout << "Error opening file." << endl;
    }
    else
    {
        while (!ifs.eof())
        {
            getline(ifs, s);
            if (s.length() == 0) continue;
 
            size_t b = 0;
            size_t found = s.find_first_of(d);
            while (found != string::npos)
            {
                if (b < found) words.insert(s.substr(b, found - b));
                b = found + 1;
                found = s.find_first_of(d, found + 1);
            }
            if (b < s.length()) words.insert(s.substr(b, s.length() - b));
        }
 
        int j = 0;
        for (std::set< string, std::function<bool (string, string)> >::iterator i = words.begin(); i != words.end() && j < 50; ++i, ++j)
            cout << *i << endl;
 
    }
 
 
    cout << endl;
    system("pause");
    return 0;
}
1
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
26.01.2015, 21:49 5
nmcf, а под VS 2008 могли бы подправить?
Мой компилятор ругается на function в 23 строке.
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
26.01.2015, 22:05 6
Наверное так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool fn(string a, string b)
{
    return a.length() > b.length() || (a.length() == b.length() && a < b);
}
 
 
int main()
{
//...
    std::set< string, bool(*)(string, string) > words(fn);
//...
        for (std::set< string, bool(*)(string, string) >::iterator i = words.begin(); i != words.end() && j < 50; ++i, ++j)
//...
1
0 / 0 / 1
Регистрация: 19.06.2014
Сообщений: 100
27.01.2015, 00:12  [ТС] 7
Спасибо всем большое)))
Разобралась и кое что новое узнала)
0
27.01.2015, 00:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 00:12
Помогаю со студенческими работами здесь

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

Сформируйте новую строку из пяти самых длинных слов.
Дана строка слов, разделенных пробелами, запятыми, точками. Сформируйте новую строку из пяти самых...

Удалить из файла строчки содержащие несколько самых длинных слов
Подскажите как это можно сделать.

Найти два самых длинных слова, которые полностью состоят из более коротких слов того же массива
Задача такая. Дан набор слов. Слово это не смысловая единица, а просто набор символов. Если что, их...

Найти одно из самых длинных слов в текстовом файле
Напишите программу, находящую одно из самых длинных слов в текстовом файле. Под словом понимается...

Найти количество самых длинных слов в тексте
Найти количество самых длинных слов в тексте (текст взять из текстового файла)


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru