Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Обработка ошибок в графическом режиме

Поиск
Функция Назначение функции
grapherrormsg() Возвращает строку с сообщением об ошибке для заданного кода ошибки
graphresult() Возвращает код ошибки для последней графической операции, в которой встретилась ошибка

 

Функции запроса состояния

 

Функция Назначение функции
getdrivername() Возвращает имя текущего графического драйвера
getgraphmode() Возвращает текущий графический режим
getlinesettings() Возвращает текущие стиль, шаблон и толщину линии
getmaxx() Возвращает текущее разрешение по оси x
getmaxy() Возвращает текущее разрешение по оси y
getpixel() Возвращает цвет пикселя в (x,y)
getx() Возвращает координату x текущей позиции (CP)
gety() Возвращает координату y текущей позиции (CP)

 

Пример. Окружность радиусом 100 пикселей перемещается от левого края экрана к правому с шагом 10 пикселей, изменяя при этом цвет случайным образом.

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

void main()

{

/* описание переменных для графического режима с автоопределением параметров */

int graphdriver = DETECT, gmode, errorcode;

int x, maxx, midy, color;

int radius = 100;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode!= grOk) /* если ошибка */

{

printf("Ошибка: %s\n", grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midy = getmaxy() / 2; /* определение середины экрана по вертикали */

maxx = getmaxx(); /* определение количества пикселей по горизонтали */

for (x= radius; x <= maxx - radius; x+=10)

{

color = random(getmaxcolor()); /* задание случайного значения цвета */

setcolor(color);

/* рисование окружности */

circle(x, midy, radius);

delay(700); /* Задержка выполнения программы на 0,7 сек. */

}

closegraph(); /* закрытие графического режима */

}

Пример использования графических функций приведен в приложении Г (пример №8).

Директивы препроцессора

 

Директивы препроцессора представляют собой инструкции, записанные в тексте программы на С, и выполняемые до трансляции программы. Директивы препроцессора позволяют изменить текст программы, например, заменить некоторые лексемы в тексте, вставить текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся.

 

Директива #include

Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:

#include "имя файла" #include <имя файла>

Имя файла должно соответствовать соглашениям операционной системы и может состоять либо только из имени файла, либо из имени файла с предшествующим ему маршрутом. Если имя файла указано в кавычках, то поиск файла осуществляется в соответствии с заданным маршрутом, а при его отсутствии в текущем каталоге. Если имя файла задано в угловых скобках, то поиск файла производится в стандартных директориях операционной системы, задаваемых командой PATH.

Директива #include может быть вложенной, т.е. во включаемом файле тоже может содержаться директива #include, которая замещается после включения файла, содержащего эту директиву.

Директива #include широко используется для включения в программу так называемых заголовочных файлов, содержащих прототипы библиотечных функций, и поэтому большинство программ на С начинаются с этой директивы.

Наиболее часто используемые в программах директивы #include следующие:

# include <stdio.h> /* Включение файла с описанием функций ввода-вывода */

# include <math.h> /* Включение файла с описанием математических функций */

# include <conio.h> /* Включение файла с описанием функций управления консолью*/

 

Директива #define

Директива #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, причем макроопределения могут иметь аргументы.

Директива #define имеет две синтаксические формы:

#define идентификатор текст #define идентификатор (список параметров) текст

Эта директива заменяет все последующие вхождения идентификатора на текст. Такой процесс называется макроподстановкой. Текст может представлять собой любой фрагмент программы на СИ, а также может и отсутствовать. В последнем случае все экземпляры идентификатора удаляются из программы.

Пример:

#define WIDTH 80 #define LENGTH (WIDTH+10)

Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.

Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 150, а не 630.

Во второй синтаксической форме в директиве #define имеется список формальных параметров, который может содержать один или несколько идентификаторов, разделенных запятыми. Формальные параметры в тексте макроопределения отмечают позиции, на которые должны быть подставлены фактические аргументы макровызова. Каждый формальный параметр может появиться в тексте макроопределения несколько раз.

При макровызове вслед за идентификатором записывается список фактических аргументов, количество которых должно совпадать с количеством формальных параметров.

Пример: #define MAX(x,y) ((x)>(y))?(x):(y) Эта директива заменит фрагмент t=MAX(i,s[i]); на фрагмент t=((i)>(s[i])?(i):(s[i]);

Как и в предыдущем примере, круглые скобки, в которые заключены формальные параметры макроопределения, позволяют избежать ошибок связанных с неправильным порядком выполнения операций, если фактические аргументы являются выражениями.

Например, при наличии скобок фрагмент t=MAX(i&j,s[i]||j);будет заменен на фрагмент t=((i&j)>(s[i]||j)?(i&j):(s[i]||j);а при отсутствии скобок - на фрагмент t=(i&j>s[i]||j)?i&j:s[i]||j;в котором условное выражение вычисляется в совершенно другом порядке.

 

Директива #undef

Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор

Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.

Пример:

#undef WIDTH #undef MAX

Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.

 

 



Поделиться:


Последнее изменение этой страницы: 2016-12-17; просмотров: 285; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.34.209 (0.007 с.)