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


Text ts(Point(100,y_orig–40),"one");
Text ts2(Point(100,y_orig+y_orig/2–20),"x/2");
Text ts3(Point(x_orig–100,20),"x*x");
win.set_label("Function graphing: label functions");
win.wait_for_button();
С этого момента на протяжении всей главы мы будем пропускать повторяющийся код, связывающий фигуру с окном, присваивающий ей метку и ожидающий щелчка на кнопке Next.


Код для построения осей состоит из объявлений двух объектов класса Axis (раздел 15.4).
const int xlength = xmax–40; // оси должны быть чуть меньше окна
const int ylength = ymax–40;
Axis x(Axis::x,Point(20,y_orig), xlength,
xlength/x_scale, "one notch == 1");
Axis y(Axis::y,Point(x_orig, ylength+20),
ylength, ylength/y_scale, " one notch == 1");

Использование значения xlength/x_scale в качестве параметра, задающего количество делений, позволяет использовать целочисленные отметки 1, 2, 3 и т.д. Выбор точки (0,0) в качестве начала координат является общепринятым. Если хотите, чтобы начало координат было не в центре, а, как обычно, в левом нижнем углу окна (раздел 15.6), вы легко сможете сделать это. Кроме того, для того чтобы различать оси, можно использовать цвет.
x.set_color(Color::red);
y.set_color(Color::red);
Итак, получаем результат, показанный ниже.


15.3. Класс Function
Определение класса графического интерфейса Function приведено ниже.
struct Function:Shape {
// параметры функции не хранятся
Function(Fct f,double r1,double r2,Point orig,
int count = 100,double xscale = 25,double yscale = 25);
};
Класс Function является производным от класса Shape. Конструктор класса Function генерирует множество отрезков линий и хранит их в членах класса Shape. Эти отрезки линий аппроксимируют значения функции f. Значения функции f вычисляются count раз в точках, равномерно распределенных по интервалу [r1:r2].
Function::Function(Fct f,double r1,double r2,Point xy,
int count,double xscale,double yscale)
// строит график функции f(x) для x из диапазона [r1:r2),
// используя count отрезков линий;
// начало координат (0,0) располагается в точке xy
// координаты x масштабируются множителем xscale
// координаты y масштабируются множителем yscale
{
if (r2–r1<=0) error("Неправильный диапазон");
if (count <=0) error("Отрицательное значение count");
double dist = (r2–r1)/count;
double r = r1;
for (int i = 0; i<count; ++i) {
add(Point(xy.x+int(r*xscale),xy.y–int(f(r)*yscale)));
r += dist;
}
}
Параметры xscale и yscale используются для масштабирования координат x и y соответственно. Обычно масштабирование необходимо для того, чтобы правильно расположить рисунок в окне.
Обратите внимание на то, что объект класса Function не хранит значения, передаваемые его конструктору, поэтому мы не можем впоследствии запросить у функции информацию о том, где находится начало координат, или перерисовать график с другими масштабирующими множителями. Этот объект просто хранит точки (в классе Shape) и выводит график на экран. Если бы мы хотели повысить гибкость объекта класса Function после его создания, то должны были бы хранить в нем требуемые значения (см. упр. 2).
15.3.1. Аргументы по умолчанию
Обратите внимание на способ инициализации аргументов xscale и yscale конструктора класса Function. Такой способ инициализации называют заданием аргументов по умолчанию (default arguments). Их значения используются тогда, когда при вызове значения аргументов вообще не указываются.
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 по умолчанию и
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова