Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_студ1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
499 Кб
Скачать
☆

Стежте за помилками переповнювання

Якщо ваші програми виконують введення з використанням cin, остерігайтеся можливих помилок, що виникають при введенні користувачем невірного числа. Наприклад, запустите програму, яку ви тільки що створили. Коли програма запитає вас ввести ваше улюблене число, введіть число 1000000 і натисніть ENTER. При цьому програма не зможе відобразити число 1000000 як введене значення. Натомість виникне помилка переповнювання, оскільки 1000000 перевищує найбільше значення, яке може зберігати тип int.

Якщо ви уважно розглянете програму, то звернете увагу, що cin присвоює введене число змінної типу int.

  1. Стежте за помилками неспівпадання типів

Як вже обговорювалося, програма припускає, що користувач вводить значення в діапазоні від -32768 до 32767. Якщо замість введення числа поза цим діапазоном, користувач вводить букви або інші символи, то виникає інша помилка — помилка неспівпадання типів. Іншими словами, програма чекала значення одного типу (int), а користувач ввів значення іншого типу (char).

Читання символьних даних

Наступна програма читає символ в змінну типу char

#include <iostream.h>

void main(void)

{

char letter;

cout « "Введіть будь-який символ і натисніть Enter: ";

cin » letter;

cout « "Був введений символ " « letter « endl;

}

Читання слів з клавіатури

Наступна програма використовує cin для читання значення типу long:

# iostream.h>

void main(void)

{

long value;

cout « "Введіть велике число і натисніть Enter: ";

cin » value;

cout « "Вило введено число " « value « endl;}

Форматування введення-виведення засобами мови С++

Існують два способи форматування введення/виведення.

Перший спосіб передбачає використання функцій для установки певних прапорів форматування, які перераховані в класі ios_base

enum { skipws = 0x0001

left = 0x0002

right = 0x0004

internal = 0x0008

dec = 0x0010

oct = 0x0020

hex = 0x0040

showbase = 0x0080

showpoint = 0x0100

uppercase = 0x0200

showpos = 0x0400

scientific = 0x0800

fixed = 0x1000

unitbuf = 0x2000

stdio = 0x4000

};

Розглянемо що роблять перераховані вище прапори.

Прапор

Опис

skipws

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

left

Здійснюється введення з лівим вирівнюванням

right

Здійснюється введення з правим вирівнюванням (за умовчанням)

internal

Знак або префікс системи числення вирівнює зліва, число вирівнює справа

dec

Чисельні значення виводяться в десятковій формі (за умовчанням)

oct

Чисельні значення виводяться у вісімковій формі

hex

Чисельні значення виводяться в шістнадцятковій формі

showbase

Дозволяє при виведенні указувати числову базу (десяткову, вісімкову, шістнадцяткову)

showpoint

Приводить до виведення десяткової коми і нулів справа для всіх чисел з плаваючою комою поза залежністю, потрібно це чи ні

uppercase

При виведенні чисел з плаваючою крапкою при використанні експоненціальної форми виводиться велика буква E. Також при виведенні чисел в шістнадцятковій формі символ 'x' виводиться у верхньому регістрі.

showpos

Призводить до того, що перед додатнім числом буде виводиться знак "+"

scientific

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

fixed

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

unitbuf

При кожній операції вставки виведення дані негайно заноситься в потік

Тепер необхідно познайомитися з функціями, які встановлюють і скидають ці прапори.

Перша функція, яку ми розглянемо, - це функція setf(), використовувана для установки прапорів

long setf(long flags);

Функція приймає як параметр розглянуті вище прапор або прапори, сполучені між собою за допомогою побітового АБО. Вона повертає попереднє значення прапора. Розглянемо приклад:

cout.setf(ios::hex);

cout.setf(ios::showpos);

cout<<123<<" "<<123.45<<"\n";

cout<<67<<" "<<678.9<<"\n";

виведе на екран

7b +123.45

43 +678.9

теж саме буде на екрані після виконання наступного коду

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

cout<<123<<" "<<123.45<<"\n";

cout<<67<<" "<<678.9<<"\n";

Для відключення встановлених прапорів потрібно використовувати функцію unsetf(). Вона має наступний прототип:

long unsetf(long flags);

Функція повертає значення попередньої установки прапора і скидає прапори, визначувані параметром flags. Приклад:

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

cout<<123<<" "<<123.45<<"\n";

cout.unsetf(ios::showpos | ios::hex);

cout<<123<<" "<<123.45<<"\n";

виведе на екран

7b +123.45

123 123.45

Окрім прапора форматування також можна встановити ширину поля потоку, символ для заповнення і число цифр після десяткової коми. Для цього використовуються наступні функції:

int width(int len);

char fill(char ch);

int precision(int num);

Функція width() встановлює ширину поля і повертає поточну ширину. Друга функція - fill() встановлює поточний символ заповнення і повертає попередній символ заповнення. За умовчанням використовується пропуск. А функція precision встановлює точність чисел з плаваючою крапкою. У науковому режимі ця функція визначає кількість цифр після десяткової коми. У звичайній нотації функція позначає кількість цифр, що виводяться. Точність, встановлена за умовчанням, рівна 6. Функція width() впливає тільки на одне виведення інформації, а після цього в дію вступають параметри прийняті за умовчанням. У випадку з рештою двох функцій нові установки залишаються діяти до їх явного оновлення. Приведемо приклад:

cout.width(10);

cout.fill('*');

cout<<123<<"\n";

cout.width(10);

cout<<456<<"\n\n";

cout<<"Using precision\n";

float price1 = 20.405f;

float price2 = (float)1.9+8.0/9.0;

cout<<price1<<"\n"<<price2<<"\n\n";

cout.precision(2);

cout<<price1<<"\n"<<price2<<"\n\n";

cout.setf(ios::scientific);

cout<<price1<<"\n"<<price2<<"\n\n";

виведе на екран

*******123

*******456

Using precision

20.405

2.78889

20

2.8

2.04e+001

2.79e+000

Другий спосіб - це використання маніпуляторів.

Маніпулятори є спеціальними функціями, які дозволяють змінювати прапори потоку. Існують маніпулятори з параметрами і без. Якщо Ви використаєте маніпулятори з параметрами, підключите файл iomanip.h

Маніпулятори без параметрів:

ends

- поміщає у вихідний потік нульовий символ;

endl

поміщає у вихідний потік символ кінця рядка і викликає метод flush;

flush

вивантажує буфер потоку;

dec, hex, oct

встановлюють підстави 10, 16 і 8 відповідно;

ws

примушує ігнорувати провідні пропуски при введенні.

Маніпулятори з параметрами

setbase(int b)

задає підставу системи числення;

resetiosflags(long f)

скидає прапори, вказані в параметрі;

setiosflags(long f)

встановлює прапори, вказані в параметрі;

setfill(int ch)

задає заповнюючий символ;

setprecision(int n)

задає точність дійсних чисел;

setw(int n)

задає ширину поля.

Використання маніпуляторів розглянемо на прикладі

cout<<setw(5)<<setfill('*')<<22<<endl;

cout<<hex<<11<<endl;

виведе на екран

***22

В