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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 322, средняя оценка - 4.78
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
#1

Флаги форматирования и манипуляторы - C++

08.09.2009, 21:36. Просмотров 41515. Ответов 45

У многих новичков возникают вопросы, как вывести число в таком-то формате, а можно вывести так или так. Чтоб стало более ясно, вот небольшая
программка с комментариями.
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
#include <iostream>
#include <iomanip>
int main()
{
    setlocale(LC_ALL, "Russian");
    char _char[] = "char\n"; 
    int _int = 20;
    int negative_int = -10;
    double _double = 123.5467;
    float zero_float = 10;
 
//======== работаем с выравниванием ========\\
    
    std::cout<<"Работаем с выравниванием\n";
    //устанавливаем ширину поля вывода
    std::cout.width (20);
    //устанавливаем символ заполнитель(по умолчанию - пробел)
    std::cout.fill ('_');
    //флаг форматирования при котором знак числа выводится по левому краю, 
    //число — по правому. Промежуток заполняется символами заполнителя
    std::cout.setf(std::ios::internal);
    std::cout<<negative_int<<std::endl;
 
    //устанавливаем ширину поля вывода
    std::cout.width(50);
    //устанавливаем символ заполнитель(по умолчанию - пробел)
    std::cout.fill ('/');
    //выравниваем по правому краю поля
    std::cout.setf(std::ios::right);
    std::cout<<_char<<std::endl;
 
    //P.S. флаги  left, right и internal не могут быть установлены одновременно.
 
//======== выводим в разных системах исчисления ========\\
 
    std::cout<<"Выводим в разных системах исчисления\n";
    //восьмеричная система счисления
    std::cout.flags(std::ios::oct);
    std::cout<<_int<<std::endl;
 
    //десятичная система счисления
    std::cout.flags(std::ios::dec);
    std::cout<<_int<<std::endl;
 
    //шестнадцатеричная система счисления
    std::cout.flags(std::ios::hex);
    std::cout<<_int<<std::endl;
 
    //задаем основание системы счисления (8, 16, 10 или 0)
    //по умолчанию 0 - это десятичное, кроме случаев, когда вводятся 8- или
    //16-ричные числа. Здесь к примеру основание 8
    std::cout<<std::setbase(8)<<_int<<std::endl;
 
    //P.S. флаги dec, oct и hex не могут быть установлены одновременно.
 
//======== выводим вещественные чисел ========\\
 
    std::cout<<"\nВыводим вещественные числа\n";
    //при выводе вещественных чисел печатаем десятичную точку и дробную часть
    std::cout.flags(std::ios::showpoint);
    std::cout<<zero_float<<std::endl;
 
    //печатаем вещественные числа в форме мантиссы с порядком
    std::cout.flags(std::ios::scientific);
    std::cout<<_double<<std::endl;
    
    //Печатаем вещественные числа в форме с фиксированной точкой, 
    //точность определяем строкой ниже в setprecision
    std::cout.flags(std::ios::fixed);
    std::cout<<std::setprecision(2)<<_double<<std::endl;
 
    //P.S. флаги scientific и fixed не могут быть установлены одновременно
 
//======== печатаем знаки ========\\
 
    std::cout<<"\nПечатаем знаки\n";
    //печатаем знак при выводе положительных чисел
    std::cout.flags(std::ios::showpos);
    std::cout<<_int<<std::endl;
 
    system("pause");
    return 0;
}
Я выбирал самые основные. Кто может добавить, если я что-то пропустил - добавляйте. Буду только благодарен
19
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2009, 21:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Флаги форматирования и манипуляторы (C++):

Манипуляторы и флаги формата - C++
1.Манипулятор right почемуто не производит вывод по правой стороне. В чем проблема? рис. 1 2.Манипулятор skipws должен отбрасывать...

Манипуляторы ввода-вывода. Флаги - C++
Здравствуйте. Моя задача такова: нужно сделать программу, которая будет ждать ввода числа в 16-ричной, 8-ричной или 10-тичной системе...

Пользовательские флаги формата потока и манипуляторы - C++
Всем здравствуйте, возникла такая вот проблема: не понимаю как правильно создать свой флаг формата и правильно указать его для потока...

Флаги форматирования cout - C++
В чем разница, кроме того, что первые два флага форматирования задаются в качестве манипуляторов? cout &lt;&lt; setiosflags(ios::fixed); ...

Флаги форматирования в cout, выравнивание справа - C++
Вот код. Я установил флаг форматирования райт. Поток перегружен и на консоль выводится площадь и периметр, вот только они нисколько не...

Манипуляторы - C++
Ребята, проблема с манипуляторами.. Вместо того чтобы были пустые места, программа выдает нули(( void view(HANDLE hrFile) { ...

45
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
24.06.2011, 13:45 #16
nomaster, Ну структуру, функцию, да что угодно.
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
24.06.2011, 14:17 #17

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Русский букв!!!
Не помню, где, гибрид был из букв Ё и Б. Видимо, как-раз он...



Цитата Сообщение от nomaster Посмотреть сообщение
напримет 1/2!!!! мне нужен вывод дроби в таком виде
Таки в чём проблема?
C++
1
cout << 1 << '/' << 2;
1
nomaster
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 14
24.06.2011, 14:45 #18
я хочу чтобы вот так
1
-
2
а можно как то вот это
C++
1
2
3
4
5
6
while(denomenator<=n)
    {
        cout<<numerator<<"   "<<endl;//числитель
        cout<<"- + "<<endl;
        cout<<denomenator++<<"   ";//знаменатель
    }
После того как цикл проделывается 1 раз возвращать курсор на 2 строки вверх?)
чтобы получилось примерно так:

1 1 1
- - - ... (и между ними плюсики, не вышло увы написать как надо)
2 3 4

не ругайте силь только если бред написал!!
0
Bers
Заблокирован
24.06.2011, 14:52 #19
Да ну можно вообще графикой рисовать в консольном окошке, и циферки разными цветами рисовать.
Ток зачем такие заморочки?
0
Vergilock
1 / 1 / 0
Регистрация: 19.01.2012
Сообщений: 8
19.01.2012, 16:29 #20
Вот прога. Дано n студентов. Ввести данные и оценки. Вывести тех, у кого за 2 первых экзамена "2". Если таких нет, то нужно сделать вывод фразы "Таких студентов нет". Препод сказал, что через флаги можно.
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
#include "stdafx.h"
#include <iostream>
#include<stdio.h>
#include<conio.h>
#include <math.h>
using namespace std;
bool w=true;
int main()
{setlocale(LC_ALL,"Russian");
struct TStud
        {
          char sn[15],n[10];
          int d,m,y;
          int  ball[5];
        };
TStud stud[15],k;
int i,n,j,p;
cout<<"Введите количество студентов: ";
cin>>n;
do
    {
     cout<<endl<<"Кол-во экзаменов: ";
     cin>>p;
     }
while (p<3||p>5);  
for (i=0; i<n;i++)
  { 
   cout<<endl<<"Фамилия: ";
   cin>>stud[i].sn;
   cout<<endl<<"Имя: ";
   cin>>stud[i].n; 
   cout<<endl<<"Дата: ";
   cin>>stud[i].d>>stud[i].m>>stud[i].y; 
   for (j=0;j<p; j++)
    {
      cout<<endl<<"Оценка "<<j+1<<": "; 
      cin>>stud[i].ball[j]; 
   }
} 
 for (i=0; i<n; i++)
  for (j=0; j<n-1;j++)
    if (stud[j].m>stud[j+1].m)
        {
         k=stud[j];
         stud[j]=stud[j+1];
         stud[j+1]=k;                     
        }
printf("   Имя    |    Фамилия    | Дата рождения  |  Оценки\n");
 for (i=0; i<n;i++)
   {
    printf("%-10s|%-15s|%-2d.%-2d.%-10d|",stud[i].sn,stud[i].n,stud[i].d,stud[i].m,stud[i].y);
    for(j=0;j<p;j++)
    printf("%2d",stud[i].ball[j]);
    printf("\n");}
 cout<<"По физике и химии 2 у:"<<endl;
 for(i=0;i<n;i++)
 {if ((stud[i].ball[0]==2)&&(stud[i].ball[1]==2))
 {printf("%-10s|%-15s|%-2d.%-2d.%-10d|",stud[i].sn,stud[i].n,stud[i].d,stud[i].m,stud[i].y);
 printf("\n");}}
 if (w=true){cout<<"Таких учеников нет.";}
 _getch();      
return 0;}
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2012, 10:51 #21
M128K145, а вместе с flags(std::ios::hex); можно ещё как нибудь задать верхний регистр для букв A-F?

Добавлено через 6 минут
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|262|error: 'setbase' is not a member of 'std'|
.......................
0
Петррр
5965 / 3402 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
21.06.2012, 10:52 #22
C++
1
2
int num = 0xabcdef;
std::cout << std::hex << std::uppercase << num << std::endl;
1
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2012, 10:57 #23
Как вывести в двоичном виде?
0
Петррр
5965 / 3402 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
21.06.2012, 11:35 #24
http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
24.06.2012, 14:51 #25
Если через std::cout печатать char, то напечатается он в виде символа. А как напечатать char в виде числа (ибо char - это целочисленный тип размером в 1 байт)?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
24.06.2012, 14:54 #26
C++
1
std::cout << (int)ch;
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
24.06.2012, 15:00 #27
grizlik78, данный код сделает преобразование к int'у и печать. А как просто напечатать char без преобразований?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
24.06.2012, 15:03 #28
Ну да. Хотел дописать, что без преобразования (явного или неявного) никак. Может, конечно, мне тоже просто неизвестно.

P.S. А преобразование это ничего не стоит. Есть ли смысл обходиться без него?
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
24.06.2012, 15:07 #29
Чтобы понятно было, что я имею в виду, сравни результат на Си и твой вариант на Си++:

C
#include <stdio.h>
 
int main (void)
{
  char c = -1;
  printf ("%hhx\n", c);
  return 0;
}
C++
#include <iostream>
 
int main (void)
{
  char c = -1;
  std::cout.flags(std::ios::hex);
  std::cout << (int)c;
  return 0;
}
Добавлено через 1 минуту
В первом случае напечатается "ff", что логично, во втором - "ffffffff", что не логично (с точки зрения постановки задачи)
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
24.06.2012, 15:10 #30
Над хорошим способом надо подумать, а если надо по-быстрому вывести именно байты, то можно так:
C++
1
std::cout << (int)(unsigned char)c;
Выглядит ужасно, согласен.
0
24.06.2012, 15:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 15:10
Привет! Вот еще темы с ответами:

манипуляторы - C++
Создайте свои манипуляторы которые будут выполнять 1)вывод всех символов равных заданному заменить пробелом 2)вывод всех символов...

Манипуляторы. От С к С++ - C++
fprintf(f1, “%-7.3е”, x) Какая эквивалентная запись этой на С++?

манипуляторы - C++
Создайте манипулятор ввода skipcbar(), который, поочередно, то считывает, то пропускает каждые десять символов потока ввода.

Манипуляторы в С++ - C++
___________________Манипуляторы______________________ - endl_________________перевод строки - flush________________выгружает содержимое...


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

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

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