- •Директивы препроцессора
- •Определяющие директивы Символические константы
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
Void main(void)
{
int *arrow;
int x,y,RADIUS=30,maxy,step,size,maxx,r;
int graphdriver=DETECT,gmode,errorcode;
initgraph(&graphdriver,&gmode,"");
errorcode=graphresult();
if (errorcode != grOk)
{
printf("ОШИБКА ГРАФИКИ:%s\n",grapherrormsg(errorcode));
printf("нажмите клавишу\n");
getch();
exit(1);
}
maxy=getmaxy();
maxy=maxy/RADIUS*RADIUS;
maxx=getmaxx();
x=getmaxx()/2;
y=RADIUS;
r=80;
setcolor(RED);
setbkcolor(14);
circle(x,y,RADIUS); /* рисуем окружность */
setfillstyle(SOLID_FILL,RED); /* режим заполнения */
floodfill(x,y,RED); /* заполнение окружности */
/* определение размера сохраняемой области ( мячика ) */
size=imagesize(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);
arrow=malloc(size); /* выделение памяти */
/* сохраняем картинку мячика в памяти */
getimage(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS,arrow);
step=RADIUS;
cleardevice(); /* очистка страницы */
line(0,maxy+1,maxx,maxy+1); /* рисуем пол */
settextstyle(TRIPLEX_FONT,0,4); /* установка шрифта */
outtext("прыгает мячик"); /* вывод текста */
settextstyle(TRIPLEX_FONT,1,4);
outtextxy(5,100,"по полу");
while(! kbhit()) /* мячик прыгает сколько хотим */
{ /* или по концу движения */
sound(20000); /* сопровождается звуком */
/* вывод мячика в нужную точку */
putimage (x-RADIUS,y,arrow,XOR_PUT);
delay(125); /* временная задержка */
/* второй раз примененная функция с XOR_PUT
стирает выведенный образ */
putimage (x-RADIUS,y,arrow,XOR_PUT);
if(y>=maxy-2*RADIUS)
step=-RADIUS;
if(y<=r&&step<0) /* снижение верхнего уровня */
{ /* движения (затухание скачков) */
r+=50;
step=RADIUS;
}
y+=step;
if (r>=maxy) /* мяч остановился */
break;
nosound();
}
/* вывод изображения мяча на полу */
putimage (x-RADIUS,y-RADIUS,arrow,XOR_PUT);
getch();
free(arrow);
closegraph();
}
/* ЗАДАНИЕ
Нарисовать указанный рисунок в цветном изображении (с заполнением изображенных фигур), сохранить в памяти объект, очистить видеостраницу, имитировать движение объекта в указанных направлениях, сопровождая его горизонтальными и вертикальными надписями.
Вариант 1
Нарисовать дом. При нажатии определенных клавиш зажигается (гасится) свет, струится (или нет) дым из трубы.
Вариант 2
Изобразить на экране змейку, которая бегает по экрану.
Вариант 3
Шарик катится по полу от стенки к стенке пока не нажата клавиша.
Вариант 4
Нарисовать на экране песочные часы с сыплющимся песком. Когда последняя песчинка упадет, вывести надпись: прошло ххх секунд. Перевернуть песочные часы. Процесс продолжается, пока не нажата клавиша. Предоставить пользователю возможность установить часы в нужное место экрана перед тем, как начнется отсчет времени.
Вариант 5
Космический объект на звездном небе движется влево, вправо, вверх, вниз, по диагоналям.
Вариант 6
Нарисовать три параллелепипеда, заполненные различным образом. По желанию пользователя движение любого из них.
Вариант 7
Нарисовать три шарика и изобразить их движение на ветру.
Вариант 8
Нарисовать автомобиль, движение влево, вправо.
Вариант 9
Нарисовать дорогу, автомобиль (условно). Управлять движением автомобиля по дороге с учетом изгибов дороги.
Вариант 10
Нарисовать человечка и изобразить движение (например, машет руками).
/* ЛАБОРАТОРНАЯ РАБОТА 5 (PORT)
ФУНКЦИИ ВВОДА И ВЫВОДА ЧЕРЕЗ ПОРТЫ
Для связи с различными микросхемами ЭВМ микропроцессор использует прямые и косвенные обращения к памяти, порты ввода/вывода и сигналы прерывания.
Порты ввода/вывода - это двери, через которые информация поступает на устройства ввода/вывода или передается с них. Каждый порт идентифицируется 16-разрядным номером порта, который может меняться от 0 до 65535. Каждому устройству назначается свой определенный порт или порты. Процессор, задавая номер порта, посылает данные или управляющую информацию в конкретный порт, а порт отвечает, посылая назад процессору данные или информацию о состоянии. Запись в определенные порты может нарушить работу ЭВМ, однако, и чтение из порта может привести к неприятным последствиям. Программировать работу портов следует очень осторожно.
Функции ввода/вывода через порт
unsigned char inportb(int port); - прототип в dos.h.
Функция читает байт из порта ввода port - беззнаковое от 0 до 65535.
Void outportb(int port, unsigned char byte);
Функция записывает байт byte в порт вывода port.
Int bioscom(int cmd,char abyte,int port);- прототип в bios.h.
Функция предназначена для работы с последовательным каналом связи (адаптером RS232).
Int biosprint(int cmd, int abyte, int port);
Функция предназначена для работы с принтером, указанным параметром port.
Генерация звука
В качестве иллюстрации работы портов ввода/вывода рассмотрим работу порта 97, который управляет громкоговорителем через один из регистров контроллера 8255. Регистр может принять 8-разрядное число, которое помещается в двоичном коде. Каждый разряд числа рассматривается как переключатель ("включено" - "выключено") для соответствующего устройства или воздействия. Для того, чтобы включить громкоговоритель необходимо в нулевой и в первый разряд (отсчет справа налево) поместить 1, не изменяя при этом остальных разрядов. Это достигается с помощью поразрядной операции ИЛИ (|) или передачей в регистр числа 79. Прежде чем передать это число в регистр, необходимо запомнить прежнее его состояние, а после подачи звукового сигнала восстановить содержимое регистра. Следующая программа заставляет громкоговоритель подать сигнал определенной длительности.
Пример.
# include <stdio.h>
# include <dos.h>
