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

Форматирование текста - C++

Восстановить пароль Регистрация
 
even_murmansk
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 1
01.04.2016, 14:31     Форматирование текста #1
Дается абзац текста, состоящий из ряда слов, отделенных друг от друга пробелами и/или символами новой строки (символы табуляции не применяются). Слово может содержать знаки пунктуации. Текст завершается специальным словом "$$$", которое будет единственным на последней строке.

Например, в тексте

The quick brown-fox jump$
over, the --- lazy
dog.
$$$
словами являются "The", "quick", "brown-fox", "jump$", "over,", "the", "---", "lazy", "dog.".

Последнее слово "$$$" рассматривать не нужно.

Вашей программе будет также дано целое число, указывающее ширину окна w. Вы должны вывести слова с минимальным количеством пробелов между ними так, чтобы:
  1. количество символов в каждой строке не превышало w (за исключением символа новой строки).
  2. между двумя словами на одной строке должен быть хотя бы один пробел.
  3. крайний левый символ строки не должен быть пустым
  4. крайний правый символ строки не должен быть пустым за исключением, может быть, последней строки
  5. пробелы должны быть распределены по возможности равномерно между всеми словами строки. Если этого нельзя сделать точно, то большая порция пробелов должна располагаться ближе к правому краю строки.

При ширине вывода 21, вышеупомянутый текст отобразился бы следующим образом:

123456789012345678901

The quick brown-fox
jump$ over, the ---
lazy dog.
Описание ввода

Первая строка входного файла содержит только ширину окна w. Следующие строки содержат текст абзаца. Последняя строка содержит единственное слово "$$$".

Гарантируется что:
  • слово "$$$" не встречается внутри текста абзаца
  • суммарная длина двух любых, подряд идущих слов, разделенных одним пробелом, не превышает w
  • длина одного слова не превышает 50 символов
  • количество слов в абзаце не превышает 5000
  • ширина окна не превышает 100.

Описание вывода

Выходной файл должен состоять из слов текста абзаца.
Не должно быть никаких пробелов в начале и конце файла.

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
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cctype>
#include <fstream>
 
using namespace std;
 
string inputSpace(string input, int size)
{
    string rez = "", buf = input, tep = "";
    
    int spaceNeed = size - input.length();
    int lineLengyh;
    
    bool flagg;
    
    if (spaceNeed == 0) {
        flagg = false;
        rez = input;
    }
    else {
        flagg = true;
    }
    
    while (flagg)
    {
        for (int i = buf.length() - 1; i >= 0; i--) {
            rez = buf[i] + rez;
            if (buf[i] == ' ' && buf[i - 1] != ' ' && spaceNeed > 0) {
                rez = ' ' + rez;
                spaceNeed--;
            }
            lineLengyh = rez.length();
        }
        
        if (spaceNeed == 0) {
            flagg = false;
        }
        else {
            buf = rez;
            rez = "";
        }
    }
    
    return rez;
}
 
int main()
{
    ifstream innFile("input.txt");
    ofstream outFile("output.txt");
    
    string line;
    stringstream ss;
    vector<string> vec;
    
    int maxLineSize;
    
    
    innFile>>maxLineSize;
    
    if (innFile.is_open()) {
        while (innFile.good()) {
            getline(innFile, line);
            
            ss << line << " ";
        }
    }
    
    line.empty();
    
    while(ss>> line)
    {
        
        vec.push_back(line);
    }
    vec.pop_back();
    
    int lineSize;
    line.empty();
    
    for(size_t i = 0; i <= vec.size(); i++)
    {
        line.clear();
        lineSize = 0;
        while(lineSize < maxLineSize)
        {
            lineSize += (int)vec[i].length();
            
            if(lineSize > maxLineSize) {
                i--;
                break;
            }
            
            if (i >= vec.size()){
                break;
            }
            
            line += vec[i];
            lineSize++;
            
            if(lineSize >= maxLineSize)
                break;
            
            line.push_back(' ');
            i++;
        }
        
        
        if (line[line.length() - 1] == ' ') {
            line.erase( line.end() - 1 );
        }
        
        if (i == vec.size()) {
 
            outFile << line << endl;
        } else {
            outFile << inputSpace(line, maxLineSize) << endl;
        }
        
    }
 
    innFile.close();
    outFile.close();
    return 0;
}
Выходной файл д.б. в формате win1251
Программа текст форматирует, но при проверке скрытых тестов, выдает ошибку. Какую ошибку выдает и что за тесты, не известно. Возможно я где-то не правильно понял задание или в самой программе есть хитрая ошибка.
Помогите пожалуйста разобраться. 2 недели мучаюсь, никак не могу понять в чем скрытый подвох.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2016, 14:31     Форматирование текста
Посмотрите здесь:

RichEdit 3.0 и форматирование по ширине C++
C++ Форматирование вывода
C++ Форматирование текста записанного в файл
Форматирование текста в C++ C++
C++ Форматирование текста
Форматирование ячеек в Excel C++
Форматирование текста в классе с использованием шаблона C++
C++ Форматирование вывода в c++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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