0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 18

Форматирование текста : исправьте код

11.11.2019, 19:10. Показов 1495. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Задача "Форматирование текста" звучит так:
Многие системы форматирования текста, например TEX или Wiki, используют для разбиения текста на абзацы пустые строки. Текст представляет собой последовательность слов, разделенных пробелами, символами перевода строк и следующими знаками препинания: «,», «.», «?», «!», «-», «:» и «’» (ASCII коды 44, 46, 63, 33, 45, 58, 39). Каждое слово в тексте состоит из заглавных и прописных букв английского алфавита и цифр. Текст может состоять из нескольких абзацев. В этом случае соседние абзацы разделяются одной или несколькими пустыми строками. Перед первым абзацем и после последнего абзаца также могут идти одна или несколько пустых строк.

Дальнейшее использование исходного текста предполагает его форматирование, которое осуществляется следующим образом. Каждый абзац должен быть разбит на строки, каждая из которых имеет длину не больше w. Первая строка каждого абзаца должна начинаться с отступа, состоящего из b пробелов. Слова внутри одной строки должны быть разделены ровно одним пробелом. Если после слова идет один или несколько знаков препинания, они должны следовать сразу после слова без дополнительных пробелов. Если очередное слово вместе со следующими за ним знаками препинания помещается на текущую строку, оно размещается на текущей строке. В противном случае, с этого слова начинается новая строка. В отформатированном тексте абзацы не должны разделяться пустыми строками. В конце строк не должно быть пробелов.

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

Входные данные
Первая строка входного файла INPUT.TXT содержит два целых числа: w и b (5 ≤ w ≤ 100, 1 ≤ b ≤ 8, b < w). Затем следует одна или более строк, содержащих заданный текст. Длина слова в тексте вместе со следующими за ними знаками препинания не превышает w, а длина первого слова любого абзаца вместе со следующими за ним знаками препинания не превышает (w – b). Текст содержит хотя бы одну букву. Перед первой буквой каждого абзаца знаков препинания нет.

Выходные данные
Выходной файл OUTPUT.TXT должен содержать заданный текст, отформатированный в соответствии с приведенными в условии задачи правилами. Размер входного файла не превышает 100 Кбайт. Длина каждой строки во входном файле не превышает 250.
Мой код ниже:
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
#include <stdio.h>
#include <string>
#include <vector>
#include <cassert>
std::vector<std::string> ParagraphToWords(const std::vector<char> &text) {
    std::vector<std::string> words;
    bool newWord = true;
    for (char c : text) {
        if (('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
            if (newWord) {
                words.push_back("");
                newWord = false;
            }
            words.back().push_back(c);
        } else if (c == ' ' || c == '\n') {
            newWord = true;
        } else {
            assert(c == ',' || c == '.' || c == '?' || c == '!' || c == '-' || c == ':' || c == '\'');
            assert(!words.empty());
            words.back().push_back(c);
            newWord  = true;
        }
    }
    return words;
}
void printParagraph(const std::vector<std::string> &words, const int maxlen, const int indent)
{
    assert(!words.empty());
    for (int i = 0; i < indent; i++) {
        putchar(' ');
    }
    printf("%s", words[0].c_str());
    int lineLen = indent + (int)words.size();
    assert(lineLen <= maxlen);
    for (int i = 1; i < (int)words.size(); i++) {
        if (lineLen + 1 + (int)words[i].size() <= maxlen) {
            printf(" %s", words[i].c_str());
            lineLen += 1 + (int)words[i].size();
        } else {
            printf("\n%s", words[i].c_str());
            lineLen = (int)words[i].size();
        }
        assert(lineLen <= maxlen);
    }
    putchar('\n');
}
 
int main() {
    int maxlen, indent;
    scanf("%d %d", &maxlen, &indent);
    std::vector<char> text;
    while(true) {
        int c = getchar();
        if (c == EOF) {
            break;
        }
        text.push_back((char)c);
    }
    int start = 0;
    while(start < (int)text.size() && text[start] == '\n') {
        start++;
    }
    text.erase(text.begin(), text.begin() + start);
    if (text.empty()) {
        return 0;
    }
    while(text.back() == '\n') {
        text.pop_back();
    }
     std::vector<std::vector<char>> paragraphs(1);
    paragraphs.back().push_back(text[0]);
    for (int i = 1; i < (int)text.size(); i++) {
        if (text[i] == '\n' && text[i - 1] == '\n') {
            if (!paragraphs.back().empty()) {
                paragraphs.push_back(std::vector<char>());
            }
        } else {
            paragraphs.back().push_back(text[i]);
        }
    }
    assert(!paragraphs.back().empty());
    for (auto paragraph : paragraphs) {
        printParagraph(ParagraphToWords(paragraph));
    }
 
    return 0;
}
Помогите исправить, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2019, 19:10
Ответы с готовыми решениями:

исправьте код пожалуйста!!!
Дан целочисленный массив размерностью N. Определить, является ли он экстремальным. Например, массивы { 2, 5, 14, 8, 4, 2} и { 23, 11, 6, 18...

Форматирование текста
Подскажите пожалуйста как можно отформатировать текст перед выводом его на экран.

Форматирование текста в RichViewEdit
Здравствуйте, очень нужна ваша помощь. Есть компонент RichViewEdit, нужно форматировать текст в...

2
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.11.2019, 21:49
Цитата Сообщение от vas4ik29 Посмотреть сообщение
Помогите исправить, пожалуйста.
Исправить что? Ты сам-то можешь прочитать этот код? Воспользуйся для начала кнопкой С++
0
0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 18
12.11.2019, 21:24  [ТС]
я как бы его сам написал и понимаю...
А если про код, там выдает что у функции printParagraph в самом конце мало аргументов, но в ней самой я использую все 3 аргумента, вопрос что надо написать в конце, где вывод с помощью этой функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2019, 21:24
Помогаю со студенческими работами здесь

Форматирование текста как код
Всем привет. Гугл в данном случае не помогает, т.к. при таком запросе находится все то, что мне не нужно =) У меня есть сайт на joomla....

Форматирование текста под компьютерный код
Полюбился мне этот раздел :) В общем, проблема в следующем. Пусть дан такой текст: Это пример исходного текста на С++....

RichEdit или RTF форматирование текста, а лучше HTML форматирование
Привет формучани. Подскажите бесплатный компонент который позволил бы выводить текст в формате RTF или HTML. Очень хорошо подходит TMS...

Форматирование текста и изменение цвета текста в консоли
Подскажите пожалуйста, как форматировать текст в консоли, а также как менять его цвет

Исправьте код
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; using namespace std; int main(void) { string...


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

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

Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru