Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Разработка алгоритм решения
Структура программы Программа состоит из основной функцииmain() и семи вспомогательных функций. u byte GetSym(x1,y1) — функция читает символ с заданной позиции экрана дисплея. u byte GetAtr(x1,y1) — функция читает атрибут символа с заданной позиции экрана дисплея. u void PutSym(x1,y1,sym) — функция выводит на экран дисплея символ в заданную позицию (x1,y1). u void PutAtr(x1,y1,atr) — функция меняет на экране дисплея атрибут символа в заданной позиции (x1,y1). u void Invert(x1,y1) — функция инвертирует участок на экране размером (10х5), координаты (x1,y1) задают один из участков на экране. u void Change(x,y) — функция обменивает содержимое текущего участка с содержимым левого верхнего участка на экране. Координаты (x,y) задают положение текущего участка. u void RandText(void) — функция псевдослучайным образом перетасовывает все участки на экране. Описание переменных Переменные, глобальные для всей программы: u xk — координата X текущего участка; u yk — координата Y текущего участка; u Координаты участка задаются в пределах: X — [0..7],
Описание алгоритма программы Основная функция main()проверяет, был ли в командной строке дополнительный параметр. Если нет, программа не очищает старый экран. Если какой-нибудь параметр был, то экран очищается и выводится инструкция по управлению программой. Далее в основной программе выполняется бесконечный цикл, в котором обрабатываются коды нажатых клавиш и, в зависимости от них, вызываются вспомогательные функции. Выход из цикла — по клавише Esc. Функции GetSym(x1,y1), GetAtr(x1,y1) читают непосредственно из видеопамяти дисплея символ и атрибут соответственно. Функции PutSym(x1,y1,sym), PutAtr(x1,y1,atr) выводят непосредственно в видеопамять дисплея символ и атрибут соответственно. Во всех этих четырех функциях координаты задаются в квадрате 79х24 символов (нумерация начинается с нуля). Функция Invert(x1,y1) использует функции GetAtrи PutAtrдля инверсии прямоугольника экрана размером 10х5 по маске 0x7f, при этом независимо выполняется инверсия фона и цвета символа. Функция Change(x,y) обменивает содержимое текущего участка с содержимым левого верхнего участка путем последовательного побайтного обмену атрибутов и символов. Она использует функции GetSym, GetAtr, PutSym, PutAtr. Функция RandText(void) — псевдослучайным образом перетасовывает все участки на экране, при этом она в цикле увеличивает на единицу локальные в данной функции координаты текущего участка xk, yk и обращается к функции Change. Таким образом достигается эффект перемешивания. Функция работает, пока не будет нажата любая клавиша. Текст программы /*------Практическая работа N7-----------------*/ /*-----Управление видеоадаптером.---------------*/ #include <dos.h>
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> /*--------------Константы----------------------- */ #define VSEG 0xb800 /* Сегментный адрес видеопамяти */ #define byte unsigned char
#define word unsigned int #define Esc 27 #define Spase 32 #define Enter 13 #define Up 0x48 #define Down 0x50 #define Left 0x4b #define Right 0x4d #define Home 0x47 int xk,yk; /*----Чтение символа из видеопамяти-------------*/ byte GetSym(x1,y1) int x1,y1; { return(peekb(VSEG,y1*160+x1*2)); } /*---Чтение атрибута из видеопамяти-------------*/ byte GetAtr(x1,y1) int x1,y1; { return(peekb(VSEG,y1*160+x1*2+1)); } /*---Запись символа в видеопамять--------------*/ void PutSym(x1,y1,sym) int x1,y1; byte sym; { pokeb(VSEG,y1*160+x1*2,sym); } /*---Запись атрибута в видеопамять--------------*/ void PutAtr(x1,y1,atr) int x1,y1; byte atr; { pokeb(VSEG,y1*160+x1*2+1,atr); } /*--Инверсия квадрата на экране-----------------*/ void Invert(x1,y1) int x1,y1; { byte b; int i,j; for (j=0;j<5;j++) for (i=0;i<10;i++) { b=GetAtr(x1*10+i,y1*5+j); PutAtr(x1*10+i,y1*5+j,(b^0x7f)); } } /*--Замена текущего квадрата на левый верхний--*/ void Change(x,y) byte x,y; { int i,j; byte ba,bs; if ((x!=0)||(y!=0)) for (j=0;j<5;j++) for (i=0;i<10;i++) { bs=GetSym(x*10+i,y*5+j); ba=GetAtr(x*10+i,y*5+j); PutSym(x*10+i,y*5+j,GetSym(i,j)); PutAtr(x*10+i,y*5+j,GetAtr(i,j)); PutSym(i,j,bs); PutAtr(i,j,ba); } } /*--Перемешивание квадратов до нажатия клавиши-*/ void RandText(void) { Invert(xk,yk); xk=5; yk=1; while(!kbhit()) { Change(xk,yk); xk++; if (xk>7) xk=0; yk++; if (yk>4) yk=0; } Invert(xk,yk); } /*-----Начало основной программы---------------*/ main(int argn,char *argc[]) { int i;
xk=0; yk=0; if (argn>1){} else /* Если параметров нет, вывод инструкции */ { textattr(10); clrscr(); cprintf("---------------"); cprintf(" Практическая работа N7 "); cprintf("---------------"); cprintf("---------------"); cprintf(" Управление видеоадаптером. "); cprintf("---------------"); textattr(15); gotoxy(23,4);cprintf("Демонстрация работы с видеопамятью."); textattr(12); gotoxy(30,6);cprintf("<< М О З А И К А >>"); textattr(14); gotoxy(30,8);cprintf("Клавиши управления:"); gotoxy(7,10);cprintf("< Left, Right, Up, Down> — "); cprintf("управление выделенним квадратом."); gotoxy(7,11);cprintf("<Spase Bar> — Обмен содержимым "); cprintf("между выделенным квадратом"); gotoxy(7,12);cprintf(" и левым верхним"); cprintf(" квадратом."); gotoxy(7,13);cprintf("<Enter> — перемешивание квадратов"); cprintf(" до нажатия любой клавиши."); gotoxy(7,14);cprintf("<Esc> — вихiд."); textattr(11); gotoxy(28,16);cprintf("З А Д А Ч А И Г Р Ы :"); gotoxy(14,17);cprintf("Собрать при помощи клавиш "); cprintf("управления начальный экран."); textattr(12); gotoxy(27,19);cprintf("Ж е л а е м у с п е х а !"); textattr(7); gotoxy(1,21);cprintf("Примечание: При запуске с "); cprintf("параметром <->"); gotoxy(13,22);cprintf("начальным экраном для игры "); cprintf("является текущий."); } Invert(xk,yk); for(i=0;i==0;) switch(getch()) { /* Обработка нажатых клавиш */ case Esc: i++; break; case Enter:RandText();break; case Spase:Invert(xk,yk);
Change(xk,yk); Invert(xk,yk); break; case 0: switch (getch()) { case Left:Invert(xk,yk); xk--; if(xk<0) xk=7; Invert(xk,yk); break; case Right:Invert(xk,yk); xk++; if(xk>7) xk=0; Invert(xk,yk); break; case Up:Invert(xk,yk); yk--; if(yk<0) yk=4; Invert(xk,yk); break; case Down:Invert(xk,yk); yk++; if(yk>4) yk=0; Invert(xk,yk); break; } } Invert(xk,yk); } Результаты работы программы Результаты работы программы выводятся на экран терминала и меняются интерактивно. : Практическая работа №8. Цель работы Получение практических навыков в работе с Главной Загрузочной Записью жесткого диска. Постановка задачи Прочитать и выполнить форматный вывод на экран Главной Загрузочной Записи жесткого диска на своем рабочем месте. Порядок выполнения Порядок выполнения работы и содержание отчета определены в общих указаниях. Пример решения задачи Разработка алгоритма решения Программа состоит из основной программы main(), которая реализует все действия для чтения Главной Загрузочной Записи. Описание переменных Переменные в основной программе: u x, y — экpанные кооpдинаты; u head — номеp головки (0); u Sect_Trk — номеp доpожки и сектоpа (0,1); u ndrive=0 — номеp логического диска; u EndList — указатель на подпись. Кроме того, в программе есть такие структуры: u Структура элемента раздела: struct Part { byte ActFlag; /* признак активного раздела */ /* физический адрес начала раздела */ byte Begin_Hd; /* # головки */ word Begin_SecTrk; /* # сектора та дорожки */ byte SysCode; /* код системы */ /* физический адрес конца раздела */ byte End_Hd; /* # головки */ word End_SecTrk; /* # сектора и дорожки */ dword RelSec; /* # сектора початку */ dword Size; /* количество секторов */ }; Стpуктуpа главной загрузочной записи. struct MBR { char LoadCode[0x1be]; /* пpогpамма загрузки */ struct Part rt[4]; /* 4 элемента pазделов */ word EndFlag; /* подпись MBR */ }; |
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 229. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |