Бьерн Страуструп - Язык программирования С++. Главы 2-4 - Упражнения

ОГЛАВЛЕНИЕ

 

4.8 Упражнения

1. (*1) Составьте следующие описания: функция с параметрами типа
   указатель на символ и ссылка на целое, невозвращающая значения;
   указатель на такую функцию; функция с параметром, имеющим тип
   такого указателя; функция, возвращающая такой указатель. Напишите
   определение функции, у которой параметр и возвращаемое значение
   имеют тип такого указателя. Подсказка: используйте typedef.
2. (*1) Как понимать следующее описание? Где оно может пригодиться?
         typedef int (rifii&) (int, int);
3. (*1.5) Напишите программу, подобную той, что выдает "Hello, world".
   Она получает имя (name) как параметр командной строки и выдает
   "Hello, name". Измените программу так, чтобы она получала
   произвольное число имен и всем им выдавала свое приветствие:
   "Hello, ...".
4. (1.5) Напишите программу, которая, беря из командной строки
   произвольное число имен файлов, все эти файлы переписывает
   один за другим в cout. Поскольку в программе происходит
   конкатенация файлов, вы можете назвать ее cat  от слова
   concatenation - конкатенация).
5. (*2) Переведите небольшую программу с языка С на С++. Измените
   заголовочные файлы так, чтобы они содержали описание всех
   вызываемых функций и описание типов всех параметров. По возможности
   все команды #define замените конструкциями enum, const или
   inline. Удалите из файлов .c все описания внешних, а определения
   функций приведите к виду, соответствующему С++. Вызовы malloc() и
   free() замените операциями new и delete. Удалите ненужные операции
   приведения.
6. (*2) Напишите функцию sort() ($$4.6.9), использующую более
   эффективный алгоритм сортировки.
7. (*2) Посмотрите на определение структуры tnode в $$R.9.3. Напишите
   функцию, заносящую новые слова в дерево узлов tnode. Напишите
   функцию для вывода узлов дерева tnode. Напишите функцию,
   которая производит такой вывод в алфавитном порядке.

Измените структуру tnode так, чтобы в ней содержался
   только указатель на слово произвольной длины, которое размещается
   с помощью new в свободной памяти. Измените функцию так, чтобы
   она работала с новой структурой tnode.
8. (*1) Напишите функцию itoa(), которая использовалась в примере
   из $$4.6.8.
9. (*2) Узнайте, какие стандартные заголовочные файлы есть в вашей
   системе. Поройтесь в каталогах /usr/include или /usr/include/CC
   (или в тех каталогах, где хранятся стандартные заголовочные
   файлы вашей системы). Прочитайте любой показавшийся интересным
   файл.
10. (*2) Напишите функцию, которая будет переворачивать двумерный
   массив. (Первый элемент массива станет последним).
11. (*2) Напишите шифрующую программу, которая читает символы из
   cin и пишет их в cout в зашифрованном виде. Можно использовать
   следующий простой метод шифрации: для символа s зашифрованное
   представление получается в результате операции s^key[i], где
   key - массив символов, передаваемый в командной строке. Символы
   из массива key используются в циклическом порядке, пока не будет
   прочитан весь входной поток. Первоначальный текст получается
   повторным применением той же операции с теми же элементами key.
   Если массив key не задан (или задана пустая строка), шифрация не
   происходит.
12. (*3) Напишите программу, которая помогает дешифрировать текст,
   зашифрованный описанным выше способом, когда ключ (т.е. массив
   key) неизвестен. Подсказка: см. D Kahn "The Codebreakers",
   Macmillan, 1967, New York, стр. 207-213.
13. (*3) Напишите функцию обработки ошибок, первый параметр который
   подобен форматирующей строке-параметру printf() и содержит форматы
   %s, %c и %d. За ним может следовать произвольное количество
   числовых параметров. Функцию printf() не используйте. Если смысл
   формата %s и других форматов вам неизвестен, обратитесь к $$10.6.
   Используйте <stdarg.h>.
14. (*1) Какое имя вы выбрали бы для типов указателей на функции,
   которые определяются с помощью typedef?
15. (*2) Исследуйте разные программы, чтобы получить представление
   о разных используемых на практике стилях именования. Как
   используются заглавные буквы? Как используется подчерк? В каких
   случаях используются такие имена, как i или x?
16. (*1) Какие ошибки содержатся в следующих макроопределениях?

         #define PI = 3.141593;
         #define MAX(a,b) a>b?a:b
         #define fac(a) (a)*fac((a)-1)

17. (*3) Напишите макропроцессор с простыми возможностями, как у
   препроцессора С. Текст читайте из cin, а результат записывайте
   в cout. Вначале реализуйте макроопределения без параметров.

Подсказка: в программе калькулятора есть таблица имен и
   синтаксический анализатор, которыми можно воспользоваться.
18. (*2) Напишите программу, извлекающую квадратный корень из двух (2)
   с помощью стандартной функции sqrt(), но не включайте в программу
   <math.h>. Сделайте это упражнение с помощью функции sqrt()
   на Фортране.
19. (*2) Реализуйте функцию print() из $$4.6.7.