1. (*1) Модифицируйте настольный калькулятор из Главы 3, чтобы использовать класс table.

2. (*1) Разработайте tnode (#с.8.5) как класс с контрукторами, деструкторами и т.п. Определите дерево из tnode'ов как класс с конструкторами, деструкторами и т.п.

3. (*1) Преобразуйте класс intset (#5.3.2) в множество строк.

4. (*1) Преобразуйте класс intset в множество узлов node, где node – определяемая вами структура.

5. (*3) Определите класс для анализа, хранения, вычислния и печати простых арифметических выражений, состоящих из целых констант и операций +, -, * и /. Открытый итерфейс должен выглядеть примерно так:

class expr (* // ... public: expr(char*); int eval(); void print(); *) Параметр строка конструктора expr::expr() является выржением. Функция expr::eval() возвращает значение выражния, а expr::print() печатает представление выражения в cout. Программа может выглядеть, например, так:

expr x(«123/4+123*4-3»); cout «„ "x = " «« x.eval() «« «\n“; x.print();

Определите класс expr два раза: один раз используя в кчестве представления связанный список узлов, а другой раз – символьную строку. Поэкспериментируйте с разными способами печати выражения: с полностью расставленными скобками,в постфиксной записи,в ассемблерном коде и т.д.

6. (*1) Определите класс char_queue (символьная очередь) таким образом, чтобы открытый интерфейс не зависел от представления. Реализуйте char_queue как (1) связанный список и как (2) вектор. О согласованности не заботтесь.

7. (*2) Определите класс histogram (гистограмма), в ктором ведется подсчет чисел в определенных интервалах, которые задаются как параметры конструктора histogram. Обеспечьте функцию вывода гистограммы на печать. Сделате обработку значений, выходящих за границы. Подсказка: «task.h».

8. (*2) Определите несколько классов, предоставляющих случайные числа с определенными распределениями. Каждый класс имеет конструктор, задающий параметры распределния, и функцию draw, которая возвращает «следующее» знчение. Подсказка: «task.h». Посмотрите также класс intset.

9. (*2) Перепишите пример date (#5.8.2), пример char_stack (#5.2.5) и пример intset (#5.3.2) не исползуя функций членов (даже конструкторов и деструкторов). Используйте только class и friend. Сравните с версиями, в которых использовались функции члены.

10. (*3) Для какого-нибудь языка спроектируйте класс таблица имен и класс вхождение в таблицу имен. Чтобы посмотреть, как на самом деле выглядит таблица имен, посмотрите на компилятор этого языка.

11. (*2) Модифицируйте класс выражение из Упражнения 5 так, чтобы обрабатывать переменные и операцию присваивния =. Используйте класс таблица имен из Упражнения 10.

12. (*1) Дана программа:

#include «stream.h»

main() (* cout «„ «Hello, world\n“; *)

модифицируйте ее, чтобы получить выдачу

Initialize Hello, world Clean up

Не делайте никаких изменений в main().