Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глинський С++.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.26 Mб
Скачать
  1. Форматування даних

  1. Форматуючі функції-члени, їх усього три:

width()-ширина,

precision() - точність

fill() - заповнення.

За замовчуванням при виведенні будь-якого значення воно займає стільки позицій, скільки символів виводиться. Функція width() дозволяє:

  • для виведення значення задати мінімальну ширину поля;

int width(int wide);

  • при уведенні вона задає максимальне число символів, що читаються.

int width( ) const;

Функція з першим прототипом задає ширину поля wide, а повертає попереднє значення ширини поля. Функція із другим прототипом повертає поточне значення ширини поля.

За замовчуванням числа із плаваючою крапкою виводяться з точністю, рівним шести цифрам. Функція precision() дозволяє:

  • задати точність (число виведених цифр після десяткової крапки), з якої виводяться числа із плаваючою крапкою. В цьому випадку функція precision () має наступний прототип:

int precision(int prec);

  • довідатися точність

int precision() const;

За замовчуванням як символ-заповнювача використовується пробіл. Функція fill() дозволяє:

  • встановити символ-заповнювач, прототип:

char fill(char type ch);

  • прочитати символ-заповнювач,, прототип функції:

char fill() const;

З адача 1.Скласти програму виведення на екран таблицю значень змінної x від 1 до 6, її квадратного кореня й квадрата. Використовуючи форматуючі функції сформувати виведення значень шириною 7 позицій, точність 3 знаки після коми, заповнити позиції до необхідної ширини символом «0»:

#include <iostream>

#include <cmath>

#include <cstdlib>

using std::cout;

int main(void)

{

double x;

cout.precision(4);

cout.fill('0');

cout << " x sqrt(x) x^2\n\n";

for (x=1.0; x< 6.5; x++)

{

cout.width(7);

cout << x << " ";

cout.width(7);

cout << sqrt(x) << " ";

cout.width(7);

cout << x*x << '\n';

}

system("PAUSE");

return EXIT_SUCCESS;

}

  1. Для керування форматуванням використовують прапори, що передаються функції flag().

Прапор - бітова маска, яка визначена в класі ios як дані перерахування.

Таблиця 5. Прапори форматування і їхнє призначення

Прапор

Призначення

hex

Значення цілого типу приводяться до основи 16 (як шіснадцяткової)

dec

Значення цілого типу приводяться до основи 10

oct

Значення цілого типу приводяться до основи 8 (як восьмеричні)

fixed

Числа із плаваючою крапкою виводяться у форматі з фіксованою крапкою (тобто nnn.ddd)

scientific

Числа із плаваючою крапкою виводяться в так званому науковому записі

(тобто n.хххЕуу)

showbase

Виводиться основа системи числення у вигляді префікса до цілого числового значення (наприклад, число 1FE виводиться як 0x1FE)

showpos

При виведенні додатніх числових значень виводиться знак плюс

uppercase

Заміняє певні символи нижнього регістра на символи верхнього регістра (символ "е" при виведенні чисел у науковій нотації на "Е" і символ "х" при виведенні 16-кових чисел на "X")

left

Дані при виведенні вирівнюються по лівому краю поля

right

Дані при виведенні вирівнюються по правому краю поля

internal

Додаються символи-заповнювачі між всіма цифрами й знаками числа для заповнення поля виведення

skipws

Перші символи-заповнювачі (знаки пробілу, табуляції й перекладу на новий рядок) відкидаються

stdio

Потоки stdout, stderr очищюються після кожної операції вставки

unitbuf

Очищюються всі вихідні потоки після кожної операції вставки в потік

Прапори left і right взаємно виключають один одного. Прапори dec, oct і hex також.

Функція-член flags() класу ios дозволяє:

  • прочитати поточні установки прапорів, для цього використовується такий прототип:

long flags();

  • установлювати значень прапорів, для цього використовується прототип функції:

long flags(long fmtfl);

У цьому випадку бітовий шаблон копіює fmtfl у змінну, призначену для зберігання прапорів форматування. Функція повертає попередні значення прапорів. Оскільки ця форма функції міняє весь набір прапорів, вона застосовується рідко.

Замість її використовується функція-член setf() класу ios, що дозволяє встановити значення одного або декількох прапорів. Вона має наступні прототипи:

  • неявно викликає функцію flags (mask | flags()) для установки бітів, зазначених параметром mask, і повертає попередні значення прапорів

long setf (long mask);

  • привласнює биткам, зазначеним параметром mask, значення битов параметра fmtfl, а потім повертає попередні значення прапорів.

long setf (long fmtfl, long mask);

Приклад.Виклик функції setf() установлює для потоку cout прапори hex і uppercase:

cout.setf(ios::hex | ios::uppercase);

Як бачимо за допомогою операції побітового АБО | можна встановити образу декілька прапорів.

Як другий параметр функції setf() можна використовувати наступні константи, визначені в класі ios:

static const long basefield; // = dec | oct | hex static const long adjustfield; // = left | right | internal static const long floatfield; // = scientific | fixed

Зняти встановлені прапори можна за допомогою функції-члена unsetf() класу ios. Вона знімає прапори, задані параметром mask і має наступний прототип:

void unsetf(long mask);

Задача 2 демонструє використання деяких прапорів: Дано число d = 1.321е+09 n = 1024. Вивести число d з зазначенням «+», і вивести шіснадцяткове значення числа n.

#include <cstdlib>

#include <iostream>

using namespace std;

int main()

{ // Вивести значення

double d = 1.321e9;

int n = 1024;

cout << "d = " << d << '\n' ;

cout << "n = " << n << '\n';

// Змінити прапори й вивести значення знову

cout.unsetf (ios::dec); // знімаємо прапор десяткового виводу

cout.setf(ios::hex | ios::uppercase| ios::showbase); // встановлюємо шіснядцятковий вивід

c out.setf(ios::showpos); // встановлюємо вивід додатного з «+»

cout << "d = " << d << '\n' ;

cout << "0x n = " << n << '\n';

system("PAUSE");

return 0;

}

3)Форматування потоку з використанням маніпуляторів введення-виведенні.

Маніпулятори уведення-виведенні це вид функцій-членів класу ios, які, на відміну від звичайних функцій-членів, можуть розташовуватися усередині інструкцій вводу-виведенні. У зв'язку із цим ними користуватися звичайно зручніше.

Таблиця 6. Маніпулятори уведення-виведенні і їхнє призначення

Маніпулятор

Використання

Призначення

dec

Уведення-Виведення

Установлює прапор dec

endl

Виведення

Вставляє символ нового рядка й очищає буфер

ends

Виведення

Вставляє символ кінця

flush

Виведення

Очищає буфер потоку

hex

Уведення-Виведення

Установлює прапор hex

oct

Уведення-Виведення

Установлює прапор oct

resetiosflags (iosbase::long mask)

Уведення-Виведення

Скидає ios-прапори відповідно до mask

setbase (int base)

Уведення-Виведення

Задає основу системи числення для цілих(8, 10, 16)

setfill (int c)

Уведення-Виведення

Установлює символ-заповнювач

setiosflags (iosbase::long mask)

Уведення-Виведення

Установлює ios-прапори відповідно до mask

setprecision (int n)

Уведення-Виведення

Установлює точність чисел із плаваючою крапкою

setw(int n)

Уведення-Виведення

Установлює мінімальну ширину поля

ws

Уведення

Установлює пропуск символів-заповнювачів

За винятком setw (), всі зміни в потоці, внесені маніпулятором, зберігаються до наступної установки.

Для доступу до маніпуляторів з параметрами необхідно включити в програму стандартний заголовний файл iomanip. При використанні маніпулятора без параметрів дужки за ним не ставляться, тому що насправді він являє собою вказівник на функцію-член, що передається перевантаженому операторові <<.

Задача 3, що демонструє використання маніпуляторів. Скласти програму виведення на екран таблицю значень змінної x від 1 до 6, її косинусу та сінусу. Використовуючи модифікатори сформувати виведення значень шириною 7 позицій, точність 4 знаки після коми, заповнити позиції до необхідної ширини символом «*»:

#include <iostream>

#include <iomanip> // для роботи модифікаторів

#include <cmath>

#include <cstdlib>

using namespace std;

int main()

{

double x;

cout << setprecision(4); // виведення чисел з точністю 4 знаки після коми

cout << setfill('*'); //заповнення порожніх позицій *

c out << " x cos(x) sin(x)\n\n";

for (x=1.0; x < 6.5; x++)

{

cout << setw(7) << x << " ";

cout << setw(7) << cos(x) << " ";

cout << setw(7) << sin(x) << "\n";

}

system("PAUSE");

return 0;

}

Цей приклад функціонально повністю еквівалентний наведеному раніше, але для керування форматом виведенні використовує маніпулятори, а не функції форматування.

#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;

}