- •Предисловие
- •Глава 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. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
148 |
11 |
|
} |
|
|
int main() |
|
|
{ |
|
|
int h; |
|
// Ширина полосы флага |
int x = 2, y = 2; |
// Координаты левого верхнего угла |
|
cout << "Введите размер флага от 1 до 5"; |
||
cin >> h; |
|
|
RussFlag(x, y, h); |
|
|
getch(); |
// Ждем нажатия клавиши |
|
NormScreen(); |
// Восстанавливаем исходные настройки экрана |
|
return 0; |
|
|
} |
|
|
12.2.Графический режим
Вграфическом режиме все изображения на экране создаются светящимися точками – пикселями. Разрешающая способность, то есть
количество пикселей по горизонтали и по вертикали, зависит от типа монитора и типа электронной схемы (видеоадаптера), обеспечивающей работу монитора.
В состав TC входит библиотека функций для реализации точечной графики, прототипы которых находятся в файле graphics.h.
Графические драйверы и режимы
Для поддержки графического режима работы экрана в оперативную память должна быть загружена специальная программа – графический драйвер. В TC имеются шесть файлов с графическими драйверами:
CGA.BGI, EGAVGA.BGI, IBM8514.BGI, HERC.BGI, ATT.BGI, PC3270.BGI. Заметим, что расширение BGI произошло от слов Borland Graphic Interface. Каждый файл содержит драйвер для одного или нескольких близких по типу видеоадаптеров. Логически TC различает десять графических драйверов. Для каждого драйвера в файле graphics.h определена константа, которую можно считать символическим именем драйвера. Константы графических драйверов, их значения и соответствующие имена файлов перечислены в табл.39.
Таблица 40. Графические драйверы Turbo C++
Константа (символическое |
Значение |
Имя файла драйвера |
имя драйвера) |
константы |
|
CGA |
1 |
CGA.BGI |
MCGA |
2 |
CGA.BGI |
EGA |
3 |
EGAVGA.BGI |
EGA64 |
4 |
EGAVGA.BGI |
О файлах и командной строке 149
EGAMONO |
5 |
EGAVGA.BGI |
IBM8514 |
6 |
IBM8514.BGI |
HERCMONO |
7 |
HERC.BGI |
ATT400 |
8 |
ATT.BGI |
VGA |
9 |
EGAVGA.BGI |
PC3270 |
10 |
PC3270.BGI |
DETECT |
0 |
|
Константа DETECT используется, когда системе самой поручается определить тип видеоадаптера и загрузить соответствующий драйвер. При этом будет использован драйвер, обеспечивающий максимальное разрешение.
Графические драйверы обеспечивают один или несколько различных графических режимов, для которых в файле graphics.h определены константы. В табл.41 приведены имена и значения этих констант для драйвера VGA, разрешение и количество цветов.
Таблица 42. Константы графических режимов
Графический |
Константа |
Значение |
Разрешени |
Количеств |
драйвер |
графического |
константы |
е, |
о цветов |
|
режима |
|
пикселей |
|
VGA |
VGALO |
0 |
640 x 200 |
16 |
|
VGAMED |
1 |
640 x 350 |
16 |
|
VGAHI |
2 |
640 x 480 |
16 |
Инициализация графики
Для перевода адаптера экрана в графический режим и загрузки соответствующего драйвера служит библиотечная функция initgraph. Ее прототип имеет вид:
void initgraph(int* GraphDriver, int* GraphMode, char* PathToDriver);
Графический драйвер ищется в каталоге, имя которого указано в аргументе PathToDriver. Если в указанном каталоге драйвер не найден, то просматривается текущий каталог. Если в качестве третьего аргумента указана пустая строка "", то просматривается только текущий каталог. Параметр GraphDriver указывает номер драйвера, GraphMode указывает номер графического режима, который должен быть установлен.
Если положить GraphDriver = 0 или библиотечной константе DETECT, то производится автоматическое распознавание графического адаптера, в память загружается соответствующий драйвер, устанавливается режим с максимальным разрешением, а переменным, указанным в аргументах GraphDriver и GraphMode, присваиваются значения, равные номеру драйвера и номера режима.
150 11
Об успехе или неудаче той или иной графической операции можно судить по значению, вырабатываемому функцией:
int graphresult(void);
после каждой графической операции. Результат, равный 0 (значение библиотечной константы grOk), означает удачное, а отрицательное значение – неудачное выполнение операции.
Для восстановления текстового режима служит функция: void closegraph();
Эта функция освобождает память, выделенную графическому драйверу
ивыбранному виду шрифта, использовавшегося в графическом режиме.
Вграфическом режиме каждый пиксель имеет две координаты – по горизонтали и по вертикали экрана. Начало координат находится в левом верхнем углу экрана. Нумерация пикселей начинается с нуля.
Направление |
отсчета: |
по |
горизонтали – слева |
направо, |
по |
вертикали – сверху вниз. |
|
|
|
|
Функции рисования
Для рисования на экране имеется довольно много библиотечных функций, объявленных в заголовочном файле graphics.h. Рассмотрим некоторые.
Функция
int getcolor(void);
возвращает текущий цвет рисования. Всего для рисования доступно 16 цветов, они кодируются такими же константами, как в текстовом режиме, табл.43.
Функция
void setcolor(int color);
устанавливает новый цвет рисования color. Функция
int getbkcolor(void);
возвращает текущий цвет фона. Функция
void setbkcolor(int color);
устанавливает новый цвет фона color. Функция
void putpixel(int x, int y, int color);
О файлах и командной строке 151
изображает на экране точку с координатами x, y цветом color. Функция
void line(int x1, int y1, int x2, int y2);
рисует на экране отрезок прямой, соединяющий точки с координатами (x1, y1) и (x2, y2), используя текущий цвет, текущие стиль и толщину линий. По умолчанию текущим является белый цвет, текущим стилем – сплошная линия, а текущей толщиной – толщина в один пиксель.
Функция
void circle (int x, int y, int Radius);
изображает на экране окружность радиуса Radius с центром, имеющим координаты x, y.
Функции:
int getmaxx(void); int getmaxy(void);
возвращают максимальные координаты точек на экране соответственно в горизонтальном и вертикальном направлениях.
Программа 34. Звезда
На экране рисуется звезда с заданным числом лучей N, вписанная в окружность. Для построения звезды понадобятся некоторые математические вычисления. На рис.52 показана схема экрана, действующая на нем физическая система координат и геометрические построения, необходимые для изображения семиугольной звезды. Показан случай, когда используется драйвер VGA и действует режим работы экрана VGAHI с разрешение 640*480. Максимальная координата пикселя по горизонтальной оси в этом случае будет 639, а по вертикальной 479.
152 11
0 |
xс |
x1 |
639 |
x |
0 |
|
0 |
|
|
|
|
|
|
|
6 |
|
1 |
|
|
y1 |
|
|
|
|
|
|
R |
|
|
yc |
|
f1 |
|
|
|
|
|
|
|
5 |
|
|
2 |
|
4 |
|
3 |
|
|
479
y
Рис.53. Чертеж для построения звезды
Через xc, yc обозначены координаты центра звезды, R – радиус звезды. Будем нумеровать лучи, начиная с 0. Пусть нулевой луч направлен вверх. Положение лучей можно определять углом fi, отсчитываемым от вертикали. Для i-го луча этот угол будет
fi = i × 2p / N .
Из чертежа видно, что координаты первой вершины можно найти по формулам:
x1 = xc + R sin f1 , y1 = yc - R cos f1 .
Координаты i-й вершины рассчитываются по аналогичным формулам, только вместо 1 нужно подставить i.
Когда рассчитаны координаты вершин, построение сводится к соединению их отрезками прямых. Если соединять соседние вершины, получится просто правильный многоугольник. Для семи вершин можно построить два вида звезды, пропуская либо два, либо три отрезка разбиения. Такая возможность в программе реализована с помощью переменной m, задающей число пропускаемых отрезков разбиения.
//Файл Star.cpp
//Программа изображает на экране правильную звезду,
//вписанную в окружность.
#include <graphics.h> #include <conio.h> #include <stdlib.h>
|
О файлах и командной строке |
153 |
|
#include <math.h> |
|
|
|
#include <iostream.h> |
|
|
|
int main() |
|
|
|
{ |
|
|
|
int Driver, Mode; |
|
|
|
int xc, yc; |
|
// Координаты центра звезды |
|
const int N = 7; |
|
// Количество лучей звезды |
|
int m = 3; |
// Количество пропускаемых отрезков |
||
const int ColorCircle = YELLOW; |
// Цвет окружности |
|
|
const int ColorStar = LIGHTRED; |
// Цвет звезды |
|
|
int R = 100; |
|
// Радиус окружности |
|
double df = 2 * M_PI / N; |
|
// Угол между лучами |
|
double f; |
|
|
|
int x[N], y[N]; |
|
// Координаты концов лучей |
|
int i; |
|
|
|
Driver = DETECT; |
// Автоматическое определение драйвера |
||
// Инициализация графического режима |
|
||
initgraph(& Driver, & Mode, "C:\\TC30\\BGI"); |
|
||
if (graphresult() != grOk){ |
|
// Если ошибка, |
|
cerr << "Не удалось инициализировать графику \n"; |
|
||
exit(1); |
|
// завершить программу |
|
} |
|
|
|
xc = getmaxx() / 2; |
|
// Координаты |
|
yc = getmaxy() / 2; |
|
// центра экрана |
|
for(i = 0; i < N; i++){ |
// Вычисление координат концов лучей |
||
f = df * i; |
|
// Угол i-го луча |
|
x[i] = xc + R * sin(f); |
|
// Координаты |
|
y[i] = yc - R * cos(f); |
|
// вершины |
|
} |
|
|
|
setcolor(ColorCircle); |
|
// Установка цвета для окружности |
|
circle(xc, yc, R); |
|
// Рисование окружности |
|
setcolor(ColorStar); |
|
// Установка цвета для звезды |
|
for(i = 0; i < N; i++) |
|
// Рисование лучей |
|
line(x[i], y[i], x[(i + m) % N], y[(i + m) % N]); getch();
closegraph(); return 0;
}
Обратите внимание на строку "C:\\TC30\\BGI", задающую путь к папке, в которой находятся файлы графических драйверов. В DOS и Windows принято имена вложенных папок отделять обратной наклонной чертой. Для изображения обратной наклонной черты в программе на языке C++, она удваивается.
Координаты вершин звезды хранятся в массивах x и y из N элементов. Для изображения звезды, например, при N=7 и m=3 нужно