Классы потоков ввода-вывода данных. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Классы потоков ввода-вывода данных.



 

Цель работы: отработка умений и навыков работы с классами потоков ввода и вывода данных при проектировании программ на С/С++.

Теория:

(см. lek10.pdf)

 

Задание.

Написать программу, реализующую использование потоков ввода-вывода данных.

Варианты заданий.

Вариант 1. Напишите программу для проверки вводимых целых значений в десятичном, восьмеричном и шестнадцатеричном форматах. Выводите каждое прочитанное целое число во всех трех форматах. Проверьте программу со следующими входными данными: 10, 010, 0x10.

Вариант 2. В программе PhoneNumber (см. lek10.pdf) операции взять из потока и поместить в поток были перегружены для ввода и вывода объектов класса PhoneNumber. Перепишите операцию взять из потока так, чтобы она контролировала вводимые данные. Функция operator>> должна быть полностью переписана в соответствии со следующим алгоритмом:

· Введите телефонный номер целиком в массив. Проверьте, что введено соответствующее число символов. Всего для телефонного номера должно быть прочитано 14 символов вида (800) 555-1212. Используйте функцию-элемент потока clear для установки флага ios::failbit в случае неправильного ввода.

· Код местности и коммутатор не должны начинаться с 0 или 1. Проверьте первую цифру в коде местности и коммутаторе, чтобы быть уверенными, что они не начинаются ни с 0, ни с 1. Используйте функцию-элемент потока clear для установки флага ios::failbit в случае неправильного ввода.

· Средняя цифра кода местности всегда 0 или 1. Проверьте среднюю цифру на 0 и 1. Используйте функцию-элемент потока clear для установки флага ios::failbit в случае неправильного ввода. Если ни одна из приведенных выше операций не привела к установке флага ios::failbit, скопируйте три части телефонного номера в элементы areaCode, exchange и line объекта класса PhoneNumber. В главной программе прежде чем печатать телефонный номер надо проверить, не установлен ли ios::failbit, свидетельствующий о неправильном вводе. Если установлен, то программа должна напечатать сообщение об ошибке и не печатать номер телефона.

Вариант 3. Напишите следующую программу:

· Создайте определенный пользователем класс Point, который содержит закрытые данные-элементы xCoordinate и yCoordinate и объявляет перегруженные функции-операции взять из потока и поместить в поток как дружественные функции класса.

· Опишите функции-операции взять из потока и поместить в поток. Функция-операция взять из потока должна определять, являются ли вводимые данные правильными, и если нет, то она должна устанавливать индикатор неправильного ввода ios::failbit. Операция поместить в поток не должна выводить точку, если произошла ошибка ввода.

· Напишите функцию main, которая проверяет ввод и вывод определенного пользователем класса Point с помощью перегруженных операций взять из потока и поместить в поток.

Вариант 4. Напишите программу для проверки результатов вывода на печать целого значения 12345 и значения с плавающей запятой 1.2345 в поля разной ширины. Что происходит, когда значения печатаются в полях, ширина которых меньше указанных значений?

Вариант 5. Напишите следующую программу:

· Создайте определенный пользователем класс Complex, который содержит закрытые данные-элементы real и imaginary и объявляет перегруженные функции-операции взять из потока и поместить в поток как дружественные функции класса.

· Опишите функции-операции взять из потока и поместить в поток. Функция-операция взять из потока должна определять, являются ли вводимые данные правильными, и если нет, то она должна устанавливать индикатор неправильного ввода ios::failbit. Входные данные должны иметь форму: 3 + 8i

Значения могут быть как положительными, так и отрицательными, и одна из двух составляющих (действительная или мнимая часть) может отсутствовать. Если часть отсутствует, то соответствующий элемент данных должен быть задан равным 0. Операция поместить в поток не должна выводить, если произошла ошибка ввода. Формат вывода должен быть идентичен показанному выше формату ввода. Для отрицательных мнимых частей должен быть напечатан знак минус вместо знака плюс.

· Напишите функцию main, которая проверяет ввод и вывод определенного пользователем класса Complex с помощью перегруженных операций взять из потока и поместить в поток

Вариант 6. Напишите программу, которая печатает значение 100.453627, округленное до ближайшего целого, до одной десятой, сотой, тысячной и десятитысячной.

Вариант 7. Напишите программу, которая использует структуру for для печати таблицы значений ASCII для набора символов ASCII с 33 по 126. Программа должна печатать десятичное, восьмеричное, шестнадцатеричное и символьное значения каждого символа. Используйте манипуляторы потока dec, oct и hex для печати целых значений.

Вариант 8. Напишите программу, которая вводит строку с клавиатуры и определяет длину строки. Напечатайте строку, используя ее удвоенную длину в качестве ширины поля.

Вариант 9. Напишите программу, которая показывает, что каждая из функций-элементов getline и get с тремя аргументами заканчивает ввод строки конечным нулевым символом. Покажите также, что get оставляет символ ограничитель во входном потоке, a getline извлекает его из потока и отбрасывает. Что происходит с непрочитанными символами в потоке?

Вариант 10. Напишите программу, которая преобразует температуру в целых числах по Фаренгейту от 0 до 212 градусов к значениям с плавающей запятой температуры по Цельсию с точностью до 3 знаков. Используйте для вычислений формулу: Celsius = 5.0/9.0 * (fahrenheit - 32);

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

Вариант 11. Напишите программу, которая создает определенный пользователем манипулятор skipwhite для пропуска лидирующих (начальных) символов разделителей во входном потоке. Манипулятор должен использовать функцию isspace из библиотеки ctype.h для проверки, не является ли символ символом разделителем. Каждый символ должен вводиться функцией-элементом get класса istream. Когда очередной символ оказывается не разделителем, манипулятор skipwhite должен заканчивать свою работу возвратом этого символа назад во входной поток и возвращением ссылки на istream. Проверьте этот манипулятор, написав функцию main, в которой флаг ios::skipws не установлен, так что операция взять из потока автоматически не пропускает символы разделители. Затем проверьте манипулятор на входном потоке, вводя сначала символы разделители, а затем значащие символы. Печатайте вводимый символ, чтобы подтвердить, что символы разделители не вводятся.

Вариант 12. Напишите программу:

ü Напечатайте целое число 40000 с выравниванием по левой границе поля шириной 15 разрядов.

ü Прочитайте строку в переменную символьного массива state.

ü Напечатайте число 200 со знаком и без него.

ü Напечатайте десятичное значение 100 в шестнадцатеричном формате с предшествующими символами 0х.

ü Считайте символы в массив s пока не встретится символ 'р', но не более 10 символов (включая завершающий нулевой символ). Извлеките указанный ограничитель из входного потока и отбросьте его.

ü Напечатайте число 1.234 в виде значения с плавающей точкой с точностью 9 разрядов.

ü Прочитайте строку "символы" из стандартного входного потока. Сохраните строку в символьном массиве s. Удалите кавычки из входного потока. Считайте максимум 50 символов (включая заключительный нулевой символ).

 

Контрольные вопросы.

 

1. Укажите, что из нижеследующего верно, а что неверно. Если неверно, то объясните, почему.

ü Функция-элемент потока flags() с аргументом типа long присваивает переменной состояния flags значение своего аргумента и возвращает ее прежнее значение.

ü Операция поместить в поток << и операция взять из потока >> перегружены для обработки всех стандартных типов данных, включая строки, адреса памяти (только для операции поместить в поток) и все данные, тип которых определен пользователем.

ü Функция-элемент потока flags() без аргументов производит сброс всех битов флагов в переменной состояния flags.

ü Операция взять из потока >> может быть перегружена с помощью функции-операции, которая принимает в качестве параметров ссылку на istream, ссылку на определенный пользователем тип и возвращает ссылку на istream.

ü Манипулятор потока ws обеспечивает пропуск ведущих (начальных) символов разделителей во входном потоке.

ü Операция поместить в поток << может быть перегружена с помощью функции-операции, которая принимает в качестве параметров ссылку на istream, ссылку на определенный пользователем тип и возвращает ссылку на istream.

ü При вводе с помощью операции взять из потока >> всегда происходит пропуск ведущих (начальных) символов разделителей во входном потоке.

ü Средства ввода-вывода – это составная часть C++.

ü Функция-элемент потока rdstate() возвращает состояние текущего потока.

ü Поток класса cout обычно связан с дисплеем.

ü Функция-элемент потока good() возвращает true, если все функции-элементы bad(), fail() и eof() возвращают false.

ü Поток класса cin обычно связан с экраном дисплея.

ü Если при операциях с потоком возникают неисправимые ошибки, функция-элемент bad возвращает true.

ü Вывод в сеrr является небуферизованным, а вывод в clog является буферизованным.

ü Когда установлен флаг ios::showpoint, числа с плавающей запятой печатаются по умолчанию с точностью в шесть разрядов или печатаются с заданной точностью.

ü Функция-элемент put класса ostream выводит заданное число символов.

ü Манипуляторы потока dec, oct и hex оказывают воздействие только на следующую операцию вывода целого числа.

ü Адреса памяти при выводе отображаются по умолчанию как целые типа long.

2. Напишите по одному оператору, решающему следующие задачи:

ü Выведите строку "Введите ваше имя: ".

ü Установите флаг для вывода в верхнем регистре чисел в экспоненциальном формате и букв в шестнадцатеричном формате.

ü Выведите адрес переменной string типа char *.

ü Установите флаг печати чисел с плавающей запятой в экспоненциальном формате.

ü Выведите адрес переменной integerPrt типа int *.

ü Установите такой флаг, чтобы при выводе целых чисел на дисплее отображалось их основание при представлении в восьмеричном и шестнадцатеричном форматах.

ü Выведите значение типа float, на которое указывает floatPtr.

ü Используйте функцию-элемент потока, чтобы установить символ '*' в качестве заполняющего символа для печати с шириной поля, превышающей требуемую для печатаемого значения. Напишите отдельный оператор чтобы сделать то же самое с помощью манипулятора потока.

ü Выведите символы 'О' и 'К' одним оператором с помощью функции put класса ostream.

 

Лабораторная работа 4-5 (4 часа)



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 188; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.66.206 (0.014 с.)