Реакция программы на нажатие конкретной клавиши



 

В следующем фрагменте выходим из цикла по нажатию клавиши Escape

#define ESC 27

while(1){

    if(kbhit()){

                  char c=getch();

if(c == 0)

{

        getch();

              continue;

}       

else if( c == ESC)

        break;

        }

    //работа цикла

}

 

Организация ввода числовой информации

 

В графических приложениях ввод текстовой и числовой информации реализуется также в графическом режиме. Для этого нельзя использовать функцию scanf, так как она предполагает текстовый режим.

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

#define ENTER 13

main(){

//инициализация графического режима

char c, buf[2], *str=(char *)malloc(1);

int number;

str[0] = ’\0’;

buf[1] = ‘\0’;

while( (c = getch()) != ENTER){

 if( c < ’0’ || c> ’9’)

              continue;

     buf[0] = c; // введенный символ оформляем в виде строки

     outtext(buf); // и выводим на экран в графическом режиме

 str = realloc(str, strlen(str) + 2);

     str[strlen(str) + 1] = ‘\0’;

     str[strlen(str)] = c; // запоминаем символ в памяти

}

sscanf(str, “%d”, &number);

}

Проверка выхода аргумента функции из ОДЗ

Проверку выхода переменной x из области допустимых значений функции f(x) можно реализовать в самом теле функции. В случае выхода из ОДЗ функция взводит глобальный флаг, который проверяется в вызывающей функции.

Например,

int flag=0; //глобальный флаг

// работаем с функцией y = x1/2

float f(float x){

if(x<0){

flag=1;

return 0;

}

 else{

flag=0;

return sqrt(x);

    }

}

void main(){

    float x, y;

    scanf(“%f”, &x);

    y=f(x);

    if(flag==1)

              printf(“Выход из ОДЗ. ”);

    else

printf(“Нет выхода из ОДЗ. Продолжаем вычисления”);

}

Графическая и математическая системы координат

Для рисования графика функции программисту удобнее использовать математическую систему координат (МСК), расположенную по центру экрана. Графические функции работают в графической системе координат (ГСК).

     
 


а                                        б

 

 

Рис. 1. Системы координат: а – математическая; б – графическая

 

Инициализируем переменные.

int maxx = getmaxx(),

 maxy = getmaxy(),

px = 30, // количество пикселей в одной математической единице по оси Ох

py = px * ((float)maxx/maxy); // количество пикселей в одной математической единице по оси Оy.

Соответствие между двумя системами координат представлено
ниже

 

Соответствие между МСК и ГСК

МСК ГСК
 (0, 0) ………………………………. (maxx / 2, maxy / 2)
(1, 0) ………………………………. (maxx / 2 + px, maxy / 2)
(0, 1) ………………………………. (maxx / 2, maxy / 2 – py)
(x, y) ….……………………………. (maxx / 2 + x px, maxy / 2 – y py)
(x, f(x)) ……………………………. (maxx / 2 + x px, maxy / 2 – f(x) py)

 

Реализуем масштабирование по оси координат Ох так, чтобы график функции y = f(x) на заданном отрезке [a, b] размещался по всей ширине экрана. Для этого найдем коэффициенты u и v линейного отображения g(x) = u x + v, при котором отрезок [a, b] переходит в отрезок [0, maxx]. Из системы линейных уравнений

 

u a + v = 0

u b + v = maxx

 

находим u = maxx / (b-a), v = -a maxx / (b-a). Тогда точке (x, f(x)) будет соответствовать пиксель

 

( (maxx / (b-a)) * x - a * maxx / (b-a) , maxy / 2 - f(x) * py)),

 

где px = maxx/(b-a). Затем график можно нарисовать с помощью цикла, в котором счетчик является вещественной математической переменной. Например:

 

for(float x = a; x <= b; x += (b-a) / maxx)

putpixel((maxx / (b-a)) * x - a * maxx / (b-a), maxy / 2- f(x) * py));

 

Данный цикл при больших a и b может оказаться бесконечным. Это возможно в случае, если шаг цикла (b-a) / maxx будет меньше расстояния между числом a и его ближайшим соседом справа для типа float.

 

Использование двух видеостраниц

 

Для рисования вращающейся звезды (см. задание 3.4) лучше использовать две видеостраницы.

 

int page=0;

for(double f = 0; f < 2 × M_PI-M_PI / 100; f += M_PI / 50) {

otrisovka(X0, Y0, R1, r2, fi0 + f, COLOR); /* рисуем новую звезду на активной странице, которая по умолчанию имеет нулевой номер*/

 setvisualpage(page); /* показываем изображение новой звезды*/

 page=abs(page-1); /* меняем номер страницы с 0 на 1 или наоборот*/

 setactivepage(page); /* меняем активную страницу*/

 otrisovka(X0, Y0, R1, r2, fi0 + f-M_PI / 50, getbkcolor()); /* стираем старую звезду на активной странице*/

 }

 


Дата добавления: 2019-07-17; просмотров: 193; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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