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

5.6 Упражнения

1. (*1) Измените программу калькулятора из главы 3 так, чтобы

можно было воспользоваться классом table.

2. (*1) Определите tnode ($$R.9) как класс с конструкторами и

деструкторами и т.п., определите дерево из объектов типа

tnode как класс с конструкторами и деструкторами и т.п.

3. (*1) Определите класс intset ($$5.3.2) как множество строк.

4. (*1) Определите класс intset как множество узлов типа tnode.

Структуру tnode придумайте сами.

5. (*3) Определите класс для разбора, хранения, вычисления и печати

простых арифметических выражений, состоящих из целых констант и

операций +, -, * и /. Общий интерфейс класса должен выглядеть

примерно так:

class expr {

// ...

public:

expr(char*);

int eval();

void print();

};

Конструктор expr::expr() имеет параметр-строку, задающую выражение.

Функция expr::eval() возвращает значение выражения, а expr::print()

выдает представление выражения в cout. Использовать эти функции

можно так:

expr("123/4+123*4-3");

cout << "x = " << x.eval() << "\n";

x.print();

Дайте два определения класса expr: пусть в первом для представления

используется связанный список узлов, а во втором - строка

символов. Поэкспериментируйте с разными форматами печати

выражения, а именно: с полностью расставленными скобками,

в постфиксной записи, в ассемблерном коде и т.д.

6. (*1) Определите класс char_queue (очередь символов) так, чтобы

его общий интерфейс не зависел от представления. Реализуйте

класс как: (1) связанный список и (2) вектор. О параллельности

не думайте.

7. (*2) Определите класс histogram (гистограмма), в котором ведется

подсчет чисел в определенных интервалах, задаваемых в виде

параметров конструктору этого класса. Определите функцию

выдачи гистограммы. Сделайте обработку значений, выходящих за

интервал. Подсказка: обратитесь к <task.h>.

8. (*2) Определите несколько классов, порождающих случайные числа

с определенными распределениями. Каждый класс должен иметь

конструктор, задающий параметры распределения и функцию draw,

возвращающую "следующее" значение. Подсказка: обратитесь к

<task.h> и классу intset.

9. (*2) Перепишите примеры date ($$5.2.2 и $$5.2.4), char_stack

($$5.2.5) и intset ($$5.3.2), не используя никаких функций-членов

(даже конструкторов и деструкторов). Используйте только class

и friend. Проверьте каждую из новых версий и сравните их

с версиями, в которых используются функции-члены.

10.(*3) Для некоторого языка составьте определения класса для таблицы

имен и класса, представляющего запись в этой таблице. Исследуйте

транслятор для этого языка, чтобы узнать, какой должна быть настоящая

таблица имен.

11.(*2) Измените класс expr из упражнения 5 так, чтобы в выражении

можно было использовать переменные и операцию присваивания =.

Используйте класс для таблицы имен из упражнения 10.

12.(*1) Пусть есть программа:

#include <iostream.h>

main()

{

cout << "Всем привет\n";

}

Измените ее так, чтобы она выдавала:

Инициализация

Всем привет

Удаление

Саму функцию main() менять нельзя.

* ГЛАВА 6

Не плоди объекты без нужды.

- В. Оккам

Эта глава посвящена понятию производного класса. Производные

классы - это простое, гибкое и эффективное средство определения

класса. Новые возможности добавляются к уже существующему

классу, не требуя его перепрограммирования или перетрансляции.

С помощью производных классов можно организовать общий

интерфейс с несколькими различными классами так, что в других

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

этих классов. Вводится понятие виртуальной функции, которое

позволяет использовать объекты надлежащим образом даже

в тех случаях, когда их тип на стадии трансляции неизвестен.

Основное назначение производных классов - упростить

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

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