Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
*Jazz*
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 3
#1

Выравниваем строки по правому и левому краям - C++

29.10.2011, 15:27. Просмотров 1930. Ответов 3
Метки нет (Все метки)

Задача:

Создать программу, которая бы запрашивала у пользователя строки до тех пор, пока он не введет пустую строку, после чего программа должна вывести список введенных строк в два столбца, первый из которых выровнен по левому краю, а второй - по правому краю. То есть результат программы может выглядеть примерно следующим образом:

Aarhus
Aaron
Ababa
aback
abaft
abandon
abandoned
abandoning
abandonment
abandons
abase
abased
abasement
abasements


Решение:

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
#include <vector>
#include <string>
#include <stdio>
using namespace std;
 
int main()
{
  vector<string> coll;
  vector<string>::const_iterator pos;
 
  try
  {
    char input[80];
    string str;
    while(true)
    {
      printf("Введите строку ");
      fgets(input, 80, stdin);
      // Если введена пустая строка - выходим из цикла
      if(strlen(input) <= 1) break;
      // Удаляем завершающий перевод строки
      input[strlen(input) - 1] = '\0';
      // Присваиваем строке str значение input
      str = input;
      coll.push_back(str);
    }
    // Если количество элементов не четное,
    // добавляем дополнительный пустой элемент
    if(coll.size() % 2) coll.push_back("");
 
    // Определяем количество элементов в каждом из столбцов
    int half_count = coll.size() / 2;
 
    // Определяем длину максимальной строки
    // в первом столбце
    int max_lenght_first = 0;
    for(int i = 0; i < half_count; i++)
    {
      if(coll[i].size() > max_lenght_first)
        max_lenght_first = coll[i].size();
    }
 
    // Определяем длину максимальной строки
    // во втором столбце
    int max_lenght_second = 0;
    for(int i = half_count; i < coll.size(); i++)
    {
      if(coll[i].size() > max_lenght_second)
        max_lenght_second = coll[i].size();
    }
 
    // Строки форматирования для первого и второго столбцов
    char format_first[80], format_second[80];
    sprintf(format_first, "%%-%ds", max_lenght_first + 2);
    sprintf(format_second, "%%%ds\n", max_lenght_second);
 
    for(int i = 0; i < coll.size(); i++)
    {
      if(i % 2) printf(format_second, coll[i]);
      else printf(format_first, coll[i]);
    }
  }
  catch(bad_alloc)
  {
    printf("Не удалось выделить память под коллекцию\n");
  }
 
  return 0;
}
Для выводы строк в два столбца необходимо разбить коллекцию на две части для первого и второго столбца. В двух частях следует найти строки с максимальным количеством символов и подготовить две форматирующие строки: с выравниванием по левому краю для первого столбца и выравниванием по правому краю для правого столбца.
P.S. выше написана одна из возможных реализаций решения задачи.
Спасибо за внимание.
Написано - "*Jazz*" Специально для cyberforum.
http://www.cyberforum.ru/cpp-beginners/thread71215.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 15:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Выравниваем строки по правому и левому краям (C++):

Добавить в конец каждой строки необходимо количество «*» что бы выровнять текст по правому краю большей строки
Дано некоторое количество строк, не больше как размер текстового окна. Добавить...

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

Нужно поставить пробелы по краям строки (string), язык c++
Нужно поставить пробелы по краям строки (string), язык c++. Строка вводится...

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

Выравнивание строки по правому краю до заданной длины
выравнивание строки s по правому краю до длины l. Задание нужно сделать с...

3
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
29.10.2011, 15:43 #2
string, getline(), vector, setw()
наверное, раза в три короче можно записать
0
*Jazz*
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 3
30.10.2011, 11:16  [ТС] #3
Это один из вариантов.
Если интересует, можете сами дополнить..
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2011, 03:05 #4
Цитата Сообщение от *Jazz*
C++
1
printf("Не удалось выделить память под коллекцию\n");
C++
1
2
    cerr << "Не удалось выделить память под коллекцию" << endl;
    return 1;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2011, 03:05
Привет! Вот еще темы с решениями:

Открыть файл, выровнять текст по правому краю и слева добавить номер строки
Создать текстовый файл и сохранить в нём текст 10..20 строк. По нескольку слов...

Текстовый обработчик с выравниваем текста по левому краю
Нужно создать в паскале текстовый обработчик с выравниваем текста по левому краю

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

Позиционирование пунктов списка по левому и правому краю
Доброго времени суток! Ребят, помогите с таким вопросом: Имеется...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru