- (*1) Модифицируйте настольный калькулятор из Главы 3, чтобы использовать класс table.
- (*1) Разработайте tnode (#с.8.5) как класс с конструкторами, деструкторами и т.п. Определите дерево из tnode'ов как класс с конструкторами, деструкторами и т.п.
- (*1) Преобразуйте класс intset (#5.3.2) в множество строк.
- (*1) Преобразуйте класс intset в множество узлов node, где node - определяемая вами структура.
- (*3) Определите класс для анализа. хранения, вычисления и печати простых арифметических выражений, состоящих из целых констант и операций +, -, * и /. Открытый интерфейс должен выгляедть примерно так:
Параметр строка конструктора expr::expr() является выражением. Функция expr::eval() возвращает значение выражение, а expr::print() печатает представление выражения в cout. Программа может выглядеть, например, так:
expr x("123/4+123*4-3"); cout << "x = " << x.eval() << "\n"; x.print();Определите класс expr два раза: один раз используя в качестве представления связанный список узлов, а другой раз - символьную строку. Поэкспериментируйте с разными способами печати выражения: с полностью расставленными скобками, в постфиксной записи, в ассемблерном коде и т.д.
|
|
- (*1) Определите класс char_queue (символьная очередь) таким образом, чтобы открытый интерфейс не зависел от представления. Реализуйте char_queue как (1) связанный список и как (2) вектор. О согласованности не заботьтесь.
- (*2) Определите класс histogram (гистограмма), в котором ведется подсчет чисел в определенных интервалах, которые задаются как параметры конструктора histogram. Обеспечьте функцию вывода гистограммы на печать. Сделайте обработку значений, выходящих за границы. Подсказка:.
- (*2) Определите несколько классов, предоставляющих случайные числа с определенными распределениями. Каждый класс имеет конструктор, задающий параметры распределения, и функцию draw, которая возвращает "следующее" значение. Подсказка:. Посмотрите также класс intset.
- (*2) Перепишите пример date (#5.8.2), пример char_stack (#5.2.5) и пример intset (#5.3.2) не используя функций членов (даже конструкторов и деструкторов). Используйте только class и friend. Сравните с версиями, в которых использовались функции члены.
- (*3) Для какого-нибудь языка спроектируйте класс таблица имен и класс вхождение в таблицу имен. Чтобы посмотреть, как на самом деле выглядит таблица имен, посмотрите на компилятор этого языка.
- (*2) Модифицируйте класс выражение из Упражнения 5 так, чтобы обрабатывать переменные и операцию присваивания =. Используйте класс таблица имен из Упражнения 10.
- (*1) Дана программа:
модифицируйте ее, чтобы получить выдачу
Initialize Hello, world Clean upНе делайте никаких изменений в main().
*1 Иногда называется также квалификацией. (прим. перев.)
*2 Более поздние версии C++ поддерживают понятие указатель на член: cl::* означает "указатель на член класса cl". Например:
typedef void (cl::*PROC)(int); PROC pf1 = &cl::print; // приведение к типу ненужно PROC pf2 = &cl::print;Для вызовов через указатель на функцию член используются операции. и ->. Например:
(z1.*pf1)(2); ((&z2)->*pf2)(4);(прим. автора)