Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
1

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

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

Author24 — интернет-сервис помощи студентам
Ребят программисты помогите, понимаю что программа легкая.
Но не могу сделать.
Текст надо считать из файла.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2016, 04:11
Ответы с готовыми решениями:

Обработка текстовых файлов. Вывести первую из самых коротких строк файла и последнюю из самых длинных
Дан текстовый файл f. Составить программу для вывода первой из самых коротких строк файла и...

Вывести гласные двух самых длинных слов
Здравствуйте уважаемые программисты. Мне была задана задача,я её решил,всё работает правильно но...

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

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

18
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
13.01.2016, 11:16 2
Предложение ограничено точкой или каждое предложение на каждой строке?
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
13.01.2016, 16:41 3
Цитата Сообщение от SuperKir Посмотреть сообщение
ограничено точкой
Ещё бывают восклицательные и вопросительные предложения. И многоточием ещё иногда предложение заканчивается.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
14.01.2016, 14:33 6
Цитата Сообщение от SuperKir Посмотреть сообщение
gru74ik, не это важно
Для программы важно. Надо указать все виды делимитера (ограничителя предложения).
0
SuperKir
14.01.2016, 14:44
  #7

Не по теме:

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

0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
14.01.2016, 18:34  [ТС] 8
Суть понял, но ругается на сорт, не определен идентификатор
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.01.2016, 18:48 9
Subatik, Да, тут моя ошибка, подключите <algorithm>.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
14.01.2016, 18:52  [ТС] 10
Сейчас я её модифицирую так как хочу, знаю что в любом случае будут ошибки, потому что пока начинающий в C++ проверите и поможете исправить?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.01.2016, 18:55 11
Subatik, Постараюсь, но ничего не обещаю.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 11:11  [ТС] 12
Вообщем не могу что то то я, еще вопрос, можно ли это как то в ф-ю положить и вызывать уже в main?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.01.2016, 11:29 13
Subatik,
Вообщем не могу что то то я
Опишите конкретно задачу, я помогу или скажите, что именно вы не можете.
можно ли это как то в ф-ю положить и вызывать уже в main?
Да, конечно.
0
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
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
15.01.2016, 13:55  [ТС] 16
Цитата Сообщение от gru74ik Посмотреть сообщение
Для программы важно. Надо указать все виды делимитера (ограничителя предложения).
Это в строке цикла настраивается
auto pos = find(str.begin(), str.end(), '.' || '!' || '?' || '/n' );
примерно так?
0
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;
}
Она у вас сама работает, ну то есть на вашем компьютере?
Извините что кажусь таким бездарным
Текст в файле и вдоль и поперек редактировал и с переносом и без.
Миниатюры
Вывести 10 самых длинных (по числу символов) предложений  
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
20.01.2016, 12:21  [ТС] 19
[](
auto L,
auto R
)
тип авто не разрешен
0
20.01.2016, 12:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2016, 12:21
Помогаю со студенческими работами здесь

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

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

Вывести количество символов/предложений в тексте
Дана строка chat text=&quot;hello world.is there text.&quot;;

Определение самых длинных слов в строке
Добрый день форумчани:) учусь совершенно не на информатической специальности,а задали сделать 3...


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

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