Методические указания для выполнения лабораторных работ и курсовой работы содержание

Вид материалаМетодические указания

Содержание


12Лабораторная работа № 11. Динамическое распределение памяти
2. Цель работы
3. Первый вариант списка заданий на выполнение работы
3. Второй вариант списка заданий на выполнение работы
4.Пояснения к выполнению работы
Вызов второго уровня меню
Подобный материал:
1   ...   4   5   6   7   8   9   10   11   12

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 г.