- •Int main() /* головна обов’язкова функція, де ключове слово int означає, що функція main() повертатиме у точку виклику результат цілого типу*/ 6
- •Засоби розробки с програм
- •Директиви препроцесора.
- •Using namespace std; // вказуємо, що будемо працювати з іменами із стандартної бібліотеки
- •Запитання
- •Тема 2. Данні
- •Команда присвоєння. Правила узгодження типів.
- •Запитання
- •Тема 3. Операції та вирази
- •Тема 4. Потоки. Введення - виведення даних
- •Форматування даних
- •Введення-виведенні засобами бібліотеки сstdіo
- •Тема 5. Адреси даних. Вказівники. Динамічна пам’ять
- •Тема 6. Файли
- •Тема 7. Розгалуження
- •Логічні вирази та логічні операції.
- •Команда ?
- •Тема 8. Цикли
- •Команда циклу з післяумовою do-while має вигляд
- •Тема 9. Функції (1)
- •Тема 10. Функції (2)
- •Тема 11. Масиви
- •Тема 12. Рядки
- •Тема 13. Структури, списки, стеки, черги, об’єднання
- •Тема 14. Виняткові ситуації
- •Http://www.Rate1.Com.Ua/strannosti/2633/ Самі фатальні помилки в програмному забезпеченні
- •Помилки під час виконання (виняткові ситуації, виключення) Exceptions - це помилки, що виникають у випадку, коли програма намагається виконати неприпустиму операцію.
- •Тема 15. Графіка
- •Написание простых графических программ
- •Http://www.Rsdn.Ru/article/opengl/ogltut2.Xml Графическая библиотека OpenGl
Форматування даних
Форматуючі функції-члени, їх усього три:
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;
}
Для керування форматуванням використовують прапори, що передаються функції 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;
}
