Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
#1

Вывести 10 самых длинных (по числу символов) предложений - C++

13.01.2016, 04:11. Просмотров 440. Ответов 18
Метки нет (Все метки)

Ребят программисты помогите, понимаю что программа легкая.
Но не могу сделать.
Текст надо считать из файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2016, 04:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывести 10 самых длинных (по числу символов) предложений (C++):

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

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

Найти 5 самых длинных слов
Как найти 5 самых длинных слов? #include "stdafx.h" #include "windows.h"...

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

Найти 50 самых длинных слов в файле
Здравствуйте! Буду благодарна за помощь) Нужно в большом файле с текстом...

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

18
SuperKir
336 / 331 / 242
Регистрация: 10.03.2015
Сообщений: 1,388
Завершенные тесты: 1
13.01.2016, 11:16 #2
Предложение ограничено точкой или каждое предложение на каждой строке?
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
13.01.2016, 16:41 #3
Цитата Сообщение от SuperKir Посмотреть сообщение
ограничено точкой
Ещё бывают восклицательные и вопросительные предложения. И многоточием ещё иногда предложение заканчивается.
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
13.01.2016, 19:11 #4
Примерный вариант.
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
#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {
    ifstream file( "file.txt" );
    vector<string> vec;
    string str;
    while( !file.eof() ) {
        getline(file,str);
        do {
            auto pos = find(str.begin(),str.end(),'.');
            string str2;
            if( pos != str.end() ) {
                str2 = str.substr(0,pos);
            }
            else {
                vec.push_back(str2);
            }
        } while( find(str.begin(),str.end(),'.') != str.end() );
    }
    sort(vec.begin(),vec.end(), [] (string str1,string str2) { return str1.size() < str2.size() } );
    auto pos = vec.rend();
    for( int i = 0; i < 10; i++,++pos ) {
        cout << *pos << endl;
    }
    return 0;
}
0
SuperKir
14.01.2016, 00:10
  #5

Не по теме:

gru74ik, не это важно ;)

0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
14.01.2016, 14:33 #6
Цитата Сообщение от SuperKir Посмотреть сообщение
gru74ik, не это важно
Для программы важно. Надо указать все виды делимитера (ограничителя предложения).
0
SuperKir
14.01.2016, 14:44
  #7

Не по теме:

gru74ik, боже... естественно, при написании учитывать все. К чему эти придирки? Нужно лишь было узнать, каковы границы предложений, знаковые или строчные..

0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
14.01.2016, 18:34  [ТС] #8
Суть понял, но ругается на сорт, не определен идентификатор
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
14.01.2016, 18:48 #9
Subatik, Да, тут моя ошибка, подключите <algorithm>.
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
14.01.2016, 18:52  [ТС] #10
Сейчас я её модифицирую так как хочу, знаю что в любом случае будут ошибки, потому что пока начинающий в C++ проверите и поможете исправить?
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
14.01.2016, 18:55 #11
Subatik, Постараюсь, но ничего не обещаю.
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 11:11  [ТС] #12
Вообщем не могу что то то я, еще вопрос, можно ли это как то в ф-ю положить и вызывать уже в main?
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
15.01.2016, 11:29 #13
Subatik,
Вообщем не могу что то то я
Опишите конкретно задачу, я помогу или скажите, что именно вы не можете.
можно ли это как то в ф-ю положить и вызывать уже в main?
Да, конечно.
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 12:07  [ТС] #14
Ну вот смотрите, я хочу сделать из этого ф-ю. Условно назовем её "обработка файла".
Я пробывал и просто запускать ваш вариант, кстати в строке str2 = str.substr(0,pos); показывает ошибку, правильно ли я сделал что перед pos добавил sizeof? Пробывал свой так называемый запустить, тоже тщетно, он либо в темный экран встает(консоль ничего не делает) либо вылетает прекращая работу.

Добавлено через 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
//Разбить файл на два: в один поместить четные строки, в другой - нечетные
 
#include "StdAfx.h"
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
using namespace std;
 
void FileProc(char *fname) //Функция обработки файла
{
char *bufstr,b;//определение самой длиной строки в файле и кол во символов в ней для    того чтобы можно было спокойно перемещать в bufstr построчно
    int kol_sim_max=0,kol_sim=0,sh=strlen(fname),sh1=sh+7,c=1;
    FILE *f=fopen(fname,"rt");      // открыть файловый поток для
// чтения исходного файла 
while(!feof(f))             // пока не конец файла(ищем кол-во 
// символов в самой длиной строчке) 
        {
            b=fgetc(f);     // считывание символа из файла
// переменную b
            kol_sim++;          
            if(b=='\n'||feof(f))    
            {
                if(kol_sim_max<kol_sim)kol_sim_max=kol_sim;
                kol_sim=0;
            }
        }
    fclose(f);                  // закрываем файловый поток f
    bufstr=new char[kol_sim_max];
    char *fname1=new char[sh1];
    strcpy(fname1,fname);// Копирование имени файла в переменную Имени файла-результата1
    strcat(fname1,"-1.txt");
    FILE *f1=fopen(fname1,"wt");
    char *fname2=new char[sh1];
    strcpy(fname2,fname); // Копирование имени файла в переменную Имени файла-результата2
    strcat(fname2,"-2.txt");
    FILE *f2=fopen(fname2,"wt");
    FILE *fish=fopen(fname,"rt");
    while(!feof(fish))
        {
            fgets (bufstr,kol_sim_max,fish);
            if (!feof(fish))
            {
                if ((c % 2)==0)
                    fputs (bufstr,f2);
                else
                    fputs (bufstr,f1);
            }
            c++;
        }
    fclose(fish);
    fclose(f1); 
    fclose(f2); 
    delete []fname2;
    delete []fname1;
    delete []bufstr;
    remove(fname);
}
Нашел вот что то по типу такого, пытался как то внедрить ваш код, тщетно.
Хочу чтобы была функция на подобии этой но уже с "моими" условиями, то есть вывода 10 самых длинных предложений. И вопрос их можно например брать из одного текстовика в котором например большой текст и клать в другой текстовик уже именно эти 10 предложений?

Добавлено через 23 минуты
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
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
clock_t StartTime, EndTime;
 
//Обработка файла
void FileProc(char * path){
    ifstream f(path);
    vector<string> vec;
    string str;
    while (!f.eof()) {
        getline(f, str);
        do{
            auto pos = find(str.begin(), str.end(), '.');
            string str2;
            if (pos != str.end()){
                str2 = str.substr(0, sizeof pos);
            }
            else{
                vec.push_back(str2);
            }
        } while (find(str.begin(), str.end(), '.') != str.end());
    }
    sort(vec.begin(), vec.end(), [](string str1, string str2)  { return str1.size() < str2.size(); });
    auto pos = vec.rend();
    for (int i = 0; i < 10; i++, ++pos) {
        cout << *pos << endl;
    }
    f.close();
}
void main(int argc, char *argv[])
{
    setlocale(0, "russian");
    bool such = true, povt = true;      // Переменные для проверки файлов
    clock_t StartTime, EndTime; // Время начала и завершения
    // обработки
    StartTime = clock();            // Запомнили время начала обработки
    if (argc <2)                // Если не указаны файлы, то вывести сообщение об ошибке
    {
        cout << "Не указаны файлы!!!\n";
    }
    else
    {
        for (int i = 1; i <= argc - 1; i++)
        {
            for (int j = i + 1; j <= argc - 1; j++)
            {
                if (stricmp(argv[i], argv[j]) == 0)
                    povt = false;           // Проверка и установка признака ошибки повтора файлов
            }
            ifstream f(argv[i]);
            if (f)
                f.close();      // Если открыт, то закрыть 
            else
                such = false;   // Иначе установить признак ошибки отсутствия файлов
        }
        if (such == false || povt == false) // Если файл не существует или есть повторяющиеся имена файлов 
        {
            if (such == false)  // Если файл не существует, то вывести 
                cout << "Какого-то файла не существует\n";
            else                // Иначе вывести 
                cout << "Имена каких-то файлов совпадают\n";
        }
        else
        for (int i = 1; i <= argc - 1; i++)
        {
            FileProc(argv[i]);  //Вызов функции обработки файла
        }
    }
    EndTime = clock();              // Запомнили время окончания обработки
        cout << "Elapsed Time " << (EndTime - StartTime) << " ms" << endl; //Вывод продолжительности обработки и завершение программы
    getch();
}
Вот что пытался сделать я
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
15.01.2016, 12:13 #15
Subatik,
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
void f() {
    ifstream file( "file.txt" );
    vector<string> vec;
    string str;
    while( !file.eof() ) {
        getline(file,str);
        do {
            auto pos = find(str.begin(),str.end(),'.');
            string str2;
            if( pos != str.end() ) {
                str2.resize(str.size());
                copy(str.begin(),pos,str2.begin());
                vec.push_back(str2);
            }
            else {
                vec.push_back(str);
            }
        } while( find(str.begin(),str.end(),'.') != str.end() );
    }
    sort(vec.begin(),vec.end(), [] (string str1,string str2) { return str1.size() < str2.size(); } );
    auto pos = vec.rend();
    for( int i = 0; i < 10; i++,++pos ) {
        cout << *pos << endl;
    }
}
 
int main() {
    f();
    cin.get();
    return 0;
}
Вот вынесли в функцию и теперь должно всё без ошибок компилироваться.
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 13:55  [ТС] #16
Цитата Сообщение от gru74ik Посмотреть сообщение
Для программы важно. Надо указать все виды делимитера (ограничителя предложения).
Это в строке цикла настраивается
auto pos = find(str.begin(), str.end(), '.' || '!' || '?' || '/n' );
примерно так?
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 19:16  [ТС] #17
То ли я такой глупый то ли что, да она компилируется но почему программа просто встает в ноль.
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
 
void f() {
    ifstream file;
    vector<string> vec;
    string str;
    file.open("test.txt");
    if (!file) cout << "Can't open file";
    else{
        cout << "Open file";
        while (!file.eof()) {
            getline(file, str);
            do {
                auto pos = find(str.begin(), str.end(), '.');
                string str2;
                if (pos != str.end()) {
                    str2.resize(str.size());
                    copy(str.begin(), pos, str2.begin());
                    vec.push_back(str2);
                }
                else {
                    vec.push_back(str);
                }
            } while (find(str.begin(), str.end(), '.' ) != str.end());
        }
        sort(vec.begin(), vec.end(), [](string str1, string str2) { return str1.size() < str2.size(); });
        auto pos = vec.rend();
        for (int i = 0; i < 10; i++, pos++) {
            cout << *pos << endl;
        }
    }
}
int main() {
    f();
    cin.get();
    return 0;
}
Она у вас сама работает, ну то есть на вашем компьютере?
Извините что кажусь таким бездарным
Текст в файле и вдоль и поперек редактировал и с переносом и без.
0
Миниатюры
Вывести 10 самых длинных (по числу символов) предложений  
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
15.01.2016, 19:57 #18
Subatik, В общем вот что набросал, я проверил, должно работать, но дальше разберётесь сами, у меня просто нету много времени, чтобы вам помогать. Извините уж.
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
void f() {
    ifstream file( "file.txt" );
    vector<string> vec;
    string str;
    string str2 = "";
    while( !file.eof() ) {
        getline(file,str);
        if( str.size() != 0 )
            vec.push_back(str);
    }
    for( auto& i : vec ) {
        if( find(i.begin(),i.end(),'.') != i.end() ) {
            string str = i;
            str.erase(str.begin(),find(str.begin(),str.end(),'.')+1);
            vec.push_back(str);
            i.erase(find(i.begin(),i.end(),'.'),i.end());
        }
    }
    sort(vec.begin(),vec.end(),[] (string str1,string str2) { return str1.size() < str2.size(); } );
    cout << *--vec.end() << endl;
    for( const auto& i : vec ) {
        cout << i << endl;
    }
}
 
int main() {
    f();
    cin.get();
    return 0;
}
0
Subatik
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
20.01.2016, 12:21  [ТС] #19
[](
auto L,
auto R
)
тип авто не разрешен
0
20.01.2016, 12:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2016, 12:21
Привет! Вот еще темы с решениями:

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

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

Функция, ввести произвольный текст и получить фразу из самых длинных слов
Надо разработать функцию нахождения самого длинного слова в строке, ввести...

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


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

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

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