Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

struct Function:Shape {

Function(Fct f,double r1,double r2,Point orig,

int count = 100,double xscale,double yscale); // ошибка

};

Если аргумент имеет значение, заданное по умолчанию, то все последующие аргументы также должны их иметь.

struct Function:Shape {

Function(Fct f,double r1,double r2,Point orig,

int count = 100,double xscale=25,double yscale=25);

};

Иногда угадать удачные значения по умолчанию легко. Например, для строки хорошим выбором значения по умолчанию будет пустой объект класса

string
, а для вектора — пустой объект класса
vector
. В других ситуациях, например для класса
Function
, правильно выбрать значения по умолчанию значительно сложнее: для этого приходится применять метод проб и ошибок. Помните, что вы не обязаны задавать значения по умолчанию и, если вам трудно это сделать, просто предоставьте пользователю самому задать аргумент.

15.3.2. Новые примеры

Мы добавили еще несколько функций — косинус (

cos
) из стандартной библиотеки и — просто для того, чтобы продемонстрировать, как создать сложную функцию, — косинус с наклоном
x/2
.

double sloping_cos(double x) { return cos(x)+slope(x); }

Результат приведен ниже.

Соответствующий фрагмент кода выглядит так:

Function s4(cos,r_min,r_max,orig,400,20,20);

s4.set_color(Color::blue);

Function s5(sloping_cos, r_min,r_max,orig,400,20,20);

x.label.move(–160,0);

x.notches.set_color(Color::dark_red);

Кроме сложения этих двух функций, мы сместили метку оси x и (просто для иллюстрации) немного изменили цвет шкалы деления.

В заключение построим графики логарифма, экспоненты, синуса и косинуса.

Function f1(log,0.000001,r_max,orig,200,30,30); // ln

Function f2(sin,r_min,r_max,orig,200,30,30); // sin

f2.set_color(Color::blue);

Function f3(cos,r_min,r_max,orig,200,30,30); // cos

Function f4(exp,r_min,r_max,orig,200,30,30); // exp

Поскольку значение

log(0)
не определено (с математической точки зрения оно равно бесконечности), мы начали диапазон изменения функции
log
с небольшого положительного числа. Результат приведен ниже.

Вместо приписывания меток этим графикам мы изменили их цвет.

Стандартные математические функции, такие как

cos
,
sin
и
sqrt
, объявлены в стандартном библиотечном заголовке
<cmath>
. Список стандартных математических функций приведен в разделах 24.8 и B.9.2.

15.4. Оси

Для представления данных мы используем класс

Axis
(например, как в разделе 15.6.4), поскольку график без информации о его масштабе выглядит подозрительно. Класс
Axis
состоит из линии, определенного количества делений оси и текстовой метки. Конструктор класса
Axis
вычисляет координаты линии оси и (при необходимости) линий, используемых как деления оси.

struct Axis:Shape {

enum Orientation { x, y, z };

Axis(Orientation d, Point xy, int length,

int number_of_notches=0, string label = "");

void draw_lines const;

void move(int dx, int dy);

void set_color(Color c);

Text label;

Lines notches;

};

Объекты

label
и
notches
остаются открытыми, поэтому пользователи могут ими манипулировать, например приписывать делениям цвет, отличающийся от цвета линии, или перемещать объект
label
с помощью функции
move
в более удобное место. Объект класса
Axis
— это пример объекта, состоящего из нескольких полунезависимых объектов.

Конструктор класса

Axis
размещает линии и добавляет на них деления, если значение
number_ of_notches
больше нуля.

Axis::Axis(Orientation d, Point xy, int length, int n, string lab)

:label(Point(0,0),lab)

{

if (length<0) error("bad axis length");

switch (d){

case Axis::x:

{

Shape::add(xy); // линия оси

  • Читать дальше
  • 1
  • ...
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: