Программа 35. Точки и прямоугольники на экране
Программа иллюстрирует применение разработанных выше структур и функций, моделирующих точки и прямоугольники на математической плоскости. Требуется отображать точки и прямоугольники на физической плоскости экрана, где система координат отличается от принимаемой, обычно, в математике, рис.36.
На экране при его работе в текстовом режиме начало системы координат находится в левом верхнем углу, ось xs направлена вправо, ось ys вниз, то есть координата ys отсчитывается от верхнего края экрана. Левый верхний угол экрана имеет координаты (1, 1). Высота экрана составляет обычно 25 строк, ширина – 80 столбцов. Кроме того, если на экране создано окно, то в нем действует своя локальная система координат, с началом в левом верхнем углу окна.
Будем считать, что первый квадрант математической плоскости совпадает с физической плоскостью экрана, то есть ось x совпадает с нижним краем экрана, ось y – с левым, единица длины на математической плоскости численно равна единице длины на экране. Отсюда следует связь математических координат x, y и экранных координат xs, ys:
xs = x, ys = 25 − y.
Данные соображения учитываются в функции
void show_rect(rect* pr, int color);
которая изображает на экране прямоугольник и переводит курсор в его центр. В программе использованы такие же обозначения, как на рис. 36.
Рис.36. Отображение математической плоскости на плоскость экрана
В текст программы следует вставить сделанные выше объявления структур point и rect и определения функций.
// Файл PointRct.cpp
struct point{ // Cтруктура точка
int x, y;
};
// make_point: создание точки
point make_point(int x, int y)
{
point tmp;
tmp.x = x; tmp.y =y;
return tmp;
}
struct rect{ // Структура прямоугольник
point pt1, pt2;
};
// make_rect: создание прямоугольника
rect make_rect(point p, point q)
{
rect tmp;
tmp.pt1 = p; tmp.pt2 = q;
return tmp;
}
#include <conio.h>
// cetner_rect: возвращает точку - центр прямоугольника
point center_rect(rect* pr)
{
point tmp =
make_point((pr->pt1.x + pr->pt2.x) / 2, (pr->pt1.y + pr->pt2.y) / 2);
return tmp;
}
#define max(a, b) (a)>(b)?(a):(b)
#define min(a, b) (a)<(b)?(a):(b)
// canon_rect: канонизация координат прямоугольника
rect canon_rect(rect r)
{
rect tmp;
tmp.pt1.x = min(r.pt1.x, r.pt2.x);
tmp.pt1.y = min(r.pt1.y, r.pt2.y);
tmp.pt2.x = max(r.pt1.x, r.pt2.x);
tmp.pt2.y = max(r.pt1.y, r.pt2.y);
return tmp;
}
// show_rect: изображает прямоугольник на экране и
// помещает курсор в его центр
const int HIGHT = 25; // Высота экрана в строках
void show_rect(rect* pr, int color)
{ // color - цвет прямоугольника
point LU = make_point(pr->pt1.x, HIGHT - pr->pt2.y);
// LU – Левый верхний угол прямоугольника на экране
point RD = make_point(pr->pt2.x, HIGHT - pr->pt1.y);
// RD – Правый нижний угол прямоугольника на экране
window(LU.x, LU.y, RD.x, RD.y); // Создание окна,
// соответствующего прямоугольнику
textbackground(color); // Выделение прямоугольника
clrscr(); // цветом
point M = center_rect(pr); // Центр прямоугольника в
// математической системе координат
int xM = M.x, yM = M.y; // Координаты центра в
// математической системе координат
int xsM = xM, ysM = HIGHT - yM; // Координаты центра
// прямоугольника на экране
int xwM = xsM - LU.x, ywM = ysM - LU.y; // xwM, ywM – координаты
// центра прямоугольника в окне
M = make_point(xwM, ywM); // Преобразование координат центра
// прямоугольника в оконные
gotoxy(M.x, M.y); // Перевод курсора в центр прямоугольника
}
# include <iostream.h>
void main()
{
point a, b; // Две точки
rect ab; // Прямоугольник
int x, y;
textbackground(BLACK);
clrscr(); // Очистка экрана
cout << "Введите координаты первой точки\n";
cin >> x >> y;
a = make_point(x, y); // Первая вершина прямоугольника
cout << "Введите координаты второй точки \n";
cin >> x >> y;
b = make_point(x, y); // Вторая вершина прямоугольника
ab = make_rect(a, b); // Создание прямоугольника
ab = canon_rect(ab); // Приведение к каноническому виду
show_rect(&ab, RED); // Изображение на экране
getch();
}
На рис. 37 приведено изображение экрана при работе с программой.
Рис.37. Прямоугольник на экране, созданный программой
Массивы структур
Структуры, как и любые другие переменные, можно объединять в массивы. Работу с массивами структур разберем на примере.
Напишем программу, которая читает входной поток и определяет число вхождений каждого ключевого слова языка Си в читаемый текст. Для хранения ключевых слов и счетчиков можно было бы создать два параллельных массива:
char *keyword[NKEYS];
int keycount[NKEYS];
Однако для более удобной работы лучше создать массив структур.