Литмир - Электронная Библиотека
A
A

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); // нет

                                                      // yscale

Function s3(square,r_min,r_max,orig,n_points);  // нет xscale,

                                                // нет yscale

Function s4(sqrt,r_min,r_max,orig); // нет count, нет xscale,

                                    // нет yscale

Этот фрагмент кода эквивалентен следующему:

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, 25);

Function s3(square,r_min,r_max,orig,n_points,25,25);

Function s4(sqrt,r_min,r_max,orig,100,25,25);

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

struct Function:Shape { // альтернатива аргументам, заданным

                        // по умолчанию

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

  int count, double xscale,double yscale);

  // масштаб переменной y по умолчанию:

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

  int count, double xscale);

  // масштаб переменной x и y:

  Function(Fct f,double r1,double r2,Point orig,int count);

  // значение count по умолчанию и масштаб x и y по умолчанию:

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

};

 

Программирование. Принципы и практика использования C++ Исправленное издание - _002.png
 Для определения четырех конструкторов необходимо проделать больше работы, при этом в определениях конструкторов природа значений, заданных по умолчанию, скрыта, а при их явном задании в объявлении функции они выражаются явно. Аргументы по умолчанию часто используются при объявлении конструкторов, но они могут быть полезными для любых функций. Определять аргументы по умолчанию можно лишь для смежных аргументов.

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); }

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

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

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

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
с небольшого положительного числа. Результат приведен ниже.

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

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

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

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

15.4. Оси

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

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

202
{"b":"847443","o":1}