KnigkinDom.org» » »📕 Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 147 148 149 150 151 152 153 154 155 ... 337
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
влево, так и вправо).

15. Большинство иерархий классов не связано с графикой. Определите класс Iterator, содержащий чисто виртуальную функцию next(), возвращающую указатель типа double* (см. главу 17). Теперь выведите из класса Iterator классы Vector_iterator и List_iterator так, чтобы функция next() для класса Vector_iterator возвращала указатель на следующий элемент вектора типа vector<double>, а для класса List_iterator делала то же самое для списка типа list<double>. Инициализируйте объект класса Vector_iterator вектором vector<double> и сначала вызовите функцию next(), возвращающую указатель на первый элемент, если он существует. Если такого элемента нет, верните нуль. Проверьте этот класс с помощью функции void print(Iterator&), выводящей на печать элементы вектора типа vector<double> и списка типа list<double>. 

16. Определите класс Controller, содержащий четыре виртуальные функции: on(), off(), set_level(int) и show(). Выведите из класса Controller как минимум два класса. Один из них должен быть простым тестовым классом, в котором функция show() выводит на печать информацию, включен или выключен контроллер, а также текущий уровень. Второй производный класс должен управлять цветом объекта класса Shape; точный смысл понятия “уровень” определите сами. Попробуйте найти третий объект для управления с помощью класса Controller.

17. Исключения, определенные в стандартной библиотеке языка C++, такие как exception, runtime_error и out_of_range (см. раздел 5.6.3), организованы в виде иерархии классов (с полезной виртуальной функцией what(), возвращающей строку, которая предположительно содержит объяснение ошибки). Найдите источники информации об иерархии стандартных исключений в языке C++ и нарисуйте диаграмму этой иерархии классов.

Послесловие

 

 Идеалом программирования вовсе не является создание одной программы, которая делает все. Цель программирования — создание множества классов, точно отражающих понятия, работающих вместе и позволяющих нам элегантно создавать приложения, затрачивая минимум усилий (по сравнению со сложностью задачи) при адекватной производительности и уверенности в правильности результатов. Такие программы понятны и удобны в сопровождении, т.е. их коды можно просто объединить, чтобы как можно быстрее выполнить поставленное задание. Классы, инкапсуляция (поддерживаемая разделами private и protected), наследование (поддерживаемое механизмом вывода классов), а также динамический полиморфизм (поддерживаемый виртуальными функциями) являются одними из наиболее мощных средств структурирования систем.

Глава 15

Графические функции и данные

“Лучшее — враг хорошего”.

Вольтер (Voltaire)

В любой области приложений, связанной с эмпирическими данными или моделированием процессов, необходимо строить графики. В этой главе обсуждаются основные механизмы построения таких графиков. Как обычно, мы продемонстрируем использование таких механизмов и рассмотрим их устройство. В качестве основного примера используется построение графика функции, зависящей от одного аргумента, и отображение на экране данных, записанных в файле.

15.1. Введение

 

 По сравнению с профессиональными системами программного обеспечения, которые вы будете использовать, если визуализация данных станет вашим основным занятием, описанные в этой главе средства довольно примитивны. Наша главная цель — не элегантность вывода, а понимание того, как создается графический вывод и какие приемы программирования при этом используются. Методы проектирования, способы программирования и основные математические инструменты, представленные в главе, намного важнее, чем описанные графические средства. По этой причине мы не рекомендуем вам ограничиваться беглым просмотром фрагментов кода — они содержат намного больше интересной информации, чем простое рисование.

15.2. Построение простых графиков

Начнем. Рассмотрим примеры того, что мы можем нарисовать и как это реализовать в программе. В частности, посмотрим на классы графического интерфейса: мы видим параболу, горизонтальную и наклонную линии.

На самом деле, поскольку эта глава посвящена графическим функциям, данная горизонтальная линия — это не просто какая-то горизонтальная линия, а график функции, представленной ниже.

double one(double) { return 1; }

Это самая простая функция, которую мы могли себе представить: она имеет один аргумент и всегда возвращает 1. Поскольку для вычисления результата этот аргумент не нужен, называть его необязательно. Для каждого значения x, переданного в качестве аргумента функции one(), получаем значение y, равное 1; иначе говоря, эта линия определяется равенством (x,y)==(x,1) при всех x.

Как любая вступительная математическая аргументация, наши рассуждения выглядят несколько тривиальными и педантичными, поэтому перейдем к более сложному примеру.

double slope(double x) { return x/2; }

Эта функция порождает наклонную линию. Для каждого аргумента x получаем значение y, равное x/2. Иначе говоря, (x,y)==(x,x/2). Эти две линии пересекаются в точке (2,1).

Теперь можем попытаться сделать кое-что интересное. Напишем квадратичную функцию, которая регулярно будет упоминаться в нашей книге.

double square(double x) { return x*x; }

Если вы помните школьную геометрию (и даже если забыли), то поймете, что эта функция определяет параболу, симметричную относительно оси y, а ее самая нижняя точка имеет координаты (0,0), т.е. (x,y)==(x,x*x). Итак, самая нижняя точка параболы касается наклонной линии в точке (0,0).

Ниже приведен фрагмент кода, который рисует три указанные выше линии.

const int xmax = 600;      // размер окна

const int ymax = 400;

const int x_orig = xmax/2; // точка (0,0) — это центр окна

const int y_orig = ymax/2;

const Point orig(x_orig,y_orig);

const int r_min = –10;     // диапазон [–10:11)

const int r_max = 11;

const int n_points = 400;  // количество точек в диапазоне

const int x_scale = 30;    // масштабные множители

const int y_scale = 30;

Simple_window win(Point(100,100),xmax,ymax,"Function graphing");

Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s2(slope,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s3(square,r_min,r_max,orig,n_points,x_scale,y_scale);

win.attach(s);

win.attach(s2);

win.attach(s3);

win.wait_for_button();

Сначала определяем несколько констант, чтобы не перегружать нашу программу “магическими константами”. Затем создаем окно, определяем функции, связываем их с окном и передаем контроль графической системе, которая выполняет реальное рисование на экране.

Все это делается по шаблону, за исключением определений трех объектов класса Function: s, s2 и s3.

Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s2(slope,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s3(square,r_min,r_max,orig,n_points,x_scale,y_scale);

Каждый объект класса Function определяет, как их первый аргумент (функция с одним аргументом типа double, возвращающая значение типа

1 ... 147 148 149 150 151 152 153 154 155 ... 337
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Гость Татьяна Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
  2. Римма Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
  3. Римма Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова
Все комметарии
Новое в блоге