Читайте также:
|
|
Упражнения
1. Выполните программу. Решите проблему с просмотром окна вывода результата, если она возникнет.
2. Используйте \n для вывода приветствия в двух строках.
Потоки ввода-вывода
Из предисловия к главе 10 Потоки книги Язык программирования С++ Бьерна Страуструпа. В языке С++ нет средств для ввода-вывода. Их и не нужно, поскольку такие средства можно просто и элегантно создать на самом языке. Описанная здесь библиотека потокового ввода-вывода реализует строгий типовой и вместе с тем гибкий и эффективный способ символьного ввода и вывода целых, вещественных чисел и символьных строк, а также является базой для расширения, рассчитанного на работу с пользовательскими типами данных. Пользовательский интерфейс библиотеки находится в файле <iostream.h>. То, что для прикладной программы представляется выводом, на самом деле является преобразованием таких объектов как int, char *, complex или Employee_record в последовательность символов.ВЫВОД
Строгий и единообразный вывод значений как встроенных, так и пользовательских типов, можно обеспечить, если использовать единственное имя функции для различных операций вывода. Например: put(cerr,"x = "); // cerr - выходной поток ошибок put(cerr,x); put(cerr,'\n');Тип аргумента определяет, какую функцию надо вызывать в каждом случае. Такой подход применяется в нескольких языках, например, в Паскале и Си, однако, это слишком длинная запись. За счет перегрузки операции <<, чтобы она означала "вывести" ("put to"), можно получить более простую запись и разрешить программисту выводить в одном операторе последовательность объектов, например, так: cerr << "x = " << x << '\n';Здесь cerr обозначает стандартный поток ошибок. Так, если х типа int со значением 123, то приведенный оператор выдаст x = 123и еще символ конца строки в стандартный поток ошибок. Аналогично, если х имеет пользовательский тип complex со значением (1,2.4), то указанный оператор выдаст x = (1,2.4)в поток cerr. Такой подход легко использовать пока x такого типа, для которого определена операция <<, а пользователь может просто доопределить << для новых типов.Операции << (поместить в поток) и >> (прочитать из потока) асимметричны. Это позволяет приписывать им смысл "в" и "из". Они не относятся к числу наиболее часто используемых операций над встроенными типами, а приоритет << достаточно низкий, чтобы писать арифметические выражения в качестве операнда без скобок: cout << "a*b+c=" << a*b+c << '\n'; Вывод осуществляется в поток cout (на консоль). Скобки нужны, если выражение содержит операции с более низким приоритетом: cout << "a^b|c=" << (a^b|c) << '\n'; Операцию сдвига влево можно использовать в операции вывода, но, конечно, она должна быть в скобках: cout << "a<<b=" << (a<<b) << '\n';ВВОД
Полезные функции из <ctype.h>
В стандартном заголовочном файле <ctype.h> определены несколько функций, полезных для обработки при вводе: int isalpha(char) // 'a'..'z' 'A'..'Z' int isupper(char) // 'A'..'Z' int islower(char) // 'a'..'z' int isdigit(char) // '0'..'9' int isxdigit(char) // '0'..'9' 'a'..'f' 'A'..'F' int isspace(char) // ' ' '\t' возвращает конец строки // и перевод формата int iscntrl(char) // управляющий символ в диапазоне // (ASCII 0..31 и 127) int ispunct(char) // знак пунктуации, отличен от приведенных выше int isalnum(char) // isalpha() | isdigit() int isprint(char) // видимый: ascii ' '..'~' int isgraph(char) // isalpha() | isdigit() | ispunct() int isascii(char c) { return 0<=c && c<=127; } Все они, кроме isascii(), работают с помощью простого просмотра, используя символ как индекс в таблице атрибутов символов. Поэтому вместо выражения типа (('a'<=c && c<='z') || ('A'<=c && c<='Z')) // буква которое не только утомительно писать, но оно может быть и ошибочным (на машине с кодировкой EBCDIC оно задает не только буквы), лучше использовать вызов стандартной функции isalpha(), который, к тому же, более эффективен.Приведем пример использования функция putback(), которая возвращает символ в поток, и он становится первым подлежащим чтению чтения из потока обобщенных пробелов: char c; while (cin.get(c)) { if (isspace(c)==0) { cin.putback(c); break; } } Есть много задач, в которых надо обрабатывать сколь угодно длинные последовательности значений, используя фиксированное количество отдельных переменных, не зависящее от длины последовательности. Рассмотрим несколько таких задач.Упражнения
Есть класс программ, которые можно определить как фильтры – они из потока символов пропускают только определенные символы. Для их реализации будут полезны функции из заголовочного файла <ctype.h>.
3. Напишите программу для подсчета количества введенных символов, в том числе – пробельных. Протестируйте получившуюся программу для случая пустого файла ввода.
4. Скопируйте только цифры.
5. Сделайте фильтр: из всех входных данных на вывод отправляйте только латинские буквы. При этом преобразуйте заглавные буквы в маленькие.
6. Скопируйте только символы алфавита шестнадцатеричной системы счисления (цифры от 0 до 9 и латинские буквы от a до f независимо от регистра).
7. Скопируйте ввод, игнорируя пробельные символы. Выполните упражнение с помощью цикла while и с помощью цикла for.
8. Скопируйте ввод, удаляя пустые строки.
9. Напишите программу для подсчета пробелов, табуляций и новых строк.
10. Напишите программу для подсчета количества строк входного файла. Предполагается, что строки ввода заканчиваются символом новой строки \n.
11. Реализуйте программу подсчета слов на языке Си++. Придумайте тестовые примеры. Какие имеются ограничения?
12. Напишите программу, которая будет печатать слова из файла ввода, причем по одному на строку.
13. Переделайте программу подсчета слов, используя лучшее определение "слова". Считайте, например, словом последовательность букв, цифр и апострофов, начинающуюся с буквы.
14. Напишите программу, которая копирует ввод на вывод, заменяя при этом каждую последовательность из одного или более пробелов на один пробел.
Дата добавления: 2015-07-11; просмотров: 59 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ТЕСТЫ ДЛЯ САМОКОНТРОЛЯ | | | Задача. Удаление пробелов |