Задачи 97-121. символы и строки
В задачах, требующих посимвольного ввода, используйте функцию cin.get().
97. Напишите программу, которая относит вводимый символ к одному из четырех типов: цифры, большие латинские буквы, малые латинские буквы, все остальные символы.
98. Напишите программу, ожидающую нажатия любой клавиши. Если при нажатии клавиши вводится символ, имеющий специальное представление, указанное в табл.13, напечатайте его название, иначе выводите сам символ.
99. Напишите программу подсчета числа вводимых символов, используя цикл while.
100. Напишите программу подсчета пробелов, табуляций, символов новая строка.
101. Напишите программу, копирующую символы ввода в выходной поток и заменяющую стоящие подряд пробелы, на один пробел.
102. Напишите программу, копирующую символы ввода в выходной поток с заменой символа табуляции на \t и каждой обратной наклонной черты на \\. Это сделает видимыми все символы табуляции и обратной наклонной черты.
103. Напишите программу, печатающую кодовую таблицу в виде:
СИМВОЛ КОД СИМВОЛ КОД …
Добейтесь, чтобы символы и их коды образовывали на экране ровные столбцы.
104. Напишите программу, печатающую коды, генерируемые при нажатии любой клавиши или комбинации клавиш. Используйте функцию getch() (заголовочный файл conio.h). Данная функция трактует нажатие отдельной клавиши или комбинации клавиш как генерацию одно- или двухбайтового кода. Если генерируется двухбайтовый код, то первый его байт нулевой.
Строка символов – это массив, элементами которого являются символы. Важно помнить, что для работы со строками под них нужно выделять память. Необходимую память следует выделять с некоторым запасом. Конец строки фиксируется символом с кодом нуль ’\0’. Все функции, работающие со строками, должны обрабатывать символы в массиве, пока не обнаружат символ конца строки.
105. Напишите программу, которая будет в каждой вводимой строке заменять стоящие подряд пробелы на один пробел.
106. Напишите программу, удаляющую из строки s1 все символы, входящие в строку s2.
107. Напишите программу, осуществляющую циклическую перестановку символов в строке: второй символ ставится на место первого, третий - на место второго и т.д., первый символ ставится на место последнего. Выводите строку после каждого преобразования в одно и то же место экрана, чтобы создать эффект "бегущей строки".
108. Напишите функцию atoi, для преобразования строки десятичных цифр, в начале которой может стоять знак + или –, в целое значение.
109. Напишите функцию, формирующую целое значение по строке из нулей и единиц, кодирующей это целое значение в двоичной форме, и вызывающую ее главную функцию.
110. Напишите функцию, формирующую целое число по строке шестнадцатеричных цифр. Кроме обычных десяти цифр 0, ... , 9, в шестнадцатеричной системе используются цифры A, B, C, D, E, F (или a, b, c, d, e, f) для кодирования значений 10, 11, 12, 13, 14, 15 соответственно. В C++ принято начинать запись шестнадцатеричного представления целого числа с 0x или 0X, поэтому функция должна проверять первые два символа строки.
111. Напишите функцию strcat, помещающую строку t в конец строки s.
112. Напишите программу, переставляющую k последних символов строки s в начало строки без изменения порядка их расположения. Первые символы строки s должны быть сдвинуты вправо на k позиций.
113. Напишите функцию int any(char s[], char t[]), которая возвращает либо позицию первого символа строки s, совпадающего с любым из символов строки t, либо –1, если ни один символ s не совпал с символами из t.
114. Напишите функцию int strindex(char s[], char t[]), которая выдает позицию самого правого вхождения строки t в строку s или -1, если вхождения не обнаружено.
115. Напишите программу, выводящую в алфавитном порядке заглавные латинские буквы 'A', ... , 'Z', входящие в строку s. Буква выводится один раз, если входит в строку, и не выводится, если в строку не входит.
116. Напишите программу, печатающую заглавные буквы 'A',..., 'Z', входящие в строку s, и числа вхождений этих букв.
117. Напишите программу, печатающую Вам приветствие с указанием фамилии, имени, отчества, которые выводите в отдельные строки.
118. Напишите функцию itoa(int n, char s[]), формирующую строку цифр s, дающую представление целого n в десятичной системе счисления.
119. Напишите функцию itox(int n, char s[]), которая переводит целое n в строку s, представляющую число n в шестнадцатеричном виде.
120. Напишите программу, формирующую строку, состоящую из символов '0' и '1', дающую двоичное представление величины x целого типа. Указание. Двоичные разряды, кодирующие x, можно получать, осуществляя последовательное деление x на 2 и находя остаток. Удобно использовать условное выражение
s[i] = (x%2==1)?'1':'0'; //s[i] - очередной символ
121. Напишите функцию escape(char s[], char t[]), копирующую строку t в s и преобразующую символы типа новая строка и табуляция в "видимые последовательности символов" типа \n и\t. Используйте оператор switch. Указание. Символы типа '\n', '\t' следует заменять строками символов "\\n", "\\t".
Глава 9. Препроцессор
Препроцессорготовит текст программы к его последующей обработке компилятором: удаляет комментарии и выполняет директивы препроцессора, которыми являются строки, начинающиеся со знака #.
Как правило, препроцессор встроен в компилятор, но существуют и автономные препроцессоры, с помощью которых можно получить файл, обработанный препроцессором.
Директивы препроцессора
Директивы препроцессора имеют следующий формат
# [имя_директивы] [лексемы_препроцессора]
Препроцессор не относится к языку программирования, его назначение состоит в обработке исходного текста программы, поэтому препроцессорные лексемы не совпадают с рассмотренными ранее лексемами языка C++. Набор препроцессорных лексем включает: символьную константу, имя объекта-заголовка, идентификатор, знак операции, препроцессорное число, строку символов и каждый символ, не являющийся пробелом, который нельзя отнести к перечисленным выше.
При записи директив допускаются пробелы перед знаком #, между этим знаком и именем директивы, а также перед лексемами препроцессора, между ними и после них.
Директивы могут стоять в любом месте программы, они оказывают влияние от точки их появления до конца транслируемой компоненты.
Директивы препроцессора перечислены в табл.14.
Таблица 14. Директивы препроцессора
Имя | Назначение |
#define #undef #include #if #ifdef #ifndef #else #elif #endif #line #error #pragma # | Определение макроса Отмена определения макроса Подстановка текста из внешнего файла Компиляция, если выражение истинно Компиляция, если макрос определен Компиляция, если макрос не определен Альтернатива для #if, #ifdef, #ifndef Составная директива else/if Окончание группы компиляции по условию Замена новым значением номера строки или имени текущего файла Прерывает компиляцию с выдачей сообщения об ошибке Действие определяется реализацией системы программирования Пустая директива |
Директивы препроцессора можно располагать в нескольких строках, используя в качестве знака переноса символ обратной наклонной черты (\), то есть можно, например, писать:
#include \
<iostream.h>
Директива #pragma имеет следующий синтаксис:
#pragmaДИРЕКТИВА_pragma
Различные реализации языка C++ имеют различные наборы команд ДИРЕКТИВА_pragma, учитывающие конкретные особенности компилятора и операционной системы.
Макросы
Макросом или макроопределением называется идентификатор, связанный директивой #define с лексемой или последовательностью лексем. Определение макроса имеет вид:
#define МАКРОС ЗНАЧЕНИЕ
Здесь МАКРОС – это имя макроса. В имени макроса пробелы не допускаются. Препроцессор заменяет всякое вхождение макроса в текст программы значением, связанным с ним директивой #define, всюду от точки его определения в программе до конца файла. Если макрос входит в состав символьной или строковой константы, то замена не производится. Например, в стандартном заголовочном файле math.h определены макросы M_E и M_PI для чисел e и π, округленные до 21 значащей цифры:
#define M_E 2.71828182845904523536
#define M_PI 3.14159265358979323846
Строку программы:
y = sin(M_PI / 3) / M_E;
препроцессор преобразует в строку:
y = sin(3.14159265358979323846 / 3) / 2.71828182845904523536;
которую затем будет обрабатывать компилятор.
Имеется возможность определять макросы с параметрами. Пример такого макроса приведен в программе 23.
Стандартом языка C++ предусмотрено несколько встроенных макросов, часть из них перечислена в табл.15.
Таблица 15. Встроенные макросы языка C++
Макрос | Описание |
__DATE__ __FILE__ __LINE__ __TIME__ | Строка, представляющая в форме mmm dd yyyy дату, когда данный файл обрабатывался препроцессором Строка, представляющая имя текущего файла Целое, равное номеру текущей строки исходного файла Строка, представляющая в форме hh:mm:ss время, когда данный файл обрабатывался препроцессором |
Кроме стандартных макросов, системы программирования могут включать специфичные для них макроопределения, которые можно изучить по документации.