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

Разбить текст на страницы - C++

Восстановить пароль Регистрация
 
Preston
81 / 3 / 1
Регистрация: 09.09.2014
Сообщений: 17
06.01.2016, 19:20     Разбить текст на страницы #1
Дан текстовый файл. Преобразовать его, разбив текст на страницы и пронумеровав их, причем номер нечетной страницы должен размещаться в правом нижнем углу, а номер четной страницы - в ее левом нижнем углу. Число стока странице задается, а ширина страницы определяется самой длинной строкой в данной странице. Конец страницы отмечается символом с кодом 12, который помещается в отдельной строке.

Добавлено через 6 часов 0 минут
ну очень надо

Добавлено через 17 часов 1 минуту
Хотя бы алгоритм, код сам запилю. И какие процедуры и подпрограммы использовать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kuza84
-4 / 23 / 4
Регистрация: 25.04.2013
Сообщений: 195
07.01.2016, 04:18     Разбить текст на страницы #2
Цитата Сообщение от Preston Посмотреть сообщение
ну очень надо
не знаю кто вам такое дурацкое задание дал, но есть текстовые процессоры типа Ворда там все можно сделать, даже шаблон можно сделать, чтобы каждый открываемый текст так форматировался.

Добавлено через 3 минуты
а символ 12 являлся символом конца страницы, заставляя принтер выплюнуть текущий лист бумаги и загрузить новый.
поищите шаблон чтобы сплошной текст форматировался в книжный формат
Preston
81 / 3 / 1
Регистрация: 09.09.2014
Сообщений: 17
07.01.2016, 04:33  [ТС]     Разбить текст на страницы #3
Проблема в том, что я только только начал С++ изучать. И даже не понимаю про какие текстовые процессоры вы говорите =( даже если посмотреть их, проблема реализации в С++ остаётся.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
07.01.2016, 21:57     Разбить текст на страницы #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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
Дан текстовый файл. Преобразовать его, разбив текст на страницы и пронумеровав их,
причем номер нечетной страницы должен размещаться в правом нижнем углу, а номер четной
страницы - в ее левом нижнем углу. Число стока странице задается, а ширина страницы
определяется самой длинной строкой в данной странице. Конец страницы отмечается символом
с кодом 12, который помещается в отдельной строке.
*/
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                     T_str;
typedef T_str                           T_line;
typedef std::vector     < T_line    >   T_lines;
///////////////////////////////////////////////////////////////////////////////
class  T_page
{
    //-------------------------------------------------------------------------
    static  const   char    END_PAGE_SYMB   =   12;
    T_lines                 lines_;
    //-------------------------------------------------------------------------
public:
    //-------------------------------------------------------------------------
    static  int             lines_per_page_;
    static  int             page_counter_;
    //-------------------------------------------------------------------------
    friend
    std::istream    &   operator>>
        (
            std::istream    &   istr,
            T_page          &   page
        )
    {
        page.lines_.clear();
        size_t  max_line_size{};
        T_line  cur_line;
 
        for (
                int  i{};
 
                    i   <   lines_per_page_
                &&  getline( istr, cur_line );
 
                ++i
            )
        {
            max_line_size  =   std::max     (
                                                max_line_size,
                                                cur_line.size()
                                            );
 
            page.lines_.push_back( cur_line );
        }//for
 
        auto    page_num_line   =   std::to_string( ++page_counter_ );
 
        if( page_counter_ % 2 == 1 )
        {
            page_num_line   =       T_line  (
                                                    max_line_size
                                                -   page_num_line.size(),
 
                                                ' '
                                            )
 
                                +   page_num_line;
        }
 
        page.lines_.push_back( page_num_line );
 
        page.lines_.push_back
            (
                T_str   (
                            1,
                            END_PAGE_SYMB
                        )
            );
 
        return  istr;
    }
    //-------------------------------------------------------------------------
    friend
    std::ostream    &   operator<<
        (
            std::ostream            &   ostr,
            T_page          const   &   page
        )
    {
        std::copy
            (
                page.lines_.begin                   (),
                page.lines_.end                     (),
                std::ostream_iterator< T_line >     ( ostr, "\n" )
            );
 
        return  ostr;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
int     T_page::lines_per_page_;
int     T_page::page_counter_;
///////////////////////////////////////////////////////////////////////////////
void    print_formatted_text_from_stream_to_stream_with_lines_per_page
    (
        std::istream    &   istr,
        std::ostream    &   ostr,
        int                 lines_per_page
    )
{
    T_page::lines_per_page_     =   lines_per_page;
    T_page::page_counter_       =   0;
 
    std::copy
        (
            std::istream_iterator< T_page >     ( istr  ),
            std::istream_iterator< T_page >     (),
            std::ostream_iterator< T_page >     ( ostr  )
        );
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_str   const   IFILE_NAME          =   "i.txt";
    T_str   const   OFILE_NAME          =   "o.txt";
 
    std::ifstream   ifile( IFILE_NAME   );
    std::ofstream   ofile( OFILE_NAME   );
 
    if( ifile )
    {
        print_formatted_text_from_stream_to_stream_with_lines_per_page
            (
                ifile,
                ofile,
                3
            );
 
        std::cout   <<  "File is filled."
                    <<  std::endl;
    }
    else
    {
        std::cout   <<  "Error!"
                    <<  std::endl;
    }//else
 
    system("pause");
}
Preston
81 / 3 / 1
Регистрация: 09.09.2014
Сообщений: 17
07.01.2016, 23:13  [ТС]     Разбить текст на страницы #5
Mr.X, Я очень благодарен Вам. Это раздел C++ для начинающих, а код выглядит профессионально. Я понимаю от силы несколько алгоритмов. Могу я Вас попросить добавить хотя бы несколько комментариев, остальное я попробую разобрать сам. Я буду очень признателен.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
07.01.2016, 23:29     Разбить текст на страницы #6
Цитата Сообщение от Preston Посмотреть сообщение
Это раздел C++ для начинающих, а код выглядит профессионально.
А начинающий это какой? Который STL не использует? Страуструп с вами не согласен! Он про библиотеку шаблонов уже в первых главах своей книги пишет. А те "начинающие", которые на Си кропают, и должны в сишный раздел идти, я считаю.
Ваша задача на работу с потоками, здесь для них используется только алгоритм std::copy и перегрузка операторов << и >> ввода-вывода в поток.
SergioO
 Аватар для SergioO
89 / 178 / 61
Регистрация: 13.12.2015
Сообщений: 968
07.01.2016, 23:32     Разбить текст на страницы #7
Цитата Сообщение от Preston Посмотреть сообщение
роблема в том, что я только только начал С++ изучать. И даже не понимаю про какие текстовые процессоры
и тут
Цитата Сообщение от Mr.X Посмотреть сообщение
C++
1
2
3
4
5
6
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
08.01.2016, 00:27     Разбить текст на страницы #8
SergioO, ну так С++ в заголовочных файлах стандартной библиотеки и содержится. А некоторые тут "изучают" С++, кропая на Си. И кого они этим пытаются обмануть?
SergioO
 Аватар для SergioO
89 / 178 / 61
Регистрация: 13.12.2015
Сообщений: 968
08.01.2016, 17:28     Разбить текст на страницы #9
Цитата Сообщение от Mr.X Посмотреть сообщение
SergioO, ну так С++ в заголовочных файлах стандартной библиотеки и содержится. А некоторые тут "изучают" С++, кропая на Си. И кого они этим пытаются обмануть?
вопрос не в том кто на чем "кропает", а в том, что для новичка
<algorithm>, <vector>,<iterator> - это неподъемный груз, как не крути )) надо, как минимум, понимать "класс", "шаблон" и тд
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
08.01.2016, 17:52     Разбить текст на страницы #10
Цитата Сообщение от SergioO Посмотреть сообщение
для новичка
<algorithm>, <vector>,<iterator> - это неподъемный груз
А чего там неподъемного? Незнакомые слова всегда пугают, но уж программисту-то всегда приходится осваивать что-нибудь новое, так что этого страха вообще не должно быть. А в контейнерах, алгоритмах и итераторах ничего нет сложного, наоборот они для упрощения кода созданы, и они как раз первое, что должен выучить изучающий С++, иначе он просто дурью будет маяться, гордо надписывая над своей сишней тег С++.
kuza84
-4 / 23 / 4
Регистрация: 25.04.2013
Сообщений: 195
16.01.2016, 05:21     Разбить текст на страницы #11
Цитата Сообщение от Mr.X Посмотреть сообщение
А чего там неподъемного? Незнакомые слова всегда пугают, но уж программисту-то всегда приходится осваивать что-нибудь новое, так что этого страха вообще не должно быть. А в контейнерах, алгоритмах и итераторах ничего нет сложного, наоборот они для упрощения кода созданы, и они как раз первое, что должен выучить изучающий С++, иначе он просто дурью будет маяться, гордо надписывая над своей сишней тег С++.
начинать со структурного программирования проще чем с ООП сразу, тут люди часто используют в листингах С++ функции С для простоты видимо хотя тоже новичку не все понятно, а дружественные функции с перегрузкой операторов и классы это уже высокий уровень до него думаю новичек должен дорости.

Добавлено через 37 минут
п.с. в Самоучителе С++ Шилда черным по белому написано что изучая С++ вы уже знаете С, а С++ подмножество языка С.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
16.01.2016, 06:31     Разбить текст на страницы #12
kuza84, да я не против, "изучайте" С++, пиша на С, только для этого сишный раздел есть, новичкуйте там сколько хотите, чего же этот-то раздел всякой сишней загаживать?

Добавлено через 22 минуты
Кстати, мысль: неплохо было бы в дополнение к сишному и плюсовому разделам создать еще раздел "Си с классами", где бы обретались все сишники, воображающие, что они "изучают" С++.
_Valera_
 Аватар для _Valera_
486 / 368 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
16.01.2016, 06:32     Разбить текст на страницы #13
Цитата Сообщение от Mr.X Посмотреть сообщение
чего же этот-то раздел всякой сишней загаживать?
Цитата Сообщение от kuza84 Посмотреть сообщение
в листингах С++ функции С для простоты видимо хотя тоже новичку не все понятно,
мне вот С не нравится, потому что уныло(люди вместо высокоскоростного и комфортного поезда(с++), продолжают пользоваться ручной дрезиной(Си) и говорят что она лучше... ). Хотите простоты идите в веб. Хотя и там для ленивых места нет.
Просто если тебе лень учить, то это не значит что С++ какой то не такой.

Цитата Сообщение от SergioO Посмотреть сообщение
вопрос не в том кто на чем "кропает", а в том, что для новичка
<algorithm>, <vector>,<iterator> - это неподъемный груз, как не крути )) надо, как минимум, понимать "класс", "шаблон" и тд
Думаю даже если программист с 10 летним опытом, то всегда будут новые и не понятные моменты. Но их всегда можно загуглить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2016, 08:44     Разбить текст на страницы
Еще ссылки по теме:

C++ Преобразовать исходный текст в текст с выровненными краями
C++ Разбить текст на предложения, а предложения - на слова
Разбить файл на текст и числа C++

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

Или воспользуйтесь поиском по форуму:
Dead_Pixel
2 / 2 / 2
Регистрация: 16.01.2016
Сообщений: 14
16.01.2016, 08:44     Разбить текст на страницы #14
Зарегался, чтобы чисто по-человечески объяснить.

Preston То, что вы изучаете сейчас - просто Си.

Я когда учился, у нас тоже на всех учебниках было написано С++, и препод говорил С++ и работали в DevC++.
Ошибиться может каждый начинающий, так что не парься, ещё успеешь понять в чём отличие.

Ты правильно сделал, что создал другую тему в другом разделе, ей там место. Решение я тебе скинул в ней.

На всяких умников (с синдромом Бога) на форуме - не обращай внимания. Они поняли в чём твоя ошибка (разделом ошибся), а толком не могут (не хотят) объяснить (что изначально просто Си изучают, а потом остальное) и тупо флудят под темой поблёскивая остроумием (тут в основном стебалы сидят).

Удачи.
Yandex
Объявления
16.01.2016, 08:44     Разбить текст на страницы
Ответ Создать тему
Опции темы

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