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

Символьная длина предложения

19.01.2016, 15:31. Показов 2843. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем нужно написать программу для выведения 10 самых длинных предложений (по количеству символов) из текстового файла.
Я понимаю алгоритм создания, то есть
1: Посчитаем кол-во элементов строки до точки.
2: Если точка записываем кол-во символов в массив.
3: После точки считываем следующее предложение.
4: Повторяем процедуру до конца файла
5: Извлекаем из массива 10 самых больших элементов.
Но у меня не хватает знания языка чтобы это реализовать, бывалые, можете помочь?
Написал вот это, но опять же, не хватает знаний,для того чтобы все это воплотить в программу прошу помощи.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void FileProc(char *fname) //Функция обработки файла
{
    char *bufstr, b; //определение самого длинного предложения в файле и кол во символов в нем для того чтобы можно было спокойно перемещать в bufstr 
    FILE *f = fopen(fname, "rt");       // открыть файловый поток для чтения исходного файла 
    while (!feof(f))                // пока не конец файла (ищем кол-во символов в самом длинном предложении) 
    {
        b = fgetc(f);   // считывание символа из файла в переменную b
        kol_sim++;
        if (b == '.')
        {
            
        }
    }
    fclose(f);                  // закрываем файловый поток f
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2016, 15:31
Ответы с готовыми решениями:

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

Дано два предложения (Распечатать слова из первого предложения, который начинаются на первую букву последнего слова второго предложения)
Дано два предложения. Распечатать: - слова из первого предложения, который начинаются на первую букву последнего слова второго...

Создать файл, содержащий текст, длина которого не превышает 700 символов (длина
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 700 символов (длина строки текста не должна...

15
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
19.01.2016, 15:44
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

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
struct d {
    string text;
    int Count;
};
int main() {
    
    const int N = 15;//допустим всего 15 предложений
    d data[N];
    int i = 0;
    //открываете файл и тд
    string buf1;
    char buf2;
    while (!feof(f)) {
        buf2 = fgets(f);
        kol_sim++;
        if (buf2 != '.') {
            buf1 += buf2;
        }
        else {
            data[i].text = buf1;
            data[i].Count = kol_sim;
            i++;
        }
        kol_sim = 0;
        buf1.clear();
    }
    //сортировка (по убыванию) структуры по полю count и вывод результатов
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
19.01.2016, 17:09  [ТС]
А можно с комментариями, чтобы я разобрался

Добавлено через 1 час 6 минут
И да не понимаю как сделать сортировку
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
19.01.2016, 17:15
нужно как то хранить пару предложение и кол-во символов в нем ,структура хорошо подойдет ,можно на два массива заменить или pair или еще что-нибудь, так как мы считываем по символу ,а нам нужно запоминать предложения ,то будем их записывать в buf1 а затем в структуру. как сортировать структуру и прочее легко ищется на форуме или в интернетах.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
20.01.2016, 08:53  [ТС]
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
93
94
95
96
97
98
99
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
 
struct d {
    string Text;
    int Count;
    bool operator==(const d& struc) const
    {
        return
            Text== struc.Text &&
            Count == struc.Count;
    }
};
 
    void FileProc(char *fname) //Функция обработки файла
    {
        const int N = 15; //допустим всего 15 предложений
        d data[N];
        int i = 0;
        string buf1;
        char buf2;
        int kol_sim = 0;
        FILE *f = fopen(fname, "rt");       // открыть файловый поток для чтения исходного файла 
        while (!feof(f))                    // пока не конец файла (ищем кол-во символов в самом длинном предложении) 
        {
            buf2 = fgetc(f);    // считывание символа из файла в переменную b
            kol_sim++;
            if (buf2 != '.')
            {
                buf1 += buf2;
            }
            else
            {
                data[i].Text = buf1;
                data[i].Count = kol_sim;
                i++;
            }
            kol_sim = 0;
            buf1.clear();
        }
        //сортировка (по убыванию) структуры по полю count и вывод результатов
        vector<d> v;
        cout << "Сортировка по числу символов" << endl;
        sort(v.begin(), v.end(), [](const d& a, const d& b){
            return a.Count < b.Count; });
            for (auto& d : v)
                cout << d.Text << d.Count << endl; 
                fclose(f);
}
void main(int argc, char *argv[])
{
    setlocale(LC_ALL, "russian");
    bool such = true, povt = true;      // Переменные для проверки файлов
    clock_t StartTime, EndTime; // Время начала и завершения
    // обработки
    StartTime = clock();            // Запомнили время начала обработки
    if (argc <1)                // Если не указаны файлы, то вывести сообщение об ошибке
    {
        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;           // Проверка и установка признака ошибки повтора файлов
            }
            FILE *f = fopen(argv[i], "rt");// Открыть файл для проверки
            if (f)
                fclose(f);      // Если открыт, то закрыть 
            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();
}
Получилось это, но программа не работает, вылетает.

Добавлено через 53 минуты
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
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
#pragma warning(disable:4996)
using namespace std;
 
struct d {
    string Text;
    int Count;
};
struct Cmp
{
    bool operator()(const d& a, const d& b) const
    {
        return a.Count > b.Count;
    }
};
 
    void FileProc(char *fname) //Функция обработки файла
    {
        const int N = 15; //допустим всего 15 предложений
        d data[N];
        int i = 0;
        string buf1;
        char buf2;
        int kol_sim = 0;
        FILE *f = fopen(fname, "rt");       // открыть файловый поток для чтения исходного файла 
        while (!feof(f))                    // пока не конец файла (ищем кол-во символов в самом длинном предложении) 
        {
            buf2 = fgetc(f);    // считывание символа из файла в переменную b
            kol_sim++;
            if (buf2 != '.')
            {
                buf1 += buf2;
            }
            else
            {
                data[i].Text = buf1;
                data[i].Count = kol_sim;
                i++;
            }
            kol_sim = 0;
            buf1.clear();
        }
        fclose(f);
        //сортировка (по убыванию) структуры по полю count и вывод результатов
        vector<d> v;
        cout << "Сортировка по числу символов" << endl;
        sort(v.begin(), v.end(), Cmp());
        for (auto& d : v)
            cout << d.Text << d.Count << endl;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
20.01.2016, 11:14
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//нужно написать программу для выведения 10 самых длинных предложений
//(по количеству символов) из текстового файла.
//1: Посчитаем кол-во элементов строки до точки.
//2: Если точка записываем кол-во символов в массив.
//3: После точки считываем следующее предложение.
//4: Повторяем процедуру до конца файла
//5: Извлекаем из массива 10 самых больших элементов.
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
///////////////////////////////////////////////////////////////////////////////
const   char    POINT_SYMB          =   '.';
const   int     SENTENCES_COUNT     =   10;
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
///////////////////////////////////////////////////////////////////////////////
struct  T_size_bigger
{
    //-------------------------------------------------------------------------
    bool    operator()
        (
            T_str   const   &   L,
            T_str   const   &   R
        )
    {
        return      L.size()
                >   R.size();
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
typedef std::multiset
    <
        T_str,
        T_size_bigger
    >
    T_sentences;
///////////////////////////////////////////////////////////////////////////////
T_str   get_format_sentence( T_str  const   &   sentence )
{
    return      T_str   (
                            ++std::adjacent_find
                                (
                                    sentence.begin  (),
                                    sentence.end    (),
 
                                    []              (
                                                        auto    L,
                                                        auto    R
                                                    )
                                    {
                                        return          std::isspace(L)
                                                &&  !   std::isspace(R);
                                    }
                                ),
 
                            sentence.end()
                        )
 
            +   POINT_SYMB;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    const   T_str   IFILE_NAME  =   "i.txt";
    std::ifstream   ifile( IFILE_NAME );
 
    if( !ifile )
    {
        std::cout   <<  "Error!"
                    <<  std::endl;
 
        exit(0);
    }
 
    T_sentences     sentences;
    T_str           sentence;
 
    while   (
                getline (
                            ifile,
                            sentence,
                            POINT_SYMB
                        )
            )
    {
        sentences.insert
            (
                get_format_sentence( sentence )
            );
    }
 
    std::copy_n
        (
            sentences.begin(),
            SENTENCES_COUNT,
            std::ostream_iterator< T_str >   (std::cout, "\n")
        );
 
    std::cout   <<  std::endl;
}
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
20.01.2016, 12:31
47 и 48 строку надо засунуть в else после 44 ,а то единицу и один символ всегда присваивать будем

Добавлено через 2 минуты
вы создаете вектор структур который в 52 ,на самом деле он пуст ,это тоже самое что создать новый массив ,нужно data сортировать
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
20.01.2016, 16:27  [ТС]
C++
1
2
3
4
5
T_str   get_format_sentence(T_str  const   &   sentence)
{
    return T_str(++adjacent_find(sentence.begin(), sentence.end(), [](auto &L, auto R){return  isspace(L) && !std::isspace(R);}),sentence.end())
        + POINT_SYMB;
}
Тип auto здесь не разрешен.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
23.01.2016, 16:15  [ТС]
Вопрос а если в тексте не 15 предложений а там 300 или еще больше, через динамический массив? или как:
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
23.01.2016, 16:41
Subatik, если кол-во заранее не известно ,то можно использовать vector
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
25.01.2016, 15:33  [ТС]
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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.01.2016, 19:50
Цитата Сообщение от Subatik Посмотреть сообщение
Тип auto здесь не разрешен.
С++14 надо.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
25.01.2016, 21:50  [ТС]
А можете комментари подписать к вашему коду, очень интересно но не понимаю например для чего typdef и все внутри него нужно.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.01.2016, 22:26
Цитата Сообщение от Subatik Посмотреть сообщение
А можете комментари подписать к вашему коду, очень интересно но не понимаю например для чего typdef и все внутри него нужно.
Если это ко мне вопрос, то T_sentences - это мультимножество строк, которое отсортировано по убыванию их размера.
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
26.01.2016, 10:28  [ТС]
Да к вам, а можно коментарии к каждой строке, посижу разберусь, хотя бы краткие

Добавлено через 7 часов 52 минуты
Не надо, разобрался за ночь)
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 20
27.01.2016, 12:40  [ТС]
Вам спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.01.2016, 12:40
Помогаю со студенческими работами здесь

Длина пятого и длина последнего слова в строке
Как определить длину пятого слова в строке и длину последнего слова в строке.

Ввести предложения. Вывести слова предложения, чередуя уровне яркости символов
Ввести предложения. Вывести слова предложения, чередуя уровне яркости символов. Спасибо за Внимание !

Разделить текст на предложения, предложения на слова. (через двумерный массив строк)
Задача заключается в том, что надо разделить текст на предложения, предложения на слова. Решил сделать это через двумерный массив...

Вывести слово с номером K заданного предложения, считая с конца предложения
Вывести слово с номером K заданного предложения, считая с конца предложения. Приблизительное решение есть.. Только вот не работает...

Даны два предложения. Определить слова первого предложения, которые имеются во втором
///


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru