Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 26. Упражнения



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() менять нельзя.


 
« Предыдущая статья   Следующая статья »