Необходимо упомянуть еще две темы: объявления typedef и перечисляемые типы enum. При правильном использовании оба средства, typedef и enurn, упрощают текст программы.
Использование typedef
При помощи typedef вы можете связать новые типы данных с существующими. К примеру, в математической программе может возникнуть необходимость в использовании типов данных fixed, whole, real или complex.
Пример: создание двух новых типов
#include <stdio.h>
typedef int whole;
typedef float real;
int main (void)
{
whole wvalue=123;
real rvalue=5.6789;
/* Целое число */
printf("The whole number is %d.\n",wvaiue);
/* Вещественное число */
printf ("The real number is %f. \n", rvalue);
return (0) ;
}
Объявление typedef можно использовать для упрощения объявлений.
Пример:
struct stboat {
char sztype [iSTRING15 + iNULL_CHAR];
char szmodel[iSTRING15 + iNULL_CHAR];
char sztitle[iSTRING20 + iNULL_CHAR];
int iyear;
long int lmotor_hours;
float fsaleprice;
} stused_boat;
typedef struct {
char sztype [iSTRING15 + iNULL_CHAR];
char szmodel[iSTRING15 + iNULL_CHAR];
char sztitie[iSTRING20 + iNULL__CHAR];
int iyear;
long int lmotor_hours;
float fsaleprice;
} STBOAT;
Имеют место три главных отличия:
1. Исчезло необязательное поле тега. (Хотя поле тега вместе с typedef
можно использовать по-прежнему; просто оно избыточно.)
2. Поле тега stboat превратилось в новый тип STBOAT и располагается там, где традиционно описывалась структурная переменная.
3.Объявление переменной stused_boat теперь отсутствует.
Достоинство описаний typedef — в способе их использования. После приведенного описания по всей программе можно описывать переменные типа STBOAT при помощи более простой синтаксической конструкции:
STBOAT STused_boat;
Введение в графику borland C++
Второй режим, который может устанавливаться на экране IBM-совместимого компьютера, графический режим. Управление экраном в графическом режиме производится с помощью набора функций, прототипы которых находятся в заголовочном файле GRAPHICS.H. Там же объявлены константы и макросы. Файл GRAPHICS.H должен быть подключен с помощью директивы include препроцессора языка С ко всем модулям, использующим графические подпрограммы.
Все графические функции оперируют окнами. В терминологии Borland C++ окно называется viewport. Левый верхний угол окна имеет координаты (0, 0). По умолчанию графическое окно занимает весь экран.
Прежде чем использовать графические функции, необходимо установить видеоадаптер в графический режим. Для установки (инициализации) видеоадаптера служит функция initgraph(). Ее прототип -
void far initgraph(int far *driver, int far *mode, char far *path);
В состав графического пакета входят заголовочный файл GRAPHICS.H, библиотечный файл GRAPHICS.LIB, драйверы графических устройств (*.BGI) и символьные шрифты (*.CHR).
Функция initgraph() считывает в память соответствующий драйвер, устанавливает видеорежим, соответствующий аргументу mode, и определяет маршрут к директории, в которой находится соответствующий драйвер *-BGI. Если маршрут не указан, то предполагается, что этот файл расположен в текущей директории.
Заголовочный файл определяет макросы, соответствующие драйверам.
При использовании initgraph() можно указать или конкретный драйвер, или задать автоматическое определение (детектирование) типа видеоадаптера и выбора соответствующего драйвера уже во время выполнения программы (макрос DETECT). Это позволяет переносить без изменения программы на компьютеры с другими видеоадаптерами.
Чтобы выйти из графического режима и вернуться в текстовый режим, необходимо использовать функции
void far closegraph(void);
и
void far restorecrtmode(void);
Функция closegraph() используется, если программа дальше будет работать в текстовом режиме. Эта функция освобождает память, используемую графическими функциями, и устанавливает текстовый режим, который был до вызова функции initgraph(). Если программа завершает работу, то можно использовать функцию restorecrtmode(), которая устанавливает видеоадаптер в текстовый режим, который предшествовал первому вызову функции initgraph().
Установка цвета фона производится функцией
void far setbkcolor(int color);
а изменение палитры - функцией
void far setpalette(int index, int color);
причем эта функция неприменима для видеоадаптера CGA за исключением цвета фона, который всегда имеет index, равный нулю.
Графический экран представляет собой массив пикселей. Каждый пиксель соответствует одной точке на экране и может иметь свой цвет. Установить цвет пикселя в точке экрана с координатами (х, у) можно с помощью функции
void far putplxel(int x, int у, int color);
Основными "рисующими" функциями являются line() и circle(). Их прототипы -
void far line(int x, int у, int x1, int y1);
void far circle(int x, int y, int radius);
Функция line() чертит на экране прямую линию от точки с координатами (х, у) до точки с координатами (x1, y1) текущим цветом.
Функция circle() рисует на экране окружность с центром в точке с координатами (х, у) и радиусом radius (единица измерения - пиксель) также текущим цветом. По умолчанию текущий цвет устанавливается WHITE. Изменить текущий цвет, т. е. цвет, которым рисуются линии, можно обратившись к функции setcolor() с прототипом
координатами (х, у); moveto() перемещает текущую точку в точку с координатами
(x, y);
rectangle() рисует прямоугольник;
setaspectratio() изменяет коэффициент сжатия, установленный по
умолчанию;
setlinestyle() устанавливает ширину и стиль линии.
В качестве примера описания прототипа приведем прототип функции rectangle()
void far rectangle(int left.int top, int right, int bottom);
Для закрашивания (заполнения) замкнутого контура служит функция floodfill(), которая закрашивает область заданным цветом по заданному шаблону. Ее прототип -
void far floodfill(int x,int y, int bordecolor);
где х и у - координаты точки внутри контура,
bordecolor - цвет контура.
Цвет и шаблон заполнения устанавливаются функцией:
void far setfillstyle(int pattern,int color);
Есть также набор функций, которые чертят контур и закрашивают область внутри контура:
getfillpatern() - возвращает тип шаблона заполнения;
getfulsetting() - возвращает информацию о шаблоне и цвете
заполнения;
getlmesetting() - возвращает информацию о текущем стиле, толщине и
цвете линии;
getpixel() - сообщает о цвете пикселя в точке (х, у).
Создать графическое окно можно, используя функцию setviewport(). Ее прототип -
void far setviewport(int left, int top, int right, int bottom, int flag);
параметры left, top, right и bottom задают местоположение и размер окна в абсолютных координатах, т. е. координатах экрана. Параметр flag устанавливает режим выхода за границу окна. Если flag не нулевой, то происходит автоматическое прерывание выдачи при выходе за границу окна. В случае, когда flag равен нулю, может происходить вывод за границами окна. И в том и в другом случае ошибка не фиксируется.
Для работы с экраном, окнами и образами (image) служат следующие функции:
cleardevice() - очищает активную страницу;
setactivepage() - устанавливает номер активной страницы;
setvisualpage() - устанавливает номер видимой страницы;
cleanviewport() - очищает активное окно:
getviewsetting() - возвращает информацию об активном окне;
getimage() - записывает образ в заданный участок памяти:
imagesize() - определяет в байтах размер памяти, требуемый для
хранения
- информации о прямоугольной области экрана; putimage() - помещает на экране ранее записанный в память
образ.
Функция cleardevice() очищает весь экран, устанавливает текущей точкой левый верхний угол экрана, но оставляет неизменными все установки графического экрана: стиль линии, текущий цвет и т. д.
Функция cleanviewportO очищает текущее окно и устанавливает текущую точку в левый верхний угол окна.
В зависимости от типа видеоадаптера и установленного видеорежима система может иметь от одной до четырех буферных страниц. Каждая из страниц может быть указана как активная, в которую происходит вывод, и визуальная (видимая), которая отображается на экране. Если они совпадают, то каждый вывод будет тут же отображаться на экране. По умолчанию активная и визуальная страницы совпадают.
Для создания движения образа по заданному шаблону на экране служат функции getimage(), imagesize() и putimage(); с помощью функции getimage() взять часть экранного образа, вызвать imagesize() для определения размера памяти, необходимой для хранения этого образа, а затем вернуть его на экран в любую желаемую позицию с помощью функции putimage().
Для осуществления вывода текста в графическом режиме на экран используются функции
outtext() - выводит строку на экран с текущей позиции; outtextxy() - выводит строку на экран с заданной позиции;
settextjustify() - устанавливает режим выравнивания текста;
setusercharsize() - устанавливает шрифт, стиль и коэффициент увеличения
текста;
textheight() - возвращает высоту строки в пикселях;
textwith() - возвращает ширину строки в пикселях.
Во время работы программы могут возникать ошибки при выполнении графических операций. Например, указан недопустимый тип видеоадаптера. Для обработки ошибок, чтобы избежать аварийного прекращения работы программы, служат функции
graphresult() - возвращает код ошибки выполнения для последней
графической операции;
grapherrormsg() - возвращает строку с сообщением об ошибке, по заданному
коду ошибка.
Если ошибка произошла при вызове графической библиотечной функции (например, не задан шрифт, запрошенный функцией settextstyle()) устанавливается внутренний код ошибки. Функция graphresult() возвратит код ошибки, а вызов функции grapherrormsg(graphresult()) выдаст сообщение об ошибке. Приведем фрагмент программы, использующей рекомендуемый способ инициализации графического режима:
void main ( )
{/* Запрос автоопределения максимально возможного режима работы видеоадаптера*/