Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
17.03.2015
Размер:
289.79 Кб
Скачать

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>

Соседние файлы в папке Лаб по С и С++