Упражнения

  1. (*1) Модифицируйте настольный калькулятор из Главы 3, чтобы использовать класс table.
  2. (*1) Разработайте tnode (#с.8.5) как класс с конструкторами, деструкторами и т.п. Определите дерево из tnode'ов как класс с конструкторами, деструкторами и т.п.
  3. (*1) Преобразуйте класс intset (#5.3.2) в множество строк.
  4. (*1) Преобразуйте класс intset в множество узлов node, где node - определяемая вами структура.
  5. (*3) Определите класс для анализа. хранения, вычисления и печати простых арифметических выражений, состоящих из целых констант и операций +, -, * и /. Открытый интерфейс должен выгляедть примерно так:
6. class expr {7. //...8. public:9. expr(char*);10. int eval();11. void print();12. }

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

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

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

  1. (*1) Определите класс char_queue (символьная очередь) таким образом, чтобы открытый интерфейс не зависел от представления. Реализуйте char_queue как (1) связанный список и как (2) вектор. О согласованности не заботьтесь.
  2. (*2) Определите класс histogram (гистограмма), в котором ведется подсчет чисел в определенных интервалах, которые задаются как параметры конструктора histogram. Обеспечьте функцию вывода гистограммы на печать. Сделайте обработку значений, выходящих за границы. Подсказка:.
  3. (*2) Определите несколько классов, предоставляющих случайные числа с определенными распределениями. Каждый класс имеет конструктор, задающий параметры распределения, и функцию draw, которая возвращает "следующее" значение. Подсказка:. Посмотрите также класс intset.
  4. (*2) Перепишите пример date (#5.8.2), пример char_stack (#5.2.5) и пример intset (#5.3.2) не используя функций членов (даже конструкторов и деструкторов). Используйте только class и friend. Сравните с версиями, в которых использовались функции члены.
  5. (*3) Для какого-нибудь языка спроектируйте класс таблица имен и класс вхождение в таблицу имен. Чтобы посмотреть, как на самом деле выглядит таблица имен, посмотрите на компилятор этого языка.
  6. (*2) Модифицируйте класс выражение из Упражнения 5 так, чтобы обрабатывать переменные и операцию присваивания =. Используйте класс таблица имен из Упражнения 10.
  7. (*1) Дана программа:
20. #include21. main()22. {23. cout << "Hello, world\n";24. }

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

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);

(прим. автора)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: