Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Разработка алгоритм решения




Структура программы

Программа состоит из основной функции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],
Y — [0..4] .

 


Описание алгоритма программы

Основная функция 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...