- •Розділ і. Вступ. Основи алгоритмізації Тема: Поняття архітектури комп’ютера фон Неймана.
- •Принцип використання двійкової системи числення
- •Принцип програмного керування роботою комп'ютера
- •Принцип збереження програм у пам'яті комп'ютера
- •Принцип адресності пам'яті
- •Тема: Алгоритм і його властивості.
- •Тема: Базові структури алгоритмів.
- •Метод вставок
- •Метод вибору
- •Розділ іі. Мова програмування паскаль. Тема: Методології розробки програм.
- •Тема: Загальні відомості про мову Паскаль.
- •Тема: Опис стандартних типів.
- •Тема: Циклічні конструкції.
- •Тема: Табличні величини. Масиви даних.
- •Тема: Рядкові типи.
- •Тема: Підпрограми.
- •Тема: Модуль Graph. Графічний режим.
- •Побудова рухомих зображень
- •Тема: Файловий тип.
- •Тема: Вказівники.
- •Тема: Тип запис.
- •Тема: Множинні типи.
- •Тема: Потоки. Введення-виведення даних.
- •Тема: Адреси даних. Вказівники. Динамічна пам'ять.
- •Тема: Розгалуження.
- •Тема: Основні відомості по структурному програмуванню.
- •Тема: Функції.
- •Тема: Масиви даних.
- •Робота з даними в динамічній пам'яті
- •Проблеми, що пов'язані з вказівниками
- •Тема: Форматування потоків.
- •Функції для управління графічною системою:
- •Функції для установки параметрів зображення:
- •Функції для отримання зображення на екрані:
- •Функції для отримання параметрів зображення:
- •Список літератури
Тема: Форматування потоків.
Форматування потоків.
Бібліотека потоків С++ передбачає форматування виведення: використання функцій-членів класу ios, прапорів і маніпуляторів.
Прапори форматування
Кожен потік введення-виведення пов’язаний з набором прапорів формату, які керують способом форматування інформації і являють собою бітові маски. Ці маски оголошені в класі ios як дані перелічувального типу, ці значення необхідні для встановлення або скидання прапорів формату. Прапори форматування введення-виведення перераховані в табл.
Коли прапор skipws скинений, невидимі символи не відкидаються. Якщо прапори left, right, internal, то за замовчуванням використовується вирівнювання по правому краю. За замовчуванням числові значення виводяться в десятковій системі числення. Якщо жоден з прапорів scientific або fixed не встановлений, то компілятор сам вибирає відповідний спосіб виведення. За замовчуванням коли встановлений прапор fixed, для десяткових цифр виводиться шість позицій.
Керують установками прапорів функції setf, unsetf і flags.
Для встановлення прапорів використовується функція setf( ), яка має такий формат:
long setf (long flags);
Таблиця Прапори форматування введення-виведення
Прапор |
Призначення |
skipws |
Пропускає при введенні пробіли, символи табуляції і нового рядка. |
left |
Вирівнювання виведення по лівому краю. |
right |
Вирівнювання виведення по правому краю. |
internal |
Для заповнення поля виведення відбувається вставка пробілів між усіма цифрами і знаками числа. |
dec |
Виведення здійснюється в десятковій системі числення. |
oct |
Виведення здійснюється у вісімковій системі числення. |
hex |
Виведення здійснюється в шістнадцятковій системі числення. |
showbase |
Показувати при виведенні основу системи числення. |
showpoint |
Для дійсних чисел виводить десяткову крапку і подальші нулі. |
uppercase |
При виведенні використовує букви верхнього регістра: символ X і букви А, В, С, D, Е, F для шістнадцяткових чисел; символ порядку Е для вісімкових чисел. |
showpos |
Додатні числа виводяться зі знаком +. |
scientific |
Використати експоненціальну (наукову) нотацію для дійсних чисел. |
fixed |
Для дійсних використати представлення в форматі з фіксованою крапкою. |
unitbuf |
Буфер очищається після кожної операції вставки. |
stdio |
Очищає потоки stdio, sterr після кожного виведення. |
boolalpha |
Значення булевого типу виводяться у вигляді ключових слів true і false |
При модифікації основи системи числення можна використати прапор basefield як другий параметр функції setf( ), це дозволяє встановити один з прапорів oct, dec і hex, якщо жоден з цих прапорів не встановлений, то за замовчуванням числа трактуються як десяткові.
При завданні способу вирівнювання можна використати прапор adjustfield як другий параметр функції setf( ), це гарантує, що функція setf( ) встановить лише один з трьох прапорів left, right, internal.
Прапори adjustfield, basefield, floatfield зручно використати в тому разі, коли перед установкою прапора потрібно скинути всі прапори, які не можуть бути одночасно з ним встановлені.
При завданні нотації дійсних чисел можна використати прапор floatfield як другий параметр функції setf( ), виклик cout.setf (0, ios::floatfield) відновлює в системі формат виведення з плаваючою крапкою за замовчуванням.
Дана функція повертає попереднє значення прапора, встановлюючи його нове значення рівним значенню, заданому параметром flags. При цьому всі інші прапори залишаються незмінними. Наприклад, для того, щоб встановити прапор showpos, можна використати таку інструкцію:
потік_введення-виведення. setf (ios::showpos);
де потік_введення/виведення — це потік, на який необхідно впливати.
cout. setf (ios::showpos);
Оскільки прапори визначені в класі ios, вони використовуються із зазначенням імені класу та операцією дозволу області видимості (::), тобто сам прапор showpos задати не можна, необхідно написати ios::showpos. Слід пам’ятати, що функція setf( ) є членом класу ios і впливає на створені цим класом потоки введення-виведення, тому будь-який виклик функції setf( ) робиться відносно конкретного потоку. Не можна викликати функцію setf( ) саму по собі. Кожний потік введення-виведення підтримує власну інформацію про стан формату.
Замість повторних викликів функції setf( ) в одному виклику можна встановити відразу кілька прапорів, для об’єднання необхідних прапорів використовується операція порозрядного АБО. Наприклад,
cout.setf (ios::hex ¦ ios::scientific);
Для відключення прапорів потрібно використати функцію unsetf( ). Прототип даної функції має вигляд:
long unsetf (long flags);
Функція повертає значення попередньої установлення прапорів і скидає прапори, визначені параметром flags. Наприклад,
cout.unsetf (ios::scientific);
Для того, щоб узнати поточні установки прапорів і при цьому нічого не міняти, використовується функція flags( ), яка має такий прототип:
long flags ( );
Ця функція повертає поточний стан прапорів потоку. Функція flags( ) має другу форму, яка дозволяє встановити прапорам значення, що повідомляється параметром і повернути попереднє значення прапорів. Прототип функції такий:
long flags (long flags);
Функції width( ), precision( ), fill( )
Крім прапорів у класі ios визначені три функції-члени, які дозволяють встановити ширину поля потоку, символ для заповнення і число цифр після десяткової крапки.
int width (int len);
Функція width( ) повертає поточну ширину поля потоку і встановлює нове мінімальне значення, що визначається параметром len. Якщо значення, що виводиться, має меншу ширину, ніж задана ширина поля, то зайві позиції заповнюються поточним символом заповнення, за замовчуванням визначений пробіл. Якщо значення, що виводиться, перевершує мінімальну ширину поля, то воно усікається, значення len ігнорується і значення виводиться повністю. Якщо функція використовується під час введення, то параметр задає максимальне число символів, що читаються.
int width ( );
Функція width( ) без параметрів повертає поточне значення змінної ширини поля потоку.
Для читання або зміни поточного символу заповнення можна використати функцію fill.
char fill ( );
Дана функція повертає поточний символ заповнення.
char fill (char ch);
Ця функція повертає колишнє значення символу заповнення і символ ch стає новим символом заповнення. Символ заповнення використовується для заповнення порожніх місць відповідно до заданої специфікації ширини поля.
За замовчуванням при виведенні з плаваючою крапкою точність дорівнює шести цифрам, однак це число може бути змінено за допомогою функції precisіon. Прототип функції є такими:
int precision (int num);
int precision ( );
Перша функція встановлює точність (число цифр, що виводяться після крапки), задану параметром num, і повертає колишнє значення точності. Нижче наведена програма, що демонструє використання цих функцій.
#include <iostream.h>
int main ( )
{ cout.setf (ios::scientific); //число виводиться в науковій нотації
cout << 987.65 << endl;
cout.setf (ios::fixed); //число виводиться в звичайній нотації
cout.width (10); //встановлення ширини поля
cout.precision (3); //встановлення точності в 3 цифри
cout << 987.654321 <<endl;
cout.width (9);
cout.fill ('*'); //встановлення символу заповнення *
cout.precision (2); //встановлення точності в 2 цифри
cout << 987.654321;
return 0;
}
Після виконання програми на екран буде виведено:
9.876500е+02
987.654
***987.65
Маніпулятори введення-виведення
Система введення-виведення С++ надає ще один спосіб зміни параметрів форматування потоку. Цей спосіб використовує спеціальні функції, які називаються маніпуляторами. Маніпулятори введення є в деяких випадках зручнішими, ніж прапори та функції формату класу ios. Маніпулятори можуть бути включені у вирази введення-виведення. Наприклад,
cout<<setw(6)<<х<<setw(4)<<у;
еквівалентно
cout.width(6);
cout << х;
cout.width(4);
cout << у;
Розрізняють прості і параметризовані маніпулятори, які вимагають вказівки параметра. Для доступу до маніпуляторів з параметрами необхідно в програму включити заголовний файл <iomanip.h>. Маніпулятори наведені в табл.
Маніпулятор впливає лише на потік, частиною якого є вираз введення-виведення, що містить маніпулятор, вони не впливають на всі відкриті в даний момент потоки. Маніпулятор setbase встановлює основу системи числення. Значення параметра base можуть бути: 0, 8, 10 і 16. При використанні параметра 0, основа за замовчуванням, при виведенні використовується десяткова основа, при введенні числа, що починається з ‘0’, вважається вісімковою, числа, що починається з ‘0x’ — шістнадцятковими. При використанні параметра 8 вважається, що використовується вісімкова основа, при 10 — десяткова і при 16 — шістнадцяткова. Інші основи ігноруються.
Таблиця Прості і параметризовані маніпулятори
Маніпулятор |
Опис |
boolalpha |
При введенні і виведенні встановлення прапора boolalpha. |
dec |
При введенні і виведенні встановлює прапор десяткової системи числення. |
endl |
Виведення нового рядка і чищення потоку. |
ends |
Виведення нульової ознаки кінця рядка. |
fixed |
При виведенні встановлення прапора fixed. |
flush |
Очищає вихідний потік (скидає його буфер). |
hex |
При введенні і виведенні встановлює прапор шістнадцяткової системи числення. |
internal |
При виведенні встановлення прапора internal. |
left |
При виведенні встановлення прапора left. |
noboolalpha |
При введенні і виведенні скидання прапора boolalpha. |
noshowbase |
При виведенні скидання прапора showbase. |
noshowpoint |
При виведенні скидання прапора showpoint. |
noshowpos |
При виведенні скидання прапора showpos. |
noskipws |
При введенні скидання прапора skipws. |
nounitbuf |
При виведенні скидання прапора unitbuf. |
nouppercase |
При виведенні скидання прапора uppercase. |
oct |
При введенні і виведенні встановлює прапор вісімкової системи числення. |
resetiosflags (long f) |
При введенні і виведенні скидає прапори, задані параметром f. |
right |
При виведенні встановлення прапора right. |
scientific |
При виведенні встановлення прапора scienfitic. |
setbase (int base) |
Встановлює основу системи числення. |
setfill (int ch) |
При виведенні встановлює символ заповнення, що дорівнює ch. |
setiosflags (long f) |
При введенні і виведенні установка прапора, заданого параметром f. |
setprecision (int р) |
При виведенні задає точність для дійсних чисел. |
setw (int w) |
Встановлює ширину поля, яка дорівнює w. |
showbase |
При виведенні встановлення прапора showbase. |
showpoint |
При виведенні встановлення прапора showpoint. |
showpos |
При виведенні встановлення прапора showpos. |
skipws |
При введенні встановлення прапора skipws. |
unitbuf |
При виведенні встановлення прапора unitbuf. |
uppercase |
При виведенні встановлення прапора uppercase. |
ws |
При введенні ігнорує початкові cимволи пробілу. |
Наприклад,
#include <iostream.h>
#include <iomanip.h>
void main()
{ cout << setiosflags (ios::fixed);
cout << setprecision(2) << 500.6754 << endl;
cout << setfill ('#') << setprecision(4) << 1.23456;}
Неформатоване введення-виведення.
Для прочитання та запису блоків даних використовуються функції read( ) і write( ), які є членами потокових класів введення і виведення відповідно. Прототипи функцій такі:
istream &read (char *buf, streamsize num);
ostream &write (const char *buf, streamsize num);
Функція read( ) прочитує num байтів із викликаючого потоку і передає їх у буфер, визначений вказівником buf. Тип streamsize визначений як ціле число. Якщо кінця файла досягнуть до того, як було прочитано num байтів, виконання функції припиняється, а буфер містить стільки символів, скільки було прочитано. Визначити, скільки було прочитано символів, можна, використовуючи функцію-член gcout( ), прототип якої є таким:
int gcout( );
Функція повертає кількість символів, прочитаних під час останньої операції введення.
Функція write( ) записує у відповідний потік з буфера, який визначений вказівником buf, задане num число байтів.
Помилки потоків.
По замовчуванню потік введення-виведення не видає ніяких виключень.
Ви повинні явно активізувати виключення самі. Для цієї мети потік містить маску виключень. Кожна з ознак цієї маски відповідає одній із ознак помилки (стану потока). Ключову роль в виданні виключень відіграють дві функції – члени класу ios:
iostate exceptions() const;
Ця функція повертає маску, яка визначає, які ознаки стану, встановлені в масці ознак стану, будуть викликати викид виключень. Вона неявно використовує виклик функції rdstate(). Інша функція:
void exceptions(iostate except);
встановлює маску виключень потоку в значення, яке визначається змінною except, а потім викликає clear(rdstate()) для скиду, можливо, встановлених бітів маски стану потоку. Наприклад, якщо ознака badbit встановлена в масці виключень, виключення буде викинено, якщо ця ознака буде встановлена в масці стану потоку. Наступний приклад демонструє, як можна активізувати виключення в потоці введення:
try
{
іfs.exceptions(ios::badbit | ios::failbit);
in>>x;
…
}
catch(ios::failure&e)
{
cerr<<e.what()<<endl;
throw;
}
При виклику функції exceptions() Ви вказуєте, які ознаки стану потоку будуть викликати викид виключень. Об’єкти, які викинені потоковими операціями введення-виведення, є довільними від виключення ios::failure. Відмітимо, що будь-які зміни стану потоку будуть призводити до викиду виключень. Це відбувається тому, що функції setstate() та exception() призводять до викиду виключення, якщо в масці виключень встановлений відповідний біт. Відповідно, оператор catch, який наведений вище, буде ловити всі виключення, які пов’язані з потоками. Рекомендується активізувати виключення по ознаці badbit та подавити виключення по ознакам eofbit та failbit, оскільки вони, не представляють виключень стану.
Функції обробки помилок
int ferror (FILE *stream);
Здійснює перевірку наявності помилок при читанні-записуванні для заданого потоку, на який вказує stream. Якщо встановлена ознака помилки потоку, то вона зберігає її до моменту закриття потоку або до виклику функцій clearerr( ) і rewind( ). Повертає ненульове число, якщо для відкритого файла, на який вказує stream, виникла помилка, в іншому разі повертає нуль
int clearerr (FILE *stream);
Очищає ознаку помилки та ознаки кінця файла для вказаного потоку.
Розглянемо описані функції на прикладі. Скажімо, потрібно обчислити кількість працівників, що мають безперервний загальний стаж роботи до 5 років, від 5 до 10 років, від 10 до 20 і більше років. Необхідно створити файл даних на магнітному диску, який міститиме таку інформацію: код підприємства, код цеху, табельний номер працівника, стаж загальний, стаж безперервний, розряд. Вихідну інформацію слід представити ось у якій формі:
Код підприємства |
Кількість працівників з безперервним стажем |
|||
до 5 років |
від 5 до 10 |
від 10до 20 |
понад |
|
// Створення файла даних
#include <stdio.h>
#include <conio.h>
// Оголошення структурного шаблона
struct sv {
int vz;
char kpr[6];
char kc[3];
char tab[6];
char gr[3];
int sto;
int stn;
char razr[2];};
void main( )
{ struct sv v; // Оголошення структурної змінної
struct sv vi;
FILE *fl; // Оголошення вказівника на файл
int priz = 0;
clrscr( );
fl = fopen ("sved1", "w+");
printf ("\n Продовження — 1");
do { v.vz = 0;
printf("\n Введіть код підприємства ");
scanf ("%s",&v.kpr);
printf ("\n Введіть код цеху ");
scanf ("%s",&v.kc);
printf ("\n Введіть табельний номер ");
scanf ("%s",&v.tab);
printf ("\n Введіть рік народження ");
scanf ("%s",&v.gr);
printf ("\n Введіть загальний стаж");
scanf ("%d",&v.sto);
printf ("\n Введіть безперервний стаж");
scanf ("%d",&v.stn);
printf ("\n Введіть розряд ");
scanf ("%s",&v.razr);
fwrite (&v,sizeof(v),1,fl);
printf ("\n Введіть ознаку продовження");
scanf ("%d",&priz);
}
while (priz = = 1); // Цикл формування запису
clrscr ( );
rewind (fl);
do
{fread(&vi,sizeof(vi),1,fl);
if(!feof(fl))
{printf("\n%2d%6s%3s%6s%3s% 2d% 2d%2s",vi.vz,vi.kpr, vi.kc,
vi.tab,vi.gr,vi.sto,vi.stn,vi.razr);
getch();}
}
while (!feof(fl));
fclose (fl);
}
// Обробка файла
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct sv {
int vz;
char kpr[6];
char kc[3];
char tab[6];
char gr[3];
int sto;
int stn;
char razr[2];};
struct itog {
char kpr[6];
int s1;
int s2;
int s3;
int s4;
};
main( )
{ struct sv v;
struct itog i;
FILE *fl;
clrscr( );
fl = fopen ("sved1","r");
// Виведення шапки вихідного документа.
printf ("\n——————————————");
printf ("\n| код |кіл-сть роб. з непр. стаж. |");
printf ("\n|підпр. |до 5| 5-10|10-20| вище |");
printf ("\n——————————————");
fread (&v,sizeof(v),1,fl); // Читання першого запису з файла.
// Обробка прочитаного запису
while (feof(fl) = = 0)
{ stpcpy (i.kpr,v.kpr);
i.s1 = 0; i.s2 = 0; i.s3 = 0; i.s4 = 0;
while (feof(fl) = = 0 && atoi(v.kpr) = = atoi(i.kpr))
{
if (v.stn<5)
i.s1++;
else if (v.stn> = 5 &&v.stn<10)
i.s2++;
else if (v.stn> = 10 &&v.stn<20)
i.s3++;
else
i.s4++;
fread (&v,sizeof(v),1,fl); // Читання чергового запису
if (!feof(fl) && v.vz = = 1)
while (!feof(fl) && v.vz = = 1)
{ fread (&v,sizeof(v),1,fl);
if (feof(fl)) break; }
if (feof(fl) = = 0 && atoi(v.kpr)! = atoi(i.kpr))
{ printf ("\n| %5s | %d | %d | %d | %d |",
i.kpr,i.s1,i.s2,i.s3,i.s4);
}
if (feof(fl)! = 0)
{ printf("\n| %5s | %d | %d | %d | %d |",
i.kpr,i.s1,i.s2,i.s3,i.s4);
printf("\n——————————————");
}
}}
getch();
fclose(fl);
}
Переадресація введення-виведення.
Ви можете переназначити імена cin або cout файловим потокам. Це дозволяє легко проводити відладку введення-виведеня, переадресовуючи введення-виведення замість файла на екран. Наступний приклад демонструє цю можливість:
#include <iostream.h>
#include <fstream.h>
usign namespace std;
int main(int argc, char* argv[])
{
char str[80];
//створюємо файловий потік
ofstream ofs;
//якщо в командному рядку заданий аргумент
cout<<” Введіть ім’я та прізвище: \n”;
cin.getline(str,sizeof(str));
if (argc>1)
{
//відкриваємо файл з заданим іменем
ofs.open(argv[1]);
//якщо файл успішно відкритий
if (ofs)
//переадресовуємо виведення
cout=ofs;
}
cout<<”Привіт,”<<str<<”!”<<endl;
return 0;
}
Якщо при запуску програми в командному рядку задано імя файлу, то виведення здійснюється в цей файл, в протилежному випадку на екран терміналу.
Питання для самоконтролю:
Що називають маніпулятором введення-виведення?
Для чого використовують функції read() та write()?
Як здійснити форматування потоків?
Яке введення-виведення є неформатованим?
Які можуть виникати помилки потоків?
Як виконується пере адресація введення-виведення?
Тема: Графічні можливості мови програмування С++.
Формування меню в графічному режимі. Створення графічних примітивів в С++.
Графічні засоби в мові С++ повністю відсутні. Всі можливості для роботи з графікою конкретні реалізації надають у вигляді додаткових бібліотек графічних функцій. Як інструмент для роботи з графікою використано графічну бібліотеку під MS-DOS компіляторів фірми Borland, оскільки ці компілятори найбільш доступні в нашій країні, особливо на малопотужних ЕОМ, і найчастіше використовуються в навчальному процесі. Ніяких інших причин для вибору саме цієї графічної бібліотеки і цих компіляторів не було. Тут приводиться список бібліотечних функцій, які можуть бути корисними при самостійному рішенні задач, пов'язаних з графікою. Інформації, що приводиться, іноді виявляється недостатньо для безпомилкового застосування тієї або іншої функції, але можливість отримання довідок при роботі з компілятором в діалоговому режимі зазвичай дозволяє швидко усунути виникаючі утруднення.
Для роботи з графічною бібліотекою необхідно включити в програму заголовний файл graphics .h.
