Методические указания для выполнения лабораторных работ и курсовой работы содержание
Вид материала | Методические указания |
- Методические указания по выполнению курсовых работ для студентов заочной формы обучения, 300.18kb.
- Рабочая программа, методические указания по выполнению курсовой работы, темы курсовых, 1694.43kb.
- Методические указания по выполнению курсовой работы Составитель Виничук, 2013.82kb.
- Методические указания для выполнения курсовой работы по дисциплине «Макроэкономика», 976.03kb.
- Методические указания к выполнению лабораторных работ по дисциплине «Интеллектуальные, 653.36kb.
- Методические указания для выполнения курсовой работы по дисциплине: «Метрология, стандартизация, 170.43kb.
- Методические указания для выполнения курсовой работы по дисциплине «Теория принятия, 547.84kb.
- Методические указания для ее выполнения по дисциплине «финансы» 2008-2009 уч. Год (для, 247.31kb.
- Методические указания по содержанию и организации выполнения курсовой работы по дисциплине, 1445.93kb.
- Петроченко Любовь Викторовна Учебно методические указания, 199.16kb.
12Лабораторная работа № 11. Динамическое распределение памяти
1. Общие понятия
Динамическое распределение памяти - это метод распределения оперативной памяти, при котором она выделяется по запросу задачи или управляющей программы. В языках высокого уровня, как правило, этот метод реализуется при помощи специальных операторов или директив.
Динамическое распределение памяти часто применяется при организации всевозможных меню или заставок, а также для организации динамических структур данных, объем которых в этом случае может в процессе задачи увеличиваться до объема "кучи".
2. Цель работы
Целью работы является отработка приемов и навыков работы с динамической памятью, необходимыми, в частности, для выполнения остальных лабораторных работ. Работа должна быть выполнена на языке Турбо Паскаль или С++. Первый вариант списка заданий предназначен для выполнения работы на Турбо Паскале. Второй вариант списка заданий рекомендуется при выполнении работы на языке С++.
3. Первый вариант списка заданий на выполнение работы
Во всех представленных ниже вариантах выполнения лабораторной работы на языке Турбо Паскаль требуется две порции информации прямо с экрана дисплея заслать в различные области динамической памяти и организовать вызов этих порций на экран дисплея нажатием специальных клавиш. При этом первая порция должна представлять собой набор прямоугольных рамок, который создается при помощи псевдографики; вторая порция- набор записей. Число и расположение рамок, а также число и формат записей определяется конкретным вариантом задания.
1. Первая порция информации должна состоять из четырех рамок в левой части экрана; вторая порция информации должна состоять из трех записей с восемью полями.
2. Первая порция информации должна состоять из четырех рамок в правой части экрана; вторая порция информации должна состоять из четырех записей с семью полями.
3. Первая порция информации должна состоять из двух рамок в левой части экрана и двух рамок в правой части экрана ; вторая порция информации должна состоять из пяти записей с шестью полями.
4. Первая порция информации должна состоять из двух рамок в левой части экрана и одной рамки в правой части экрана ; вторая порция информации должна состоять из шести записей с пятью полями.
5. Первая порция информации должна состоять из двух рамок в правой части экрана и одной рамки в левой части экрана ; вторая порция информации должна состоять из семи записей с семью полями .
6. Первая порция информации должна состоять из трех рамок в левой части экрана и одной рамки в правой части экрана; вторая порция информации должна состоять из семи записей с пятью полями.
7. Первая порция информации должна состоять из трех рамок в правой части экрана и двух рамок в левой части экрана ; вторая порция информации должна состоять из восьми записей с пятью полями.
8. Первая порция информации должна состоять из трех рамок в правой части экрана и одной рамки в левой части экрана ; вторая порция информации должна состоять из семи записей с шестью полями.
9. Первая порция информации должна состоять из двух рамок в левой части экрана и трех рамок в правой части экрана ; вторая порция информации должна состоять из пяти записей с восемью полями.
10. Первая порция информации должна состоять из пяти рамок в левой части экрана; вторая порция информации должна состоять из трех записей с девятью полями.
11. Первая порция информации должна состоять из пяти рамок в правой части экрана; вторая порция информации должна состоять из четырех записей с девятью полями.
12. Первая порция информации должна состоять из трех рамок, расположенных на главной диагонали; вторая порция информации должна состоять из пяти записей с восемью полями.
13. Первая порция информации должна состоять из четырех рамок, расположенных на главной диагонали; вторая порция информации должна состоять из шести записей с восемью полями.
14. Первая порция информации должна состоять из трех рамок, расположенных на побочной диагонали; вторая порция информации должна состоять из пяти записей с пятью полями.
15. Первая порция информации должна состоять из четырех рамок, расположенных на побочной диагонали; вторая порция информации должна состоять из шести записей с шестью полями.
16. Первая порция информации должна состоять из шести рамок в правой части экрана; вторая порция информации должна состоять из пяти записей с девятью полями.
17. Первая порция информации должна состоять из пяти рамок, расположенных на главной диагонали; вторая порция информации должна состоять из шести записей с восемью полями.
18. Первая порция информации должна состоять из пяти рамок, расположенных на главной диагонали; вторая порция информации должна состоять из шести записей с девятью полями.
19. Первая порция информации должна состоять из четырех рамок, расположенных на побочной диагонали; вторая порция информации должна состоять из шести записей с пятью полями.
20. Первая порция информации должна состоять из пяти рамок, расположенных на побочной диагонали; вторая порция информации должна состоять из семи записей с шестью полями.
Примечание. Любой из вышеприведенных вариантов может быть выполнен либо в упрощенном варианте, либо в усложненном. В первом случае первая и вторая порция информации являются независимыми. Во втором случае - они связаны: рамки используются как окна для ввода записей.
3. Второй вариант списка заданий на выполнение работы
Во всех нижеперечисленных заданиях требуется:
-средствами псевдографики подготовить на экране дисплея исходное заданное изображение;
-заданную часть этого изображения сохранить в динамической памяти и затем эту часть снова воспроизвести на экране дисплея.
Второй пункт задания следует выполнить в двух вариантах: в первом варианте сохранение и восстановление части экрана осуществить с помощью прерывания int86; во втором варианте, для осуществления этой же процедуры требуется использовать прямой доступ к видео памяти. При этом необходимо сравнить эти варианты по времени исполнения указанных процедур (см. Прил. 2).
В нижеперечисленных вариантах исходное изображение одно и тоже и представляет собой в каждой четверти экрана две прямоугольные рамки, одна из которой вложена в другую(всего восемь рамок). Отличие между вариантами заключается в различных секторах, которые необходимо сохранить и восстановить(х0 и у0-координаты центра экрана):
1. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: х-х0=0 и х-х0=у-у0, х<х0 и у>у0.
2. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: у-у0=0 и х-х0=-(у-у0), х<х0 и у>у0.
3. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: у-у0=0 и х-х0=у-у0, х<х0 и у<у0.
4. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: х-х0=0 и х-х0=у-у0 , х<х0 и у<у0.
5. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: х-х0=0 и х-х0=у-у0 , х>х0 и у<у0.
6. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: у-у0=0 и х-х0=у-у0 , х>х0 и у<у0.
7. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: у-у0=0 и х-х0=у-у0 , х>х0 и у>у0.
8. Сохраняемый сектор ограничен следующими двумя исходящими из центра экрана лучами: х-х0=0 и х-х0=у-у0 , х>х0 и у>у0.
9. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 3.
10. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 3.
11. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 5.
12. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 7.
13. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 2 и 4.
14. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 2 и 6.
15. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 4 и 8.
16. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 4.
17. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 2 и 7.
18. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 2 и 5.
19. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 3 и 6.
20. Сохраняемая область представляет собой совокупность двух секторов, обозначенных в вариантах 1 и 8.
4.Пояснения к выполнению работы
Рекомендуется перед выполнением своего варианта лабораторной работы разобраться с приведенными в Приложениях решениями задач по данной тематике.
Все три примера, первый из которых приведен на языке Паскаль, а два вторых - на С++, имеют следующие общие составные части :
процедуру, которая, используя псевдографику ,позволяет получать на экране дисплея простые изображения;
процедуру, отсылающую полученное изображение в динамическую память;
процедуру, дающую возможность возвратить на экран сохраненную в динамической памяти информацию, например по нажатию специальной клавиши.
Реализация первой процедуры не составляет труда, требуя лишь знания кодов псевдографики.
Вторая процедура в первом и третьем приложении решена прямой пересылкой информации из видеопамяти в заранее подготовленную область динамической памяти (кучи). Подготовка указанной области памяти на обоих языках происходит с помощью специальных операторов. Нужно помнить при этом, что в конце программы с помощью также специальных операторов следует освобождать занятую динамическую память, так как в противном случае происходит "засорение" кучи. Во втором приложении перекачка информации из видеопамяти в динамическую память происходит с помощью системного прерывания int86 через специальные регистры. В этом случае предварительно бронировать область кучи нет необходимости.
Реализация возврата информации в видеопамять также организована как прямой пересылкой (первое и третье приложение), так и через прерывание int86 (второе приложение). Подключение системного датчика времени во втором и третьем приложение позволяет оценить и сравнить быстродействие двух способов перекачки информации.
ПРИЛОЖЕНИЕ 1
Пример программы на Турбо Паскале
Пусть требуется построить меню, имеющее окна ввода и окна вывода, каждое из которых имеет свое оригинальное имя, а фрейм имеет общий заголовок. Пусть это меню с экрана должно быть переписано в область динамической памяти, после чего пять раз с задержкой в две секунды должно вызываться из динамической памяти на экран дисплея. Программа, позволяющая решить эту задачу, приведена ниже.
program sistema;
uses crt;
type
aa =record {координаты активного окна}
x,y:byte;
end;
name=string[20];
typemenu=record {для объекта меню }
nameframe:name; {имя фрейма}
kol1,kol2:byte; {окна ввода,окна выбора}
list:array[1..12]of name; {список имен окон}
aktiv:aa; {координаты активного окна}
nlong:array[0..12]of byte; {длины каждого окна}
old_menu:0..14; {cтаршее меню}
end;
menu=array[1..15] of typemenu;
var schir,dl,x,y:byte;
m:menu;
{*************************************************************
создание
**************************************************************}
procedure create;
forward;
{*************************************************************
процедуры формирования рам для меню
*************************************************************}
procedure pp(i:integer;b:byte); {рисует символ}
begin
if b=0 then write(chr(i)) else writeln(chr(i));
end;
procedure lin (schir:integer); {pисует горизонтали}
var
i:byte;
begin
for i:=1 to schir-2 do
pp(196,0);
end;
procedure rama(schir,dl,x,y:byte); {рисует раму}
var i:byte;
begin
gotoxy(x,y);
pp(218,0);
lin(schir);
pp(191,0);
for i:=1 to dl-1 do
begin
gotoxy(x,y+i);
pp(179,0);
gotoxy(x+schir-1,y+i);
pp(179,1);
end;
gotoxy(x,y+dl);
pp(192,0);
gotoxy(x+1,dl+y);
lin(schir);
gotoxy(x+schir-1,y+dl);
pp(217,0);
gotoxy(x+2,y+1);
end;
{******************************************************************
ВЫХОД
******************************************************************}
procedure bye;
begin
clrscr;
rama(60,16,10,4);
rama(30,8,25,8);
gotoxy(33,11);
writeln('РАБОТА ОКОНЧЕНА');
gotoxy(33,14);
writeln('ВСЕГО ХОРОШЕГО !');
delay(2000);
clrscr;
end;{procedure bye}
{*********************************************************************
построение меню
***********************************************************************}
procedure obj_menu(me:typemenu);
var
x1,x2,s,y,l,k,xxx:byte;
begin
clrscr;
with me,aktiv do
begin
if nameframe <> ' ' then {печать заголовка}
begin
rama(nlong[0]+2,2,27,1);
write(nameframe);
end;
x2:=30;
if (kol1=0)and(kol2<=6) then x1:=30 {pассчет расположения меню}
else
begin
x1:=10;
x2:=50;
end;
xxx:=x1;
for k:=1 to kol2 do {печать окон выбора}
begin
if k=7 then
begin
s:=4;
xxx:=x2;
end
else
if k<7 then
s:=wherey+18 div kol2
else
begin
s:=wherey+18 div (kol2-6);
xxx:=x2;
end;
if k=1 then s:=4;
rama(nlong[k]+2,2,xxx,s);
write(list[k]);
end;
for k:=1 to kol1 do {печать окон ввода}
begin
s:=wherey+18 div kol1;
if k=1 then s:=5;
gotoxy(x2-15,s);
write(list[k+kol2]);
rama(nlong[k+kol2]+2,2,x2,wherey-1);
end;
gotoxy(x,y);
end;
end;
{********************************************************************
инициализация меню
********************************************************************}
procedure init_menu(n,a,b,c,d,e,f,g,h,k,j:name;ko1,ko2,k0,k1,k2,xx,yy,mm:byte;
var m:typemenu);
var i:byte;
begin
with m,aktiv do
begin
nameframe:=n;
list[1]:=a;
list[2]:=b;
list[3]:=c;
list[4]:=d;
list[5]:=e;
list[6]:=f;
list[7]:=g;
list[8]:=h;
list[9]:=k;
list[10]:=j;
old_menu:=mm;
kol1:=ko1;
kol2:=ko2;
nlong[0]:=k0;
if kol2<7 then
for i:=1 to kol2 do
nlong[i]:=k2;
if kol2>6 then
begin
for i:=1 to 6 do
nlong[i]:=k2;
for i:=7 to kol2 do
nlong[i]:=k1;
end;
for i:=1+kol2 to kol1+kol2 do
nlong[i]:=k1;
for i:=kol1+kol2+1 to 11 do
nlong[i]:=0;
x:=xx;
y:=yy;
end;
end; {init_menu}
{******************************************************
отмечает выбранный объект
*********************************************************}
procedure choice1(var me:typemenu);
var
ch:char;
nn:integer;
begin
With me,aktiv do
begin
repeat
ch:=readkey;
if ch=#9 then
case kol1 of
0: case kol2 of
1..6:
if (wherey<=5+(KOL2-1)*(18 div kol2)) then
gotoxy(32,wherey+18 div kol2+1)
else gotoxy(32,5);
7..11: begin
case wherex of
12: begin
if (wherey in[5..19]) then
gotoxy(12,wherey+3)
else
if (wherey >=20) then
gotoxy(52,5);
end;
52: if (wherey>=5+(KOL2-7)*(18 div (kol2-6)+1) )then
gotoxy(12,5)
else
gotoxy(52,wherey+18 div (kol2-6)+1);
end;
end;
end;
1..6 : case wherex of
12: if (wherey<=5+(KOL2-1)*(18 div kol2)) then
gotoxy(12,wherey+18 div kol2+1)
else gotoxy(52,5);
52: if (wherey>=5+(KOL1-1)*(18 div (kol1)) )then
gotoxy(12,5)
else
gotoxy(52,wherey+18 div (kol1));
end;
end;
until ch=' ';
x:=wherex;
y:=wherey;
end;
end; {choice}
{*****************************************************************
ВЫЗОВ ВТОРОГО УРОВНЯ МЕНЮ
*****************************************************************}
procedure call(var me:typemenu);
begin
with me ,aktiv do
begin
case y of
5..10: begin
create;
end ;
{ 15:begin
help;
obj_menu(me);
choice1(me);
call(me);
end;
} 10..20:begin
clrscr;
bye;
Halt;
end;
end;
end;
end;
{*****************************************************************
БУФЕР
*****************************************************************}
procedure buf;
const
size=4000;
var
p,screen,sc:pointer;
I:BYTE;
begin
getmem(p,size);
screen:=ptr($B800,0);
move(screen,p,size);
if(readkey=' ') then
begin
clrscr;
{ readln;}
FOR i:=1 to 5 do
begin
clrscr;
DELAY(2000);
move(p,screen,size);
DELAY(2000);
end;
{ readln;}
freemem(p,size);
end;
end;
{****************************************************
построение меню
******************************************************}
procedure create;
var
me: typemenu;
ifr:name;
na:array[1..11]of name;
kl1,kl2,df,lon,i:byte;
begin
clrscr;
writeln('введите число окон ввода(0..5)');
readln(kl1);
writeln('введите число окон выбора','(0..5',')');
readln(kl2);
writeln('введите длину окон ');
readln(lon);
writeln('введите длину рамки фрейма');
readln(df);
writeln('введите имя фрейма');
readln(ifr);
writeln('введите имена окон выбора');
for i:=1 to kl2 do
begin
write(i:1,'окно ');
readln(na[i]);
end;
writeln('введите имена окон ввода');
for i:= kl2+1 to kl1+kl2 do
begin
write(i-kl2:1,'окно ');
readln(na[i]);
end;
for i:=kl1+kl2+1 to 11 do
begin
na[i]:=' ';
end;
init_menu(ifr,na[1],na[2],na[3],na[4],na[5],na[6],na[7],na[8]
,na[9],na[10],kl1,kl2,df,lon,lon,0,0,1,me);
obj_menu(me);
{ choice1(me); }
{********** буфер}
gotoxy(5,23);
write('в первый раз нажмите - пробел');
buf;
with me do
begin
obj_menu(m[old_menu]);
gotoxy(5,23);
write('выбор - ТАВ ; активизация- пробел ');
choice1(m[old_menu]);
call(m[old_menu]);
end;
end;
{*******программа********}
begin
clrscr;
init_menu(' ','coздать меню','конец работы',
' ',' ',' ',' ',' ',' ',' ',' ',0,2,0,0,14,32,5,0,m[1]);
obj_menu(m[1]);
gotoxy(5,23);
write('выбор - ТАВ ; активизация- пробел ');
choice1(m[1]);
call(m[1]);
end.
ПРИЛОЖЕНИЕ 2
Пример програмимы на С++
Пусть требуется изобразить на экране ряд, вложенных друг в друга прямоугольных рамок. После этого первую четверть экрана сохранить в динамической памяти и затем восстановить.
Ниже приведены две программы, реализующие решение этих задач на С++.
В первой программе для сохранения и восстановления информации используется
прерывание int86; во второй-прямой доступ к видеопамяти. Встроенный в программы таймер позволяет зафиксировать убедительное преимущество второго способа.
Программа на основе прерывания int86
--------------------------------------
//================================**
// ** динамическая память **
// **=============================**
#include
#include
#include
#include
#include
#include
void draw_border(int startx,int starty,int endx,int endy);
void save_video(int startx,int starty,int endx,int endy,unsigned char *buf_ptr);
void restore_video(int startx,int starty,int endx,int endy,unsigned char *buf_ptr);
void goto_xy(int x,int y);
void main()
{
int h,l;
float time_beg,time_end,t_be;
register int i;
unsigned char *buf_ptr,*buf;
clrscr();
h=-1; l=-5;
for(i=0;i<6;i++){
h=h+1; l=l+5;
draw_border(1+h,2+l,23-h,79-l);
}
buf_ptr=(unsigned char *)malloc(50*80);
buf=buf_ptr;
time_beg=clock()/CLK_TCK; // включение таймера в программу
save_video(0,0,12,40,buf_ptr);
clrscr();
buf_ptr=buf;
restore_video(0,0,12,40,buf_ptr);
free(buf_ptr);
time_end=clock()/CLK_TCK; // выключение таймера из программы
t_be=(time_end-time_beg)*1000.;
goto_xy(20,40);
printf(" Искомое время = %f mc",t_be);
}
//****************************************************************
// Вычерчивание прямоугольной рамки
//****************************************************************
void draw_border(startx,starty,endx,endy)
int startx,starty,endx,endy;
{
register int i;
for(i=startx+1;i
goto_xy(i,starty);
putchar(179);
goto_xy(i,endy);
putchar(179);
}
for(i=starty+1;i
goto_xy(startx,i);
putchar(196);
goto_xy(endx,i);
putchar(196);
}
goto_xy(startx,starty); putchar(218);
goto_xy(startx,endy); putchar(191);
goto_xy(endx,starty); putchar(192);
goto_xy(endx,endy); putchar(217);
}
//****************************************************************
// Сохранение части экрана
//****************************************************************
void save_video(startx,starty,endx,endy,buf_ptr)
int startx,starty ,endx,endy;
unsigned char *buf_ptr;
{
union REGS r;
register int i,j;
for(i=starty;i
for(j=startx;j
goto_xy(j,i);
r.h.ah=8; // функция чтения символа
r.h.bh=0; // видео страница
*buf_ptr=int86(0x10,&r,&r);
buf_ptr=buf_ptr+4;
putchar(' '); // очистка экрана
}
}
//****************************************************************
// Восстановление части экрана
//***************************************************************
void restore_video(startx,starty,endx,endy,buf_ptr)
int startx,starty,endx,endy;
unsigned char *buf_ptr;
{
union REGS r;
register int i,j;
for(i=starty;i
for(j=startx;j
goto_xy(j,i);
r.h.ah=9; // функция записи символа
r.h.bh=0; // видео страница
r.x.cx=1; // Число повторений символа
r.h.al=*buf_ptr; // Символ
buf_ptr=buf_ptr+2;
r.h.bl=15/* *buf_ptr*/ ; // Атрибут
*buf_ptr=int86(0x10,&r,&r);
buf_ptr=buf_ptr+2;
}
}
//***************************************************************
// управление курсором
//*************************************************************
void goto_xy(x,y)
int x,y;
{
union REGS r;
r.h.ah=2; //функция установки курсора
r.h.dl=y; //координата колонки
r.h.dh=x; //координата строки
r.h.bh=0; //видео страница
int86(0x10,&r,&r);
}
// Программа на основе прямого обращения к видео памяти
//----------------------------------------------------
//================================
// динамическая память
//================================
#include
#include
#include
#include
/* #include
#include
#include
void draw_border(int startx,int starty,int endx,int endy);
void save_video(int startx,int starty,int endx,int endy,unsigned int *buf_ptr);
void restore_video(int startx,int starty,int endx,int endy,unsigned int *buf_ptr);
void goto_xy(int x,int y);
char *vid_mem;
void main()
{
int h,l;
float time_beg,time_end;
float t_be;
register int i;
unsigned int *buf_ptr,*buf;
clrscr();
h=-1; l=-5;
for(i=0;i<6;i++){
h=h+1; l=l+5;
draw_border(1+h,2+l,23-h,79-l);
}
buf_ptr=(unsigned int *)malloc(50*80);
buf=buf_ptr;
vid_mem=(char *)0xB8000000;
time_beg= clock()/CLK_TCK;
save_video(0,0,12,40,buf_ptr);
clrscr();
buf_ptr=buf;
restore_video(0,0,12,40,buf_ptr);
free(buf_ptr);
time_end=clock()/CLK_TCK;
t_be=(time_end-time_beg)*1000.;
goto_xy(20,50);
printf(" Искомое время = %f мс",t_be);
}
//****************************************************************
// Вычерчивание прямоугольной рамки
//**************************************************************
void draw_border(startx,starty,endx,endy)
int startx,starty,endx,endy;
{
register int i;
for(i=startx+1;i
goto_xy(i,starty);
putchar(179);
goto_xy(i,endy);
putchar(179);
}
for(i=starty+1;i
goto_xy(startx,i);
putchar(196);
goto_xy(endx,i);
putchar(196);
}
goto_xy(startx,starty); putchar(218);
goto_xy(startx,endy); putchar(191);
goto_xy(endx,starty); putchar(192);
goto_xy(endx,endy); putchar(217);
}
//****************************************************************
// Сохранение части экрана
//****************************************************************
void save_video(startx,starty,endx,endy,buf_ptr)
int startx,starty ,endx,endy;
unsigned int *buf_ptr;
{
register int i,j;
char *v, *t;
v=vid_mem;
for(i=starty;i
for(j=startx;j
t = v+(j*160) + i*2 ; // вычисляем адрес
*buf_ptr++= *t++ ; // чтение символа
*buf_ptr++= *t ; // чтение атрибута
*(t-1) = (' '); // очистка экрана
}
}
// ***************************************************************
// Восстановление части экрана
//***************************************************************
void restore_video(startx,starty,endx,endy,buf_ptr)
int startx,starty ,endx,endy;
unsigned int *buf_ptr;
{
register int i,j;
char *v, *t;
v=vid_mem;
t=v;
for(i=starty;i
for(j=startx;j
v=t;
v = t+(j*160) + i*2 ; /* вычисляем адрес */
*v++ = *buf_ptr++; /* запись символа */
*v = *buf_ptr++; /* запись атрибута */
}
}
//****************************************************************
// Управление курсора
//***************************************************************
void goto_xy(x,y)
int x,y;
{
union REGS r;
r.h.ah=2; // функция установки курсора
r.h.dl=y; // координата колонки
r.h.dh=x; // координата строки
r.h.bh=0; // видео страница
int86(0x10,&r,&r);
}
Литература
1.Бьерн Страуструп. Язык программирования С++. Невский проспект. СПб.1999 г.
2.Уильям Топп,Уильям Форд. Структуры данных в С++. Бином. М. 1999г.
3.Т. Кормен, Ч.Лейзерсон, Р. Ривест. Алгоритмы: построеие и анализ. МЦНМО. М. 2000.
4.Й. Ленгсам, М. Огенстайн, А. Тененбаум Структуры данных для персональных ЭВМ. Мир, М. 1989 г.
5. Никлаус Вирт. Алгоритмы и структуры данных.Невский диалект
СЛб, 2001 г.
6.А. И. Касаткин. Профессиональное программирование на языке Си. Системное программирование. Выш. шк.,Мн. 1993 г.
7>7>