![](/user_photo/2706_HbeT2.jpg)
- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ215x1.jpg)
Классы 215
15.9. Ссылка на себя
Каждая нестатическая функция-член «знает», для какого объекта она вызвана и может явно на него ссылаться, использую ключевое слово this, являющееся указателем на объект, для которого вызвана функция.
Программа 47. Модификация дат
В данной программе написаны функции для модификации даты, которые возвращают ссылку на измененную дату.
// Файл DateCl_6.cpp |
|
class Date{ |
|
int d, m, y; |
// День, месяц и год |
public: |
|
Date(int = 0, int = 0, int = 0); |
// Конструктор |
Date& Add_Year(int n); |
// Добавить к дате n лет |
Date& Add_OneDay(); |
// Добавить к дате 1 день |
Date& Add_Day(int n); |
// Добавить к дате n дней |
Date& Add_OneMonth(); |
// Добавить к дате 1 месяц |
Date& Add_Month(int n); |
// Добавить к дате n месяцев |
void Print(); |
|
}; |
|
#include <iostream.h> |
|
void Date::Print() |
|
{ |
|
cout << d << '.' << m <<'.'<< y; |
|
} |
|
// leap: возвращает 1, если год year високосный и 0, если нет int leap(int year)
{ return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; }
Date& Date::Add_Year(int n)
{
if(m == 2 && d == 29 && leap(y + n) != 1){ m = 3; d = 1; }
y += n; |
|
return *this; |
// Возвращаем ссылку на измененный объект |
} |
|
Здесь внутри функции Add_Year ключевое слово this имеет значение указателя на тот объект класса Date, для которого функция вызвана. Например, далее в main есть инструкция вызова функции Add_Year для объекта Studies:
Studies.Add_Year(4);
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ216x1.jpg)
216 15
Здесь во время работы Add_Year указатель this имеет значение адреса переменной Studies, а выражение *this есть сам объект Studies.
// Массив дней в месяцах для невисокосного и високосного года char daytab[2][13] ={{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
Date& Date::Add_OneDay() |
|
|
{ |
|
|
if(d < daytab[leap(y)][m]) |
// Не последний день месяца |
|
d++; |
|
|
else if(m < 12){ |
// Последний день месяца, но не последний года |
|
d = 1; m++; |
|
|
} |
|
|
else{ |
|
// Последний день года |
d = 1; m = 1; y++; |
|
|
}
return *this;
}
Увеличение даты на n дней реализуется n-кратным вызовом функции увеличения даты на 1 день.
Date& Date::Add_Day(int n) |
// Добавить к дате n дней |
{ |
|
for(int i = 0; i < n; i++) |
// Вызываем n раз функцию |
Add_OneDay(); |
// увеличения даты на 1 день |
return *this; |
|
} |
|
Если исходная дата приходится на декабрь, через месяц будет то же число января следующего года. Для 28, 29, 30 или 31 января, считаем, что через 1 месяц будет последнее число февраля. Последнее число следующего месяца будет также, если исходная дата – последнее число месяца, независимо от числа дней в месяцах.
Date& Date::Add_OneMonth() |
// Добавить к дате 1 месяц |
{ |
|
if(m == 12){ |
// Если декабрь,то |
m = 1; y++; |
// будет январь следующего года |
}
else if((m == 1 && d > 28) || d == 31){ // Если январь, число > 28 или
|
// последний день промежуточного месяца, |
m++; |
// наступит последнее число |
d = daytab[leap(y)][m]; |
// следующего месяца |
} |
|
else |
|
|
Классы |
217 |
m++; |
// Следующий месяца |
|
return *this; |
|
|
} |
|
|
Date& Date::Add_Month(int n) |
// Добавить к дате n месяцев |
|
{ |
|
|
for(int i = 0; i < n; i++) |
// n раз |
|
Add_OneMonth(); |
// добавляем по 1 месяцу |
|
return *this; |
|
|
} |
|
|
// Реализация конструктора |
|
|
#include <dos.h> |
|
|
Date::Date(int dd, int mm, int yy) |
|
|
{ |
|
|
date sysd; |
// Системная дата |
|
getdate(&sysd); |
// Получение системной даты |
|
d = dd ? dd : sysd.da_day; |
|
|
m = mm ? mm : sysd.da_mon; |
|
|
y = yy ? yy : sysd.da_year; |
|
|
} |
|
|
#include <conio.h> int main()
{
Date Studies(1, 9, 2005);
cout << "Начало учебы: "; Studies.Print(); cout << endl; Studies.Add_Year(4);
Studies.Add_Month(9);
Studies.Add_Day(21);
cout << "Конец учебы: "; Studies.Print(); cout << endl;
Date Today; // Использование конструктора по умолчанию, сегодня cout << "Сегодня: "; Today.Print(); cout << endl; Today.Add_Year(1).Add_Month(1).Add_Day(1);
cout << "Через 1 год, 1 месяц и 1 день будет "; Today.Print(); cout << endl;
getch(); return 0;
}
Программа выдает:
Начало учебы: 1.9.2005 Конец учебы: 22.6.2010 Сегодня : 12.4.2006
Через 1 год 1 месяц 1 и один день будет 13.5.2007
Обсудим инструкцию
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ218x1.jpg)
218 15
Today.Add_Year(1).Add_Month(1).Add_Day(1);
Когда есть несколько операторов точка (.), они выполняются слева направо, то есть приведенная инструкция эквивалентна следующей:
((Today.Add_Year(1)).Add_Month(1)).Add_Day(1);
Выражение Today.Add_Year(1) во внутренних скобках равно дате Today, увеличенной на 1 год, так как Add_Year возвращает ссылку на объект, для которого вызывается. Далее для этой измененной Today вызывается Add_Month, которая также возвращает дату Today, увеличенную на 1 месяц, которая затем увеличивается на 1 день функцией Add_Day. Возможность писать подобные цепочки вызовов функций обеспечивается тем, что функции возвращают ссылки на объекты.
15.10.Деструкторы
Вконструкторах при создании объектов могут захватываться некоторые ресурсы, например, выделяться память, открываться файлы и
т.п. При уничтожении объектов ресурсы должны освобождаться. Эту работу выполняют специальные функции-члены класса – деструкторы.
Имя деструктора совпадает с именем класса, только впереди добавляется знак ~ (тильда). Деструктор не имеет аргументов, и так же, как и конструктор, ничего не возвращает.
Деструкторы вызываются неявно, когда автоматическая переменная выходит из зоны видимости, когда оператором delete удаляется объект, созданный в свободной памяти оператором new.
Программа 48. Деструктор в классе дат
В классе дат деструктор не нужен, так как при создании переменных типа Date никакие ресурсы не выделяются, кроме памяти под d, m, y. При уничтении переменной типа Date, занимаемая ею память освобождается встроенными средствами. Можно сказать, что при этом работает деструктор по умолчанию.
Включим все-таки в класс Date деструктор, который будет лишь сигнализировать о своей работе.
// Файл DateCl_7.cpp |
|
class Date{ |
|
int d, m, y; |
// День, месяц и год |
// … |
|
public: |
|
Date(int = 0, int = 0, int = 0); |
// Конструктор |
~Date(); |
// Деструктор |
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ219x1.jpg)
Классы 219
//…
};
//Реализация деструктора Date::~Date()
{
cout << ”\nРаботает деструктор для ”; |
// Сообщаем о себе, |
|
Print(); |
|
// выводим дату |
} |
|
|
int main() |
|
|
{ |
|
|
Date Today; |
|
// Сегодня |
{ |
|
// Начало блока |
Date Rev(7, 11, 1917); |
// Создание локальной переменной в блоке |
|
} |
// Конец блока. Rev уничтожается |
|
return 0; |
|
|
} |
|
// Здесь уничтожается Today |
Программа выдает:
Работает деструктор для 7.11.1917 Работает деструктор для 19.4.2006
Данный пример подтверждает, что деструктор действительно вызывается неявно при уничтожении объектов класса.
Программа 49. Многоугольники
В программе разработан класс Plgn для моделирования многоугольников на плоскости. В конструкторе этого класса динамически выделяется память под координаты вершин, а в деструкторе освобождается память, выделенная в конструкторе. В классе предусмотрены функции – члены для изображения многоугольника на экране, для его стирания с экрана, а также для перемещения и вращения многоугольника.
При решении задачи надо решить вопрос о совмещении математической плоскости, с помощью которой мы будем моделировать многоугольник, с физической плоскостью экрана. На рис.69 показана схема экрана и действующая на нем физическая экранная система координат xs, ys. Совместим начало математической системы координат x, y с центром экрана (x0, y0). Будем считать, что математическая плоскость отображается на плоскость экрана в масштабе 1:1, то есть математическая единица длины соответствует расстоянию между соседними пикселями на экране. Приведенные соображения реализованы в программе. В функциях рисования нужны физические
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ220x1.jpg)
220 15
координаты пикселей. Переход от математических координат к физическим производится по формулам:
xs = x0 + x, ys = y0 – y.
Знак минус учитывает разное направление вертикальных осей в физической и математической системах координат.
0 |
y |
|
x[1] |
639 |
xs |
|||||
0 |
|
|
|
|
|
|
|
|
|
|
|
|
x0 |
1 |
|
|
|
|
|||
y[1] |
|
|
0 |
|
|
|
|
|||
|
|
3 |
|
|
|
|
|
|
x |
|
|
|
|
|
|
|
|
|
|
||
|
|
y0 |
|
|
|
|
2 |
|
|
|
|
|
|
5 |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
|
|
4 |
|
|
|
|
|
|
|
|
479 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
экран |
|
|
|
|
|
ys |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||
Рис.69. Плоскость экрана и математическая система координат |
||||||||||
// Файл Polygon.cpp |
|
|
|
|
|
|
|
|
||
class Plgn |
|
|
// Класс многоугольников |
|||||||
{ |
|
|
|
|
|
|
|
|
|
|
int n; |
|
|
// Число вершин |
|
|
|||||
float *x; |
|
|
// Указатель на массив абсцисс |
|||||||
float *y; |
|
|
// Указатель на массив ординат |
|||||||
static int x0, y0; |
|
|
// Координаты центра экрана |
|||||||
public: |
|
|
|
|
|
|
|
|
||
Plgn(int n = 3); |
// Конструктор с аргументом по умолчанию |
|||||||||
~Plgn(); |
// Деструктор |
|
|
|
|
|||||
void Show(); |
// Функция рисования многоугольника |
|||||||||
void Hide(); |
// Функция, убирающая изображение |
|||||||||
void Move(int dx, int dy); |
// Смещение многоугольника на dx, dy |
|||||||||
void Rotate(float angle); |
// Поворот на угол angle градусов |
|
|
|||||||
void Movement(); |
// Движение, пока не нажата Esc |
|
|
|||||||
static void SetBegCoord(int xn, int yn) |
// Установка координат центра |
|||||||||
{ x0 = xn; y0 = yn; } |
|
|
|
|
|
|
|
|
||
}; |
|
|
|
|
|
|
|
|
|
|
# include <iostream.h>
|
Классы |
221 |
# include <graphics.h> |
// Графика |
|
# include <stdlib.h> |
// Доступ к random |
|
# include <conio.h> |
|
|
# include <math.h> |
|
|
Plgn::Plgn(int nn) |
// Конструктор |
|
{ |
|
|
n = nn; |
|
|
x = new float [n]; |
// Выделение памяти под массив абсцисс |
|
y = new float [n]; |
// Выделение памяти под массив ординат |
|
for(int i = 0; i < n; i++){ |
// Заполнение массивов координат |
|
x[i] = x0 - random(x0 * 2); |
// случайными числами |
|
y[i] = y0 - random(y0 * 2); |
|
|
} |
|
|
} |
|
|
Для простоты координаты вершин многоугольника задаются в конструкторе случайными числами с использованием функции
int random(int num);
которая генерирует случайное целое число из диапазона от 0 до num – 1; Таким образом, случайные координаты вершин многоугольника будут находиться в диапазонах [-x0, x0] и [-y0, y0] и, следовательно, не выйдут за пределы экрана.
Plgn::~Plgn() |
// Деструктор |
{ |
|
delete [] x; |
// Освобождение |
delete [] y; |
// памяти |
} |
|
void Plgn::Show() |
// Рисует многоугольник, рядом |
{ |
// с вершиной выводит ее номер |
char num[20]; |
// Память под номер вершины |
for(int i = 0; i < n; i++){ |
|
line(x0 + x[i], y0 - y[i], |
// Изображение |
x0 + x[(i + 1) % n], y0 - y[(i + 1) % n]); // i-й стороны |
|
itoa(i, num, 10); |
// Получение номера вершины |
outtextxy(x0 + x[i], y0 - y[i], num); |
// Вывод номера вершины |
} |
|
} |
|
Функция line рисует отрезки, соединяющие соседние вершины. Возле вершин многоугольника выводятся их номера. Для вывода текста на экран в графическом режиме использована функция
void outtextxy(int x, int y, char *textstring);
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ222x1.jpg)
222 15
которая выводит строку символов textstring, начиная с пикселя экрана с координатами x, y.
Для получения строки с номером вершины использована функция (заголовочный файл stdlib.h)
char *ltoa(long value, char *string, int radix);
которая преобразует число value в строку цифр string, дающую представление числа в системе счисления с основанием radix.
void Plgn::Hide() |
|
// Стереть изображение |
{ |
|
|
int clr = getcolor(); |
|
// Запоминаем цвет рисования |
setcolor(getbkcolor()); |
|
// Цветом рисования делаем цвет фона |
Show(); |
// Рисуем цветом фона, изображение исчезает |
|
setcolor(clr); |
|
// Восстанавливаем прежний цвет рисования |
} |
|
|
void Plgn::Move(int dx, int dy) // Смещение многоугольника на dx |
||
{ |
|
// по горизонтали и на dy по вертикали |
Hide(); |
|
// Убираем изображение |
for(int i = 0; i < n; i++) |
// Смещение |
|
x[i] += dx, y[i]+=dy; |
// каждой вершины |
|
Show(); |
|
// Снова показываем многоугольник |
} |
|
|
Выпишем формулы, нужные для программирования поворота многоугольника вокруг центра масс. На рис.70 показан многоугольник и одна из его вершин M в исходном положении и после его поворота вокруг точки C на угол β. Новое положение вершины обозначено M1.
В качестве центра масс можно взять точку C с координатами:
n |
n |
|
xc = å xi |
n , yc = å yi |
n |
i=1 |
i=1 |
. |
Здесь n – число вершин многоугольника, xi, yi, i=1,…, n – координаты вершин. Данная формула действительно будет давать координаты центра масс, если вся масса многоугольника сосредоточена в его вершинах и массы вершин одинаковы.
Как видно из рис.70, координаты точки M относительно центра масс C равны:
xr = x − xC = CM cosα , yr = y − yC = CM sinα .
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ223x1.jpg)
Классы 223
Рис.70. Поворот многоугольника вокруг центра масс
Так как CM1 = CM , то относительные координаты точки M1 после поворота выразятся формулами:
xr1 = CM1 cos(α + β ) = CM1 cosα cos β − CM1 sinα sin β = = xr cos β − yr sin β ,
yr1 = CM1 sin(α + β ) = CM1 sinα cos β + CM1 cosα sin β =
=yr cos β + xr sin β .
Таким образом, новые абсолютные координаты точки M будут:
x1 = xC + xr1 = xC + xr cos β − yr sin β , y1 = yC + yr1 = yC + yr cos β + xr sin β .
Эти формулы используются в функции вращения многоугольника:
void Plgn::Rotate(float angle) |
// Функция поворота многоугольника |
{ |
// на угол angle (задается в градусах) |
float xC = 0, yC = 0, xr, yr; |
|
int i; |
|
angle = angle*M_PI/180; |
// Перевод угла в радианы |
Hide(); |
// Убираем изображение |
for(i = 0; i < n; i++){ |
// Вычисление координат |
xC += x[i]; yC += y[i]; |
// центра масс |
} |
|
xC /= n; yC /= n; |
|
![](/html/2706/175/html_zl27x8vZdH.bmrn/htmlconvd-ehB0QZ224x1.jpg)
224 15
for(i = 0; i < n; i++){ // Получение координат вершин после поворота
xr = x[i] - xC; |
// Координаты вершины |
|
yr = y[i] - yC; |
// относительно центра масс |
|
x[i] = xC + xr * cos(angle) - yr * sin(angle); |
// Координаты вершины |
|
y[i] = yC + xr * sin(angle) + yr * cos(angle); |
// после поворота |
|
} |
|
|
Show(); |
// Показываем многоугольник |
|
} |
|
|
void Plgn::Movement() |
// Движение при нажатии клавиш |
|
{ |
// со стрелками, пока не нажата Esc |
|
const int UP = 72, DOWN = 80, LFTUP = 76, |
// Константы |
|
RIGHT = 77, LEFT = 75, ESC = 27; |
// для кодов клавиш |
|
char c = 32; // Начальное значение для c должно отличаться от ESC |
||
while(c != ESC){ |
// Пока не нажата клавиша esc |
|
c = getch(); |
// Читаем код клавиши |
|
if(c == 0) |
// Если у клавиши двухбайтовый код, |
|
c = getch(); |
// читаем второй байт |
|
switch(c){ |
|
|
case LEFT: Move(-1, 0); break; |
// Нажата стрелка влево |
|
case RIGHT: Move(1, 0); break; |
// Нажата стрелка вправо |
|
case UP: Move(0, 1); break; |
// Нажата стрелка вверх |
case DOWN: Move(0, -1); break; // Нажата стрелка вниз case LFTUP: Rotate(5); break;
}
}
}
Перемещение многоугольника производится нажатием клавиш со стрелками. Вращение – нажатием клавиши 5 на дополнительной
цифровой клавиатуре. При этом не должна гореть лампочка NumLock,
чтобы клавиши дополнительной цифровой клавиатуры работали как управляющие, а не как цифровые.
// Определение статических членов класса – координат центра экрана int Plgn::x0, Plgn::y0;
void main()
{
int gd = DETECT, gmode, n, x; char c;
randomize(); // Инициализация датчика случайных чисел initgraph(&gd, &gmode, "C:\\TC30\\BGI"); // Установка граф. режима
// Задаем координаты центра экрана Plgn::SetBegCoord(getmaxx() / 2, getmaxy() / 2);
cout << "Введите число вершин: "; |
|
cin >> n; |
// Ввод числа вершин |
|
Классы |
225 |
Plgn mnog(n); |
// Многоугольник |
|
setcolor(WHITE); |
// Установка цвета |
|
mnog.Show(); |
// Вывод многоугольника |
|
mnog.Movement(); |
// Перемещения многоугольника |
|
mnog.Hide(); |
// Убираем многоугольник |
|
Plgn triangle; |
// Многоугольник по умолчанию (треугольник) |
|
triangle.Show(); |
// Показываем треугольник |
|
triangle.Movement(); |
// Движение треугольника |
|
triangle.Hide(); |
// Скрываем треугольник |
|
closegraph(); |
// Переход в текстовый режим |
}
Вызов статической функции
Plgn::SetBegCoord(getmaxx() / 2, getmaxy() / 2);
устанавливает для статических членов класса Plgn::x0, Plgn::y0 значения координат центра экрана.
В главной функции сначала создается многоугольник mnog, число вершин которого следует ввести. Затем для mnog вызывается функция Movement, которая позволяет его двигать и вращать. Далее создается треугольник triangle с использованием конструктора по умолчанию. Треугольником также можно «поиграть».
Для чтения кодов нажимаемых клавиш использована функция int getch() (заголовочный файл conio.h), которая возвращает для обычных алфавитно-цифровых клавиш однобайтовый код, равный коду соответствующего символа, а для управляющих и функциональных клавиш – двухбайтовый код. Для таких клавиш при первом вызове getch() возвращает 0, а при втором – некоторый код, свой для каждой клавиши. Коды, возвращаемые getch(), можно узнать с помощью программы:
//Файл CodeKeys.cpp
//Получение кодов клавиш функцией getch() #include <iostream.h>
#include <conio.h> void main()
{
cout << "\nНажмите клавишу\n"; int c = getch();
if(0 == c){
c = getch();
cout << "\nУ клавиши двухбайтовый код: 0 " << c << endl;
}
else
cout << "\nУ клавиши однобайтовый код: " << c ;