Форум программистов, компьютерный форум, киберфорум
Наши страницы

Равномерное дополнение строки пробелами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Указатели на функции (Прата) - не пойму, как это работает http://www.cyberforum.ru/cpp-beginners/thread1228221.html
Стивен Прата "Язык программирования C++. Лекции и упражнения" 7 глава, стр. 355, листинг 7.18. fun_ptr.cpp // fun_ptr.cpp -- pointers to functions #include <iostream> double betsy(int);...
C++ Как ограничить поле ввода только одним символом? А двумя? Как ограничить поле ввода только одним символом? А двумя? Например чтобы сразу после нажатия клавиши(двух), программа переходила к следующей операции, не ожидая нажатия "ентер", либо же не давала... http://www.cyberforum.ru/cpp-beginners/thread1228219.html
C++ Невозможно запустить программу. Отсутствует libiconv-2.dll
Запуск программы невозможен так как на компьютере отсутствует libiconv-2.dll.попробуйте переустановить программу Добавлено через 36 секунд Что нужно сделать?
C++ Неверная обработка данных при вводе двух и более величин
У меня по коду все правильно, при вводе одного значения n вывод верный. Если ввод включает 2 и больше значений n, то первое значение, остальные такое чувство, что не проверяет программа. Вот код:...
C++ Зависание потоков. Работа с файлами http://www.cyberforum.ru/cpp-beginners/thread1228168.html
Всем еще раз привет. Очень прошу помощи. Пишу на С++ под винду, с учетом специфики проекта выбор остановился на boost library. Пишу многопоточное приложение следующего вида: создается...
C++ Анализатор входящих сообщений сторонних ПО и сервисов В WinAPI не силен, однако необходимо написать программу на С++, анализирующую входящие сообщения какого-нибудь сервиса обмена сообщениями, например вконтакте. По самому анализатору наброски есть,... подробнее

Показать сообщение отдельно
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
19.07.2014, 16:25
Вот готовое решение.
Полною работоспособность не гарантирую, нужно еще хорошенько все проверить, но вроде работает:

Вот файл:
Formatter.txt

Пример:
Равномерное дополнение строки пробелами

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
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
 
using namespace std;
 
class Formatter {
private:
 
    //Расделяет строку на вектор слов (взято с интернета :) )
    static vector<string> split(string data, string delimiters) {
        vector<string> parts;
 
        string::size_type lastPos = data.find_first_not_of(delimiters, 0);
        string::size_type pos = data.find_first_of(delimiters, lastPos);
        while (string::npos != pos || string::npos != lastPos) {
            parts.push_back(data.substr(lastPos, pos - lastPos));
            lastPos = data.find_first_not_of(delimiters, pos);
            pos = data.find_first_of(delimiters, lastPos);
        }
 
        return parts;
    }
 
    //Парсит (разбирает) текст на вектор с векторов слов
    static vector<vector<string>> parse(string data) {
        vector<vector<string>> result;
        vector<string> splited = split(data, "\n");
        for (int i = 0; i < splited.size(); i++) {
            result.push_back(split(splited[i], " "));
        }
        return result;
    }
 
    //Вычисляет длину вектора слов
    static int getLineLength(vector<string> data) {
        int result = 0;
        for (int i = 0; i < data.size(); i++) result += data[i].length();
        return result;
    }
 
    //Вычисляет максимальную длину вектора слов
    static int getMaxLength(vector<vector<string>> data) {
        int max = 0;
        for (int i = 0; i < data.size(); i++) {
            int lineLength = getLineLength(data[i]) + data[i].size() - 1;
            if (max < lineLength) max = lineLength;
        }
        return max;
    }
 
    //Возвращает сторку с пробелами определенной длины
    static string getSpaces(unsigned int count) {
        string result = "";
        for (int i = 0; i < count; i++) result += ' ';
        return result;
    }
 
    //Вычисляет нужное количество пробелов для вектора слов для определенной длины
    static vector<int> calculateSpaces(vector<string> data, int length) {
        if (data.size() == 1) {
            int spaces = length - data[0].length();
            return { spaces };
        }
 
        length -= data[data.size() - 1].length();
        data.erase(data.end() - 1);
 
        int count = length - getLineLength(data);
        vector<int> result;
        int cursor = 0;
        for (int i = 0; i < data.size(); i++) result.push_back(0);
        while (count > 0) {
            result[cursor]++;
            count--;
 
            if (cursor == data.size() - 1) cursor = 0;
            else cursor++;
        }
 
        return result;
    }
 
    //Возвращает готовую расширеную строку до длины length
    static string expandTo(vector<string> data, int length) {
        int lineLength = getLineLength(data);
        string result = "";
        vector<int> spaces = calculateSpaces(data, length);
 
        for (int i = 0; i < data.size() - 1; i++) {
            result += (data[i] + getSpaces(spaces[i]));
        }
        result += data[data.size() - 1];
        return result;
    }
 
public:
 
    //Главная функция форматирования
    static string format(string data) {
        vector<vector<string>> strings = parse(data);
        int max = getMaxLength(strings);
        string result = "";
 
        for (int i = 0; i < strings.size(); i++) {
            result += (expandTo(strings[i], max) + "\n");
        }
        return result;
    }
};
 
string readStringWhileNot(int end) {
    string result = "";
    char symbol = 0;
    while(true) {
        //Читаем символ
        symbol = _getch();
        
        //Выводим на экран и добавляем до строки, если это не стоп-символ
        if (symbol != end) {
            if (symbol == 13) {
                cout << "\n";
                result += "\n";
            }
            else {
                cout << symbol;
                result += symbol;
            }
        }
        //В ином случае останавливаем чтение
        else break;
    };
 
    return result;
}
 
int main() {
    cout << "Enter text: \n";
    string text = readStringWhileNot(27);
 
    cout << "\nFormatted text: \n" << Formatter::format(text);
    cin.get();
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.