68965

Потоковий ввід-вивід

Лекция

Информатика, кибернетика и программирование

Потоки cin і cout є класовими об’єктами, визначуваними і створюваними за допомогою заголовного файлу iostream.h. Як об’єкти cin і cout підтримують різні оператори і операції. З даного уроку ви дізнаєтеся, як розширити можливості введення і висновку, використовуючи функції...

Украинкский

2014-09-28

48 KB

0 чел.

Лекція № 10

Тема: Потоковий ввід-вивід

План

  1.  Потоки cin та cout
  2.  Маніпулятори
  3.  Ввід та вивід одного символу
  4.  Введення рядка символів

Потоки cin і cout

Потоки cin і cout є класовими об'єктами, визначуваними і створюваними за допомогою заголовного файлу iostream.h. Як об'єкти cin і cout підтримують різні оператори і операції. З даного уроку ви дізнаєтеся, як розширити можливості введення і висновку, використовуючи функції, вбудовані в класи cin і cout. Файл iostream.h. містить визначення, що дозволяють вашим програмам використовувати cout для виконання висновку і cin для виконання введення. Точніше, цей файл визначає класи istream і ostream (вхідний потік і вихідний потік), а cin і соut є змінними (об'єктами) цих класів. Виберіть час, щоб надрукувати файл iostream.h. Він знаходиться в підкаталозі INCLUDE. Визначення в цьому файлі достатньо складні. Проте якщо ви пройдете по файлу поволі, то виявите, що більшість визначень є просто визначеннями класів і констант. Усередині файлу ви знайдете оголошення змінних cin і cout.

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

cout є класом, який містить декілька різних методів. Наступні програми ілюструють використання деяких методів, які ваші програми можуть застосовувати для форматування висновку. Маніпулятор setw дозволяє вашим програмам вказати мінімальну кількість символів, яка може зайняти наступне вихідне значення:

#inсlude <iostream.h>

#include <iomanip.h>

void main(void)

{cout << "Моє улюблене число" << setw(3) << 1001 << endl;
cout << "Моє улюблене число" << setw (4) << 1001 << endl;
cout << "Моє улюблене число" << setw (5) << 1001 << endl;
cout << "Моє улюблене число" << setw(6) << 1001 << endl;

Так само метод cout.width дозволяє вам вказати мінімальну кількість символів, яка використовуватиметься для виведення наступного значення. Наступна програма використовує функцію cout.width для виконання роботи, аналогічної тій, яку виконує setw, що і показане нижче:

#include <iostream.h>

#include <iomanip.h>

void main (void)

{int i;
for (i = 3; i < 7; i++)

cout << "Моє улюблене число";
cout.width (i);
cout << 1001 << endl;

Якщо ви відкомпілюєте і запустите вашу програму, на екрані дисплея з'явиться наступний висновок:

Моє улюблене число1001

Моє улюблене число 1001

Моє улюблене число  1001

Моє улюблене число   1001

Подібно до маніпулятора setw, ширина, вибирана за допомогою функції cout.width, діє тільки для наступного вихідного значення.

Якщо ви використовуєте маніпулятор setw або функцію cout.width для управління шириною висновку, cout поміщатиме пропуски до (або після для вирівняних вліво) значень, як це і потрібно. Залежно від призначення вашої програми ви, можливо, захочете використовувати символ, відмінний від пропуску. Припустимо, наприклад, що ваша програма створює таку таблицю:

В даному випадку висновок передує номерам сторінок крапками. Функція cout.fill дозволяє вам вказати символ, який cout використовуватиме для заповнення порожнього простору. Наступна програма створює таблицю, подібну приведеною вище:

#include <iostream.h>

#include <iomanip.h>

void main(void)

{cout << "Таблиця інформації" << endl;
cout.fill (' . ');
cout << "Профіль компанії" << setw(20) << 10 << endl;
cout << "Доходи і збитки компанії" << setw(12) << 11 << endl;
cout << "Члени правління компанії" << setw(14) << 13 << endl;

Якщо ви одного разу вибрали символ-заповнювач за допомогою cout.fill, він залишатиметься дійсним, поки ви не зміните його повторним викликом cout.fill.

Якщо ви використовуєте cout для виведення значення з плаваючою крапкою, то зазвичай не можете зробити яких-небудь припущень про те, скільки цифр виводитиме cout no умовчанню. Проте, використовуючи маніпулятор setprecision, ви можете вказати кількість необхідних цифр- Наступна програма використовує маніпулятор setprecision для управління кількістю цифр, які з'являться праворуч від десяткової крапки:

#include <iostream.h>

#include <iomanip.h>

void main(void)

{float value = 1.23456;
int i;
for (i = 1; i < 6; i++) cout << setprecision(i) << value << endl;

Коли ви відкомпілюєте і запустите цю програму, на екрані дисплея з'явиться наступний висновок:

1.2

1.23

1.235

1.2346

1.23456

Якщо ви використовуєте маніпулятор setprecision для зміни точності, ваша установка діє до тих пір, поки програма повторно не використовує setprecision.

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

Залежно від призначення вашої програми вам, можливо, потрібно буде виводити символи на дисплей або читати з клавіатури по одному символу за один раз. Для виведення одного символу за один раз ваші програми можуть використовувати функцію cout.put. Наступна програма використовує цю функцію для висновку на екран повідомлення Вчимося програмувати на мові C++! по одному символу за раз:

#include <iostream.h>

void main(void)

{char string[] = "Вчимося програмувати на мові C++!";
int i;
for (i = 0; string[i]; i++) cout.put(string[i]);

Бібліотека етапу виконання надає функцію з ім'ям toupper, яка повертає заголовний еквівалент рядкової букви. Наступна програма використовує функцію toupper для перетворення символу у верхній регістр, а потім виводить цю букву за допомогою cout.put.

#include <iostream.h>

#include <ctype.h> // прототип toupper

void main(void)

{char string[] = "C++ language";
int i;
for (i = 0; string[i]; i++) cout.put(toupper(string[i]));
cout << endl << "Результуючий рядок: " << string << endl;

Якщо ви відкомпілюєте і запустите цю програму, на екрані дисплея з'явиться наступний вывод*:

C++ LANGUAGE

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

Точно так, як і cout надає функцію cout.put для виведення символу, cin надає функцію cin.get, яка дозволяє вам читати один символ даних. Щоб скористатися функцією cin.get, ви просто привласнюєте змінною що повертається цією функцією символ, як показано нижче:

letter = cin.get();

Наступна програма виводить повідомлення, у відповідь на яке вам необхідно ввести Y або N. Потім вона повторює в циклі виклик cin.get для читання символів, поки не отримає Y або N:

#include <iostream.h>

#include <ctype.h>

void main(void)

{char letter;
cout << "Хочете продовжувати? (Y/N): ";
do

letter = cin.get();
// Перетворити до верхнього регістра
letter = toupper(letter);
while ((letter != 'Y') && (letter != 'N'));
cout << endl << "Ви ввели " << letter << endl;

Читання з клавіатури цілого рядка

Як ви вже знаєте, при використанні cin для виконання введення з клавіатури, cin використовує порожні символи, такі як пропуск, табуляція або повернення каретки, для визначення, де закінчується одне значення і починається інше. У багатьох випадках ви захочете, щоб ваші програми прочитували цілу рядок даних в символьний рядок. Для цього програми можуть використовувати функцію cin.getline. Для використання cin.getline вам необхідно вказати символьний рядок, в який поміщатимуться символи, а також розмір рядка, як показано нижче:

cin.getline(string, 64);

Коли cin.get читає символи з клавіатури, вона не читатиме символів більше, ніж може вміщати рядок. Зручним способом визначити розмір масиву є використання оператора C++ sizeof, як показано нижче:

сin.getline(string, sizeof(string));

Якщо пізніше ви зміните розмір масиву, то вам не потрібно буде шукати і змінювати кожного оператора з cin.get, що зустрічається у вашій програмі. Натомість оператор sizeof використовуватиме коректний розмір масиву. Наступна програма використовує функцію cin.getline для читання з клавіатури рядка тексту:

#include <iostream.h>

void main(void)

{char string[128];
cout << "Введіть рядок тексту і натисніть Enter" << endl;
cin.getline(string, sizeof(string));
cout << "Ви ввели: " << string << endl;

Коли ви читаєте символи з клавіатури, то, можливо, вам знадобиться читати символи і включаючи певний символ. Коли такий символ буде прочитаний, можливо, ви захочете завершити операцію введення. Для виконання подібної операції ваша програма може передати шуканий символ в cin.getline. Наприклад, наступний виклик примушує функцію cin.getline читати рядок тексту, поки не зустрінеться повернення каретки, або поки не будуть прочитано 64 символи, або поки не зустрінеться буква Я:

cin.getline(string, 64, 'Я');

Наступна програма використовує cin.getline для читання рядка тексту або символів аж до появи букви Я (включаючи і цю букву):

#include <iostream.h>

void main(void)

{char string[128];
cout << "Введіть рядок тексту і натисніть Enter" << endl;
cin.getline(string, sizeof(string), '
Я');
 cout << "Ви ввели: " << string << endl;

Відкомпілюйте і запустіть цю програму. Експериментуйте з різними рядками тексту. Деякі з них починайте з букви Я, деякі закінчуйте буквою Я, а деякі хай взагалі не містять букву Я.


 

А также другие работы, которые могут Вас заинтересовать

22234. Криптографическая система 256 KB
  Замыслом который стал определяющим при формировании настоящей программы Вашей подготовки стала задача ознакомления Вас с двумя наиболее сложными в теоретическом да и практическом отношении криптоаналитическими атаками позволившими в свое время найти слабости в широко известном и все еще применяемом до настоящего времени стандарте симметричного блочного шифрования США алгоритме DES. Поэтому хотя сегодня уже шифр DES можно считать уходящим со сцены представляется целесообразным изучение принципов выполнения указанных выше...
22235. Дифференциальный криптанализ 528 KB
  Для DESподобных криптосистем различие выбирается как побитовая сумма по модулю два XOR значений двух текстов в модульной арифметике  разность пары текстов. Эта операция в дальнейшем для краткости будет обозначаться аббревиатурой из английских букв  XOR2. Данное фиксированное значение XOR входной пары правых полу блоков для F функции легко определяет свое XOR значение после расширения по формуле: EXEX = EXX. XOR с ключом не изменяет значение XOR в паре т.
22236. Введение в дифференциальный криптанализ 741 KB
  Будем говорить что X может вызвать Y с вероятностью p для F функции если p есть доля всех возможных входных пар зашифрованных всеми возможными значениями подключа в которых входной XOR F функции равен X а выходной XOR равен Y. Если в DES X  Y X переходит в Y с вероятностью p для F функции то каждая фиксированная входная пара Z Z с Z = ZZ= X образует выходной XOR F функции равный Y с той же самой долей p возможных значений подключа. Очевидно что для каждого входного XOR имеем = независимо от ключа KS. Если имеется k входных пар...
22237. Введение в дифференциальный криптанализ. Итеративные характеристики 401.5 KB
  Статистическое поведение большинства характеристик не позволяет нам искать пересечение всех ключей предложенных поддерживаемых различными парами как это мы делали в примере 6 Л2 так как пересечение обычно пустое: неправильные пары не обязательно указывают на правильный ключ как возможное значение. Однако мы знаем что правильное ключевое значение должно быть результатом всех правильных пар которые встречаются приблизительно с характеристической вероятностью с вероятностью характеристики. Все другие возможные ключевые значения...
22238. Атака на DES уменьшенный до восьми циклов 414 KB
  Введение в дифференциальный криптанализ 1 Атака на DES уменьшенный до восьми циклов Чтобы найти другие биты Эли Бихам и Ади Шамир фильтруют все пары и оставляют только те которые имеют ожидаемое значение используя при этом известные значения h и значения ключевых битов K8 входящих в S6 S7 и S8. Ожидаемое число остающихся пар есть 53. Они применяют аналогичный метод счета используя увеличенное отношение S N созданное большой концентрацией правильных пар и затем снова фильтруют пары. Неправильная пара не отвергается этим или...
22239. Введение в дифференциальный криптанализ 626 KB
  Анализ требований к отбору S блоков разработчиков стандарта. В этом разделе мы хотим высказать свою версию обоснования требований к отбору S блоков выдвинутых разработчиками стандарта. Критерии отбора S блоков: 1. Если два входа S блока отличаются своими первыми двумя битами и имеют совпадающими 2 последних бита то выходные биты не должны быть теми же самыми  для любых e и f; Для любых ненулевых 6ти битовых различий между входами не более чем 8 из 32 пар входов могут показывать одни и те же выходные различия; Критерий подобный...
22240. Способ равных допусков 47 KB
  На размеры всех составляющих звеньев кроме увязочного назначается допуски из одного квалитета с учетом номинального размера звена. Вероятностный метод допусков расчета составляющих звеньев. допустить выбор подбор или изменение величины некоторых звеньев цепи от можно расширить в несколько раз допуски звеньев и соответственно снизить затраты за счет непринятия в расчет маловероятностных комбинаций числовых значений тех же звеньев цепи. Для вероятностного расчета допусков нужно располагать информацией о предполагаемых законах распределения...
22241. Отклонение формы и расположения 938 KB
  В основе нормирования и отсчетов отклонения формы и расположения поверхностей заложен принцип прилегающих поверхностей и профилей. База – это есть элемент детали определяющий одну из плоскостей или осей системы координат по отношению к которой задается допуск расположения или определяется отклонение рассматриваемого элемента. Все отклонения и допуски подразделяются на 3 группы: отклонение формы; отклонение расположения; суммарное отклонение.
22242. Допуски и посадки подшипников качения 197 KB
  Присоединительными поверхностями подшипника качения являются наружный Диаметр D наружной поверхности подшипника и внутренний диаметр d внутреннего кольца подшипника а также ширина В колец. Таким образом за номинальные диаметры подшипника принимаются диаметры его посадочных поверхностей D и d. Основная присоединительная поверхность подшипников качения по которым они монтируются на валах и корпусах машин это отверстие во внутреннем кольце подшипника и наружная поверхность наружного кольца подшипника. Посадки подшипников на вал выполняются...