Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод строк, таблица 
V
    Опции темы
try_to_get
Дата 1.4.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 19.3.2007
Где: Россия

Репутация: нет
Всего: 2



Можно ли в Си++ вывести строки таким образом
Код

╔═══════╦═══════╗
║Ячейка1║Ячейка2║
╠═══════╬═══════╣
║Box1   ║Box2   ║
╚═══════╩═══════╝

а не
Код

╔═══════╦═══════╗
║Ячейка1║Ячейка2║
╠═══════╬═══════╣
║Box1║Box2║
╚═══════╩═══════╝


какие есть функции?


--------------------
Алгоритм не роскошь, а средство достижения цели!
user posted image
PM MAIL   Вверх
Kuvaldis
Дата 1.4.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



try_to_get
для С++ используй манипулятор setw()  (отводит нужное кол-во позиций под вывод)
для отрисовки горизонтальных линий я бы еще использовал cout.setfill() для задания заполняющего символа 

Это сообщение отредактировал(а) Kuvaldis - 1.4.2007, 10:42


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
vinter
Дата 1.4.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



я бы посоветовал рисовать в памяти, а потом выводить, так больше контроля получается, да и проще так..


--------------------
Мой блог
PM MAIL WWW   Вверх
Xenon
Дата 1.4.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Самое простое - вычислить ширину самого широго поля (наибольшее кол-во разрядов числа), а потом передавать эту ширину параметром в setw(), правда громоздко будет малость, но ... красиво smile 


--------------------
user posted image  
PM MAIL   Вверх
threef
Дата 1.4.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



а еще есть sprintf, который никто не отменял, в отличие от манипуляторов ввода-вывода, которых я чей-то ни в яве, ни в шарпее не вижу, ИМХО не прижилися, уж больно кривы.

Код

...
 char Format[]= "||%10s||%10s||\n");
 sprintf( charBuf, Format, string1, string2 );
 puts(charBuf); //  или cout<<charBuf;
...

PM MAIL   Вверх
Xenon
Дата 1.4.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



threef, Но тут все равно придется высчитывать ширину самого широкого поля?


--------------------
user posted image  
PM MAIL   Вверх
try_to_get
Дата 1.4.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 19.3.2007
Где: Россия

Репутация: нет
Всего: 2



Можно пример, всех приведенных функций.


--------------------
Алгоритм не роскошь, а средство достижения цели!
user posted image
PM MAIL   Вверх
try_to_get
Дата 2.4.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 19.3.2007
Где: Россия

Репутация: нет
Всего: 2



как работают эти фун.? в хелпе не нашел...



--------------------
Алгоритм не роскошь, а средство достижения цели!
user posted image
PM MAIL   Вверх
JackYF
Дата 2.4.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



try_to_get, а google() и, в частности, www.cppreference.com к хелпам уже не относятся?

Это сообщение отредактировал(а) JackYF - 2.4.2007, 18:59


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
apook
Дата 2.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Код

#include<iostream.h>

void main( void )
{
cout << "╔═══════╦═══════╗" << endl
     << "║ячейка1║ячейка2║" << endl
     << "╠═══════╬═══════╣" << endl
     << "║Box1   ║Box2   ║" << endl
     << "╚═══════╩═══════╝" << endl;
return;
}

 smile

Цитата

к хелпам уже не относятся?

а Vingrad?
Код

     Ширина
--------------------------------------------------------------

    По умолчанию   вставки  выводят минимальное число  сим
волов, которыми может  бытьпредставлен операнд  правой  части. 
Для того, чтобы  изменить э то  умолчание, можно  использовать
удобные функции задания ширины вывода:

int ios::width(int w);  // устанавливает поле ширины в w
            // и возвращает предыдущую ширину

int ios::width();    // возвращает текущую ширину --
            // не внося никаких изменений

    Значение width по умолчанию равно нулю, что  эквивален
тно выводу без  дополнительных заполнителей. Ненулевая  ширина 
означает, что вставки  будут выполнять вывод  не  уже заданной 
ширины, и  при  необходимостибудут  использованы   заполнители
до этой ширины. Отметим, что усечение ширины при этом  не выпо
лняется: если указанная ширина  меньше фактического числа  сим
волов для представления вывода, то  она будет  проигнорирована 
(как при width, установленной равной нулю). 

Например,

int i = 123;
int old_w = cout.width(6);
cout << i;       // на  выводе будет bbb123, где  bbb =
            // пробелы. Затем  ширина  устанавлива
            // ется равной 0
cout.width(old_w);    // восстановление  предыдущей   ширины
            // поля

    Отметим, что после каждой форматированной  вставки  ши
рина очищается в ноль, так что в

int i, j;
...
cout.width(4);
cout << i << " " << j;

i будет представлена  минимум четырьмя  символами, однако  про
бел в середине выражения и  j  будут  представлены  минимально 
необходимым числом символов.



     Поля вывода
--------------------------------------------------------------

    Функция width() устанавливает минимальное  число симво
лов, использующееся в последующей операции  вывода  числа  или
строки. Так в результате следующих операций

cout.width(4); 
cout << '(' << 12 << ')'; 

получим число 12 в поле размером 4 символа, т.е.

      (12)


    Заполнение поля заданными символами  или  выравнивание 
можно установить с помощью функции fill().

    Символ-заполнитель и  направление  дополнения  зависят
от установок внутренних флагов, отвечающих  за  эти параметры.

    По умолчанию  символом-заполнителем  является  пробел.
Изменить данное умолчание позволяет функция fill:

int i = 123;
cout.fill("*");
cout.width(6);
cout << i;  

// на дисплей будет выведено ***123


По умолчанию поле заполняется пробелами, а размер поля по  умо
лчанию есть 0, что означает "столько символов, сколько  нужно"
Вернуть размеру поля стандартное значение можно с  помощью  вы
зова

cout.width(0); // ``столько символов, сколько надо'' 

Функция width() задает минимальное число  символов. Если появи
тся больше символов, они будут напечатаны все, поэтому

cout.width(4);
cout << '(' << "121212" << ")\n"; напечатает

      (121212) 

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

    Вызов width() влияет только на  одну  следующую  за ним 
операцию вывода, поэтому

cout.width(4);
cout.fill('#');
cout << '(' << 12 << "),(" 
     << '(' << 12 << ")\n";

напечатает

      (##12),(12) а не (##12),(##12)

как можно было бы ожидать. Однако, заметьте, что  если бы влия
ние распространялось на все операции вывода чисел и  строк, по
лучился бы еще более неожиданный результат:

      (##12#),(##12#) 

С помощью стандартного манипулятора можно более  элегантно  за
давать размераполя вывода.


     Выравнивание полей
-------------------------------------------------------------- 

    По умолчанию  устанавливается  выравнивание  по  право
му краю (дополнение  символами-заполнителями влево).  Эти  умо
лчания (а также прочие форматные флаги) можно  изменять при по
мощи функций setf и unsetf:

int i = 56;
...
cout.width(6);
cout.fill('#');
cout.setf(ios::left,ios::adjustfield);
cout << i ;

// на дисплей будет выведено 56####


    С помощью обращений к setf() можно  управлять  располо
жением символов в пределах поля:

cout.setf(ios::left,ios::adjustfield);        //влево 
cout.setf(ios::right,ios::adjustfield);        //вправо
cout.setf(ios::internal,ios::adjustfield);    //внутреннее

Будет установлено выравнивание в поле вывода, определяемом  фу
нкцией ios::width(), причем не затрагивая  других  компонентов
состояния потока.

Выравнивание можно задать следующим образом:

cout.width(4);
cout << '(' << -12 << ")\n";
cout.width(4);
cout.setf(ios::left,ios::adjustfield); 
cout <<'(' <<-12 <<")\n";
cout.width(4); 
cout.setf(ios::internal,ios::adjustfield);
cout <<'(' <<-12 <<"\n";
 
что выдаст

      (-12) (-12) (- 12) 

Если установлен флаг выравнивания  internal  (внутренний),  то 
символы добавляются между знаком  и величиной.  Как видно, ста
ндартным является выравнивание вправо.

    Второй  аргумент,  ios::adjustfield,  сообщает   setf,
какие биты должны быть установлены.Первый аргумент, ios::left,
сообщает setf, в какие именно  значения   устанавливаются  эти
биты.   Альтернативно     можно    использовать   манипуляторы
setfill, setiosflags и resetiosflags, которые  позволяют  моди
фицировать символ-заполнитель и направление  дополненияпри фор
матировании

    Манипуляторы
--------------------------------------------------------------

    Более простой способ изменения  состояния ширины и про
чих переменных форматирования состоит  в  использовании специа
льной функциообразной операции, называемой манипулятором. Мани
пуляторы принимают в качестве аргументов ссылку  на потоки воз
вращают ссылку на тот  же  поток - поэтому  манипуляторы могут 
объединяться в цепочку  вставок (или извлечений из потока) для
того,чтобы изменять состояния  потока в виде  побочного  эффек
та, без фактическоговыполнения  каких-либовставок (или извлече
ний).

Например,

cout << setw(4) << i << setw(6) << j;

эквивалентно более широкой записи

cout.width(4);
cout << i;
cout.width(6);
cout << j;

    setw  представляет  собой  параметризованный  манипуля 
тор объявление  которого находится в iomanip.h. Прочие  параме
тризованные  манипуляторы,  setbase,   setfill,  setprecision,
setiosflags и resetiosflags, работают  аналогичнымобразом  (см
таблицу 4.1). Для того, чтобы  использовать эти  манипуляторы,
ваша  программа должна включать  iomanip.h.
 

Это сообщение отредактировал(а) apook - 2.4.2007, 19:31


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Xenon
Дата 2.4.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Пример?
Код

void display_all()
{
    if (album_list.size()==0)
    {
        throw ("Nothing to display");
    }
    int genre_width=0;
    int artist_width=0;
    int title_width=0;
    for (int i=0;i<static_cast<int>(album_list.size());i++)
    {
        if (album_list[i]->artist.length()>artist_width)//Get width of the widest artist field
        {
            artist_width=album_list[i]->artist.length();
        }
        if (album_list[i]->genre.length()>genre_width)//Get width of the widest genre field
        {
            genre_width=album_list[i]->genre.length();
        }
        if (album_list[i]->title.length()>title_width)//Get width of the widest title field
        {
            title_width=album_list[i]->title.length();
        }
    }
    cout.setf(std::ios::left);
    cout << setw(++artist_width) << "Artist" << setw(++title_width) <<  "Title" << setw(++++genre_width) << "Genre" << setw(6) << "Year" << endl;
    cout << "-------------------------------------\n";
    for (int i=0;i<static_cast<int>(album_list.size());i++)
    {
        cout << setw(artist_width) << album_list[i]->artist;
        cout << setw(title_width) << album_list[i]->title;
        cout << setw(genre_width) << album_list[i]->genre;
        cout << setw(6) << album_list[i]->year << endl;
    }
    cout << "---------------------------------\n";
}



--------------------
user posted image  
PM MAIL   Вверх
try_to_get
Дата 2.4.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 19.3.2007
Где: Россия

Репутация: нет
Всего: 2



Спасибо


--------------------
Алгоритм не роскошь, а средство достижения цели!
user posted image
PM MAIL   Вверх
betal
Дата 3.4.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



Цитата(apook @  2.4.2007,  19:13 Найти цитируемый пост)
#include<iostream.h>
void main( void )
{
cout << "╔═══════╦═══════╗" << endl
     << "║ячейка1║ячейка2║" << endl
     << "╠═══════╬═══════╣" << endl
     << "║Box1   ║Box2   ║" << endl
     << "╚═══════╩═══════╝" << endl;
return;
}

smile 
Ну да все прально  smile 




--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.