Потоки. введення - виведення даних
1. Потоки.У C++ немає вбудованих команд уведення-виведення даних. Для організації введення-виведення тут реалізована концепція потоків, яка визначена у спеціальних модулях. У модулі istream.h описані команди введення, у модулі ostream.h – команди виведення, а у модулі iostream.h – команди виведення і введення.
Під потоком розуміють процес уведення-виведення інформації у файл. Периферійні пристрої введення-виведення, такі як клавіатура, монітор, принтер, розглядаються як текстові файли (див. далі). Під час виконання будь-якої програми автоматично підключаються стандартні потоки для введення даних з клавіатури (сіn), виведення на екран (cout), виведення повідомлення про помилки (сеrr) і допоміжний потік (clog).
Стандартні потоки використовують команди введення (>>) та виведення (<<) даних. За замовчуванням стандартним пристроєм для потоків виведення даних і повідомлень про помилки є монітор користувача, а для потоку введення даних – клавіатура. Однак потоки можна перенаправляти, наприклад, можна зчитувати вхідну інформацію для програми не з клавіатури, а з деякого текстового файлу на диску (див. § 7).
2. Команда введення даних. Надавати значення змінним ніжна двома способами: за допомогою команди присвоєння, наприклад х = 3.1, або команди уведення даних із клавіатури. Команда уведення даних із клавіатури дає змогу виконувати програму для різних вхідних даних, що робить її більш універсальною (масовою). Команда введення >> описана у бібліотеці iostream.h (istream.h) і має такий загальний вигляд:
сіn >> <змінна>;
Дія команди. Виконання програми зупиняється. Система переходить у режим очікування введення даного (екран темний, миготить курсор). Користувач набирає на клавіатурі значення змінної і натискає на клавішу вводу. У результаті виконання цієї команди змінній буде присвоєне конкретне значення (те, яке користувач уведе з клавіатури).
Якщо необхідно ввести значення відразу для декількох змінних, то можна або використати декілька потоків введений, або записати усі змінні в одному потоці сіп, застосувавши для цього декілька команд ">>", а саме:
сіn >> <змінна 1> >> <змінна 2> >> ... >> <зміннаN>;
Розглянемо програму Трикутник1 з § 3. Значення сторін можна ввести, наприклад, так:
inta, b, с; сіn>> а; cin>> b; cin>> с;
Під час виконання програми на клавіатурі набираємо
3 J (натискаємо на клавішу Enter)
4 J
5 J
У результаті виконання команд змінні набувають таких значень: а = 3, b = 4, с = 5.
Значення змінних також можна вводити через пропуск. Тобто на клавіатурі можна набрати 3 4 5 J. Одним потоком змінним можна надати значення так:
сіn >> а >> b >> с;.
Якщо у списку введення (який набрали на клавіатурі) даних більше, ніж змінних, то зайві дані будуть зчитані наступною командою введення. Якщо така команда у програмі від сутня, вони будуть проігноровані.
Програми необхідно складати так, щоб ними могли користуватись не лише укладачі, але й інші особи. Тобто програми мають бути масовими і зрозумілими. Перед командою введення даних варто записувати команду виведення на екран текстового повідомлення-підказки про те, що саме слід ввести. Наприклад, у програмі Трикутник1 можна вивести повідомлення "Введіть сторони трикутника" або "а, b, с =" тощо, а вже після цього записувати команду введення:
cout << "Bведіть сторони трикутника"; сіn >> а >> b >> с;
3. Команда виведення даних. Для виведення на екран повідомлень і результатів обчислень використовують стандартний потік виведення coutі команду <<, які визначені у бібліотеці iostream.h (ostream.h):
cout << <вираз 1> << <вираз 2> << ... << <вираз N>;
У списку виведення можуть бути сталі, змінні або вирази. Елементи списку у потоці coutвідокремлюють командами «.
Дія команди. Сталі, значення змінних та виразів виводяться на екран у вікно виведення. Це вікно можна переглянути за допомогою команд Window →User screen головного вікна компілятора або комбінації клавіш Alt+F5.
Текстові повідомлення у команді виведення записують у лапках. Лапки на екран виводитися не будуть.
Результати виконання програми Трикутник (периметр і площу) можна вивести, наприклад, так:
cout << "Периметр = " << р;
cout << "Площа = " << s;
На екрані одержимо
Периметр = 12Площа = 6
Як бачимо, результати зливаються. Для того, щоб дані виводились у потрібному для користувача вигляді, використовують керуючі послідовності.
4. Керуючі послідовності. Керуючі послідовності – це комбінації спеціальних символів, які використовуються для введення та виведення даних. Керуюча послідовність складається із символу слеш "\" і спеціально означеного символу. Вони призначені для форматованого виведення результатів обчислень на екран, наприклад, для переходу на новий рядок, подання звукового сигналу, а також для виведення на екран денних спеціальних символів: апострофа, лапок тощо. Основні керуючі послідовності наведені у табл. 5.
Таблиця 5. Керуючі послідовності
Символи керуючих послідовностей | Коментар |
\a, \7 | Подати звуковий сигнал |
\b | Повернути курсор на один символ назад (знищити попередній символ) |
\f | Перейти на нову сторінку |
\n | Перейти на новий рядок |
\r | Повернути курсор на початок рядка |
\t | Перевести курсор до наступної позиції табуляції |
\v | Вертикальна табуляція |
\\ | Вивести символ похилої риски |
\’ | Вивести символ апострофа |
\” | Вивести символ лапок |
\? | Вивести знак запитання |
Керуючі послідовності разом з коментарями записують у .мішках. Розглянемо дію цих послідовностей на прикладі. Якщо записати команди
cout << "Увага! \a\n "; cout<< "Дане \"а\" введено некоректно \n";
cout << "Виконайте програму ще раз";
то буде подано звуковий сигнал і на екрані побачимо
Увага!
Дане "а" введено некоректно
Виконайте програму ще раз
Якщо використати послідовність, невизначену у мові C++ (наприклад, \u), то компілятор пропустить символ послідовності (похилу риску) і виведе на екран лише символ, записаний після риски (у нашому випадку літеру u).
Зауваження 1. Замість керуючої послідовності \n можна використовувати команду endl – кінець рядка. Наприклад, ці дві команди рівносильні:
cout<< "f=" << f << "\n";
cout<< "f=" << f << endl;.
Зауваження 2. Значення дійсних чисел (тип float)можна виводити на екран у стандартному або науковому форматах. Якщо значення даного необхідно заокруглити до п значущих цифр, то перед командою виведення треба записати cout.precision(n) Для подання результатів у науковому форматі необхідні під'єднати файл заголовка iomanip.h і перед командою виведення записати
cout<< setiosflags(ios::scientific);.
Задача 1 (про трикутник, заданий координатами вершин).Дано координати трьох вершин трикутника А(1; 1), В(2; 2) та С(-1; 2). Обчислити медіану ть і радіус описаного кола r.
#include<iostream.h> // Трикутник2
#include<math.h> //Бібліотека математичних функцій
#include<conio.h>
voidmain()
{
clrscr(); // Очищаємо екран
float x1,x2, хЗ, y1, y2, уЗ; // Оголошуємо змінні та вводимо дані
cout <<"Введіть координати точки А";
сіn >> х1 >> уі:
cout<< "Введіть координати точки В";
сіn>> х2 >> у2;
cout<< "Введіть координати точки С";
сіn>> хЗ >> уЗ;
floata, b, с, х, у, mb, p, s, r; // Оголошуємо додаткові змінні
II Обчислюємо довжини сторін трикутника
а = sqrt(pow((x3 - х2), 2) + pow((y3 - у2), 2));
b = sqrt(pow((x1 - хЗ), 2) + pow((y1 - уЗ), 2));
с = sqrt(pow((x1 - х2), 2) + pow((y1 - у2), 2));
х = (х1 + хЗ) / 2; // Обчислюємо координати
у = (у1 + уЗ) / 2; // середини сторони b
mb = sqrt(pow((x - х2), 2) + pow((y - у2), 2)); // Обчислюємо медіану mb
р = (а + b + c) / 2; // Обчислюємо периметр
s = sqrt(p * (р - а) * (р - b) * (р – с)); // Обчислюємо площу
г = а * b * с / (4 * s); // Обчислюємо радіус
cout<< "mb = " << mb << "\n"; // Виводимо значення медіани
cout << "r = " << r « "\n"; // Виводимо радіус
getch(); //Затримуємо результати на екрані
}
Під час виконання програми функція clrscr() зітре з екрана усі результати та повідомлення попередніх програм (якщо такі будуть), і на чистому екрані матимемо
mb = 2.061553 г= 1.581139
У програмі Трикутник2 описано під'єднання бібліотеки conio.h, де визначена функція clrscr() – очищення екрана та функція getch(), яка дає змогу затримати на екрані результати викопний програми, доки не буде натиснута довільна клавіша на клавіатурі.
Довідка. Для розв'язування типових задач про трикутник наведемо формули обчислення деяких величин:
відстань d між точками (x1, у1), (х2, у2):
координати середини відрізка:
півпериметр трикутника:
площа трикутника:
висота трикутника:
, ,
бісектриса трикутника:
, ,
радіус описаного кола:
радіус вписаного кола:
де a,b, с - сторони, а α, β, γ –відповідно кути трикутника.
5. Перенаправления потоків введення-виведення у MS DOS.Іноді вхідні дані для exe-файлу програми зручно зчитувати з деякого файлу, а не вводити кожного разу вручну з клавіатури. Для цього необхідно перенаправити потік введення, увівши у командному рядку
<назва ехе-файлу> < <назва файлу з вхідними даними>
Приклад 1. Нехай програма Трикутник2 зберігається у файлі tyrik.exe, а у файлі dani.txt записано шість дійсних чисел – координат вершин трикутника. Тоді виконати програму і зчитати для неї дані з файлу dani.txt можна так:
tyrik.exe < dani.txt
Щоб вивести результати виконання програми у файл, у Командному рядку слід увести
<назва ехе-файлу> > <назва файлу з результатами>
Командою tyrik.exe > res1.txt. результати програми tyrik.exe будуть занесені у файл resl.txt.
Можна одночасно перенаправляти два потоки, тобто зчитувати дані з одного файлу та виводити їх у інший:
<назва ехе-файлу> < <назва файлу з вхідними даними> І > <назва файлу з результатами>
Якщо результати файлу file1 необхідно використати як вхідні дані файлу file2, то стандартне введення однієї програмі можна з'єднати каналом із стандартним виведенням іншо так:
file1 I file2
Вправи
1. Розгляньте вправу 1 § 4. Переробіть програму для обчисленню значення функції вашого варіанта з розділу "Задачі", використовуючи команду введення даних. Виконайте програму тричі для трьох різних значень аргументу. Занотуйте результати.
2. Розв'яжіть задачу № 2 вашого варіанту з розділу "Задачі". Про експериментуйте з функціями clrscr() та getch(). Результати:
а) виведіть на екран і занотуйте у звіт;
б) занесіть у файл Myres.dat.
3. Створіть текстовий файл, який містить значення шести координат вершин трикутника. Виконайте програму Трикутник2, зчитавши вхідні дані зі створеного файлу.