Бьерн Страуструп - Язык программирования С++. Главы 5-7 - Упражнения
ОГЛАВЛЕНИЕ
Страница 27 из 70
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 {Конструктор expr::expr() имеет параметр-строку, задающую выражение.
// ...
public:
expr(char*);
int eval();
void print();
};
Функция expr::eval() возвращает значение выражения, а expr::print() выдает представление выражения в cout. Использовать эти функции можно так:
expr("123/4+123*4-3");Дайте два определения класса expr: пусть в первом для представления
cout << "x = " << x.eval() << "\n";
x.print();
используется связанный список узлов, а во втором - строка
символов. Поэкспериментируйте с разными форматами печати
выражения, а именно: с полностью расставленными скобками,
в постфиксной записи, в ассемблерном коде и т.д.
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() менять нельзя.