Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

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.

* ГЛАВА 5. КЛАССЫ

"Эти типы не абстрактные, они столь же реальны,

как int и float"

- Даг Макилрой

В этой главе описываются возможности определения новых типов,

для которых доступ к данным ограничен заданным множеством

функций, осуществляющих его. Объясняется, как можно использовать

члены структуры данных, как ее защищать, инициализировать и,

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

управления таблицей имен, работы со стеком, множеством и

реализации дискриминирующего (т.е. надежного) объединения.

Следующие три главы завершают описание возможностей С++ для

построения новых типов, и в них содержится больше интересных

примеров.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]