Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Упражнения. Упражнения

Читайте также:
  1. Базовые упражнения на меткость
  2. В каких занятиях постепенно должны упражняться дети с самого рождения, чтобы на шестом году своей жизни они оказались усвоившими эти упражнения.
  3. Воздушные и водные короткие, простые и полезные упражнения для укрепления здоровья
  4. Вокальные упражнения по развитию вокально-хоровых навыков
  5. Все упражнения считаются усвоенными, когда вы автоматически применяете их в социальных условиях.
  6. Выполните упражнения.
  7. Выполните упражнения.

Упражнения

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';

ВВОД

Ввод во многом сходен с выводом. Есть класс istream, который реализует операцию ввода >> ("ввести из" - "input from") для небольшого набора стандартных типов. Ввод осуществляется до ошибки или до пробельного символа. Под пробелом, как определено в стандарте Си, понимается обобщенный пробел, т.е. пробел, табуляция, конец строки, перевод строки или возврат каретки. Проверка на обобщенный пробел возможна с помощью функции isspace() из файла <ctype.h>. Задача. Реализовать преобразование введенного числа в сантиметры, если ввод заканчивался символом ‘i’, или в дюймы, если ввод заканчивался символом ‘c’. Указание. 1 дюйм = 2.54 сантиметра.Вот хороший пример ввода: cout << "enter length: "; cin >> x; // ввод числа с плавающей точкой cin >> ch; // ввод завершающего символаПри этом входной поток может содержать как последовательность 22.5i, так и 22.5 i (22.5 дюйма). Пробел во втором случае игнорируется.В качестве альтернативы для операции ввода >> можно использовать функции get(). В них обобщенный пробел не отличается от любого другого символа и они предназначены для таких операций ввода, когда не делается никаких предположений о вводимых символах. Поэтому программу посимвольного копирования можно написать так: main() { char c; while (cin.get(c)) cout << c; } Такая запись выглядит несимметрично, и у операции >> для вывода символов есть двойник под именем put(), так что можно писать и так: main() { char c; while (cin.get(c)) cout.put(c); }

Полезные функции из <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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
ТЕСТЫ ДЛЯ САМОКОНТРОЛЯ| Задача. Удаление пробелов

mybiblioteka.su - 2015-2024 год. (0.007 сек.)