Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2018, 14:54   #1
Xoma37
 
Регистрация: 10.09.2012
Сообщений: 5
По умолчанию Выровнять текст по правому краю

Вот такое задание: Выравнивание правого края. Многие современные текстовые редакторы предоставляют пользователю возможность форматирования текст, когда правый край отпечатанного
текста выравнивается за счет увеличения промежутков между словами, встречающимися в строке.

Предлагается задача выбора подходящих промежутков. За счет изменения групп пробелов внутри строки надо добиться того, чтобы строка имела заданную длину,
а пробелы в конце строки отсутствовали. Количество пробелов в разных группах, располагающихся внутри строки, должно различаться не более чем на один.

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

Вроде всё сделал, вроде запускается, но результат выводит какой то белибердой. Помогите решить проблему с кодом, пожалуйста.

Код:
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

int main()
{
	setlocale(LC_ALL, "rus");
	vector<string> v;
	string sm;
	while (getline(cin, sm))
	{
		
			if (sm == "")//выход по пустой строке
				break;
			v.push_back(sm);
		
	}
	int *p=new int [v.size()]; // Количество пробелов в строке
	int max = 0;
	for (int i = 0; i<(int)v.size(); i++)
	{
		p[i] = 0;
		string s;
		for (int j = 0; j<(int)v[i].length(); j++)
		{
			if (v[i][j] != ' ')
			{
				s += v[i][j];
			}
			else if (v[i][j + 1] != ' ')
			{
				s += ' ';
				p[i]++;
			}
		}
		if (s[0] == ' ')
		{
			s.erase(0, 1);
			p[i]--;
		}
		if (s[s.length() - 1] == ' ')// Если в конце пробел, то число пробелов все равно нужно уменьшить, так как он не будет участвовать в выравнивании по ширине
		{
			if (strchr(",.!-?:\"\'", s[s.length() - 2]) != NULL) s.erase(s.length() - 1, 1); // И если в конце стоит знак препинания, то пробел в конце не нужен
			p[i]--;
		}
		v[i] = s;   // Заменяем неотформатированный вариант отформатированным

		if (max < (int)v[i].length())
		{
			max = (int)v[i].length();
		}
	}
	for (int i = 0; i<(int)v.size(); i++) 	// Затем второй проход строк 
	{
		int k = (int)v[i].length();  // Резервируем длину строки, так как она сейчас будет изменяться, а нам нужно при вычислениях учитывать исходные данные
		for (int j = 0; j<(int)v[i].length(); j++)
		{
			if (v[i][j] == ' ' && j + 1 != (int)v[i].length())
			{
				v[i].insert(j, (max - k) / p[i], ' ');   // Вставляем нужное количество пробелов между строк (так чтобы их было равное количество)
				j += (max - k) / p[i];  // Смещаем указатель проходящий все символы в строке
			}
		}
		v[i].insert(0, (max - k) % p[i], ' ');  // Оставшиеся пробелы вставляем в начало чтобы выровнять строку по правому краю
	}
	for (int i = 0; i<(int)v.size(); i++)
	{
		cout << v[i] << endl;
	}
	system("pause");
	return 0;
	
}

Последний раз редактировалось Xoma37; 22.05.2018 в 16:57.
Xoma37 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выравнивание текста по правому краю Chowder Паскаль, Turbo Pascal, PascalABC.NET 1 16.03.2014 23:14
Выровнять текст по правому краю,добавив в начало непустой строки нужное количество пробелов f1x Паскаль, Turbo Pascal, PascalABC.NET 19 21.12.2012 10:36
Выравнивание текста по правому краю С++ Bullrock Помощь студентам 0 07.06.2012 23:27
Cделать поверх Fkash плашку и разместить на ней растровое изображение по середине и текст по правому краю epoletov HTML и CSS 1 19.05.2011 16:30
StringGrid как выровнять по центру и по правому краю? MAcK Компоненты Delphi 5 03.09.2007 14:11