Обработка набора данных в динамической памяти компьютера
Содержание
Введение
.
Описание программного комплекса
.1
Главная программа GLAV
.2
Модуль меню MENU
.3
Модуль создания файла с данными SOZDANYE
.4
Модуль создания набора данных OPEN
.5
Модуль вывода VIVOD
.6
Модуль добавления данных в конец DOBAVLEN
.7
Модуль поиска POISK
.8
Модуль DOZAP
.9
Модуль V_DR_ND
.
Проверка программы на контрольном примере
.1
Запуск главной программы GLAV
.2
Запуск модуля создания файла с данными SOZDANYE
.3
Запуск модуля вывода VIVOD
.4
Запуск модуля добавления данных в конец DOBAVLEN
.5
Запуск модуля поиска POISK
.6
Запуск модуля DOZAP
.7
Запуск модуля V_DR_ND и переход к другому НД
Заключение
Список
использованных источников
Приложение
Введение
Основной целью данного курсового проекта
является обработка набора данных в динамической памяти компьютера. Была создана
программа, которая создает набор данных в динамической памяти и позволяет
корректировать его. Набор данных представляет собой массив указателей, каждый
из элементов которого внесен в динамическую память при помощи константы типа
запись из файла на внешнем носителе.
Запись (комбинированный тип) - составной тип,
который служит для представления совокупности разнородных данных. Записи
напоминают по структуре массивы: они составлены из ряда отдельных компонент,
однако если компоненты массива должны принадлежать одному типу, записи могут
содержать компоненты разных типов.
Для работы с динамическими программными
объектами используется ссылочный тип или тип указателей. В переменной
ссылочного типа хранится ссылка на программный объект (адрес объекта).
Указатель может находиться в состояниях:
1
Содержать
адрес какой-либо переменной, память под которую уже выделена.
2
Содержать
специальный пустой адрес Nil.
Программа реализована с использованием модулей,
в каждом из которых описана процедура.
Процедура - подпрограмма, которая вызывается
специальным оператором из основной программы и после своего выполнения
возвращает одно или несколько значений.
Из вызывающей программы в процедуру передается
список формальных параметров. Между списками формальных и фактических
параметров должны быть установлены соответствия по количеству, порядку
следования и по типу. Модуль - отдельно хранимая и независимо компилируемая
единица. Представляет собой совокупность программных ресурсов, предназначенных
для использования другими модулями и программами.
Перечень запросов:
3
Создание
набора данных (НД).
4
Добавление
новых элементов в конец НД.
5
Просмотр
всех элементов НД.
6
Поиск
элемента по номеру.
7
Переход
к работе с другим НД.
8
Добавление
всех элементов в конец другого НД.
9
Добавление
содержимого другого НД в конец текущего.
Множество данных - картины на выставке.
·
автор
(string);
·
название
(string);
·
стоимость
(longint);
·
вид:
живопись, графика, эскиз, другое (перечислимый тип).
1. Описание программного комплекса
1.1 Главная
программа GLAV
Данная программа является основной. Она вызывает
все модули, используемые для реализации запросов. Здесь с использованием модуля
MYMUNY.TPU выводится меню, в котором можно выбрать дальнейшее действие над
набором данных. Кроме меню на экран выводится текущий элемент. Перечисление
используемых модулей
uses
crt,menu,sozdanye,poisk,vivod,dobavlen,dozap,v_dr_nd,open;
var a:masmenu;
pos,x,y,x1,y1,n:byte;
i,pozn,l:integer;
u:char;
put:string;
flag:boolean;
{Вывод текущего элемента}
{Формирование меню}
vertmenu(a,n,x,y,pos);
textbackground(black);
textcolor(white);
{Выбор пункта меню}
end.
1.2 Модуль
меню MENU
В данном модуле содержится меню. При вызове
процедуры vertmenu, описанной в модуле, основной программой на экране
появляется меню.
unit menu;
interface
uses crt,sozdanye,open;
type masmenu=array[1..25] of string[50];
procedure vertmenu(a:masmenu;n,x,y:byte;var
pos:byte);
{Описание процедуры}
procedure vertmenu;
begin
{Прорисовка окна с меню}
{Выбор пункта клавишами}
end;.
1.3 Модуль
создания файла с данными SOZDANYE
Этот модуль содержит процедуру sozd, которая
создает файл с данными путем последовательного ввода данных. Файл создается по
адресу, который также указывается пользователем. Модуль SOZDANYE содержит в
себе описание всех основных типов, используемых в дальнейшем всеми модулями.
Это тип zap - запись с вариантами, тип mas - массив указателей и тип vid -
пользовательский тип.
unit sozdanye;
{описание основных типов}
type
vid=(jiv,graf,ask,oth);
uk=^zap;
zap=record
avt:string[20];
nazv:string[20];
stoim:longint;
case kart:vid of
jiv:(j:string[10]);
graf:(g:string[10]);
ask:(a:string[10]);
oth:(o:string[10]);
end;
mas=array[1..200] of uk;
var nd1,nd2:file of zap;
{Описание процедуры}
procedure sozd;
{Открытие файла}
{Ввод данных}
{Запись в файл}
end .
1.4 Модуль
создания набора данных OPEN
Модуль OPEN создает набор данных в динамической
памяти компьютера. Содержит единственную процедуру vvod, которая после
выполнения возвращает 2 набора данных в динамической памяти (переменные nd1,
nd2)и 2 счетчика (n1, n2), которые показывают, сколько элементов содержится в
каждом наборе данных. Также в этом модуле описываются такие переменные как nd,
raz. Эти переменные служат для указания набора данных, с которым идет работа, и
его размера (nd и raz соответственно). Переменные vs и nvs указывают второй
набор данных, с которым работа пока не ведется. Все эти переменные являются
глобальными и используются во всех модулях. По умолчанию первый набор данных
является текущим.
unit open;
{Описание констант и глобальных переменных}
uses crt,sozdanye;
const put1='NABOR1.dat';
put2='NABOR2.dat';
var nd,nd1,nd2,vs:mas;
n1,n2,raz,nvs:integer;
z1,z2:zap;
f1,f2:file of zap;
procedure vvod(var nd1,nd2:mas;var n1,n2:integer);
{Описание процедуры}
procedure vvod;
{Чтение из файла и вывод в динамическую память}
end;.
1.5 Модуль
вывода VIVOD
Включает в себя процедуру viv, формальными
параметрами которой являются массив указателей и счетчик количества элементов
массива. После вызова этой процедуры программой на экране выводится таблица с
данными.
unit vivod;
uses crt,sozdanye;
procedure viv(nd:mas;raz:integer);
{Описание процедуры}
procedure viv;
begin
{Формирование таблицы} .
1.6 Модуль
добавления данных в конец DOBAVLEN
динамический память программный
модуль
Этот модуль предназначен для добавления данных в
конец текущего набора. Процедура dob подразумевает ввод данных пользователем и
после вызова программой возвращает обновленный набор данных и его размер.
unit dobavlen;
uses crt,sozdanye;
procedure dob(var nd:mas;var raz:integer);
{Описание процедуры}
procedure dob;
var key:char;
nz:zap;
k,x,y,id:byte;
b:masmenu;
begin
{Ввод новых данных}
{Запись данных в конец массива} .
1.7 Модуль поиска POISK
Этот модуль предназначен для поиска данных по
номеру. Содержит процедуру р, которая выполняет поиск по введенному номеру .
unit poisk;
uses crt,sozdanye;
procedure p(nd:mas;nom,raz:integer);
{Описание процедуры}
procedure p;
begin
{Проверка номера на попадание}
{Вывод элементов под введенным номером}
end;.
1.8
Модуль DOZAP
Модуль DOZAP предназначен для записи содержимого
другого набора данных в конец текущего. За это отвечает процедура copy,
параметрами которой являются второй нерабочий массив и его номер, а возвращается
текущий дополненный набор данных и новый размер.
unit dozap;
uses crt,sozdanye;
procedure copy(vs:mas;nvs:integer;var nd:mas;var
raz:integer);
{Описание процедуры}
procedure copy;
begin
{Запись в текущий НД}
end;.
1.9
Модуль V_DR_ND
Содержит процедуру copy2, предназначенную для
записи содержимого текущего набора данных в конец нерабочего. Принцип работы и
параметры схожи с copy.
unit v_dr_nd;
uses crt,sozdanye;
procedure copy2(nd:mas;raz:integer;var
vs:mas;var nvs:integer);
{Описание процедуры}
procedure copy2;
begin
{Запись в другой НД}
end;.
2. Проверка программы на контрольном примере
2.1
Запуск главной программы GLAV
При открытии программы, выводится
меню (модуль MENU) и текущий элемент (рисунок 2.1). Наборы данных автоматически
созданы при помощи модуля OPEN.
Рисунок 2.1 - Запуск главной программы
2.2
Запуск модуля создания файла с данными SOZDANYE
При выборе в меню пункта «Создание НД»
происходит создание файла(рисунок 2.2). Необходимо вводить данные.
Рисунок 2.2 - Запуск модуля создания файла с
данными SOZDANYE
2.3 Запуск модуля вывода VIVOD
При выборе в меню «Просмотр данных» на экран
будет выведена таблица с данными (рисунок 2.3).
Рисунок 2.3 - Запуск модуля вывода VIVOD
2.4
Запуск модуля добавления данных в конец DOBAVLEN
Пункт меню «Добавить данные» вызывает процедуру
модуля DOBAVLEN, с помощь которой можно добавить новые данные в конец текущего
массива. Добавление данных представлено на рисунке 2.4.1, а новый набор данных
- на рисунке 2.4.2.
Рисунок 2.4.1 - Запуск модуля вывода добавления
данных в конец DOBAVLEN (добавление)
Рисунок 2.4.2 - Запуск модуля вывода добавления
данных в конец DOBAVLEN (новый НД)
2.5
Запуск модуля поиска POISK
При выборе пункта меню «Поиск по номеру»
вызывает модуль поиска, который выводит на экран и делает текущими данные,
которые располагаются под указанным номером (рисунок 2.5).
Рисунок 2.5 - Запуск модуля поиска POISK
2.6
Запуск модуля DOZAP
Пункт меню «Копирование из другого НД» вызывает
модуль DOZAP, который копирует данные из другого открытого массива в текущий и
выводит на экран новый получившийся массив (рисунок 2.6).
Рисунок 2.6 - Запуск модуля DOZAP
2.7
Запуск модуля V_DR_ND и переход к другому НД
При выборе пункта меню «Копировать в другой НД»
модуль V_DR_ND осуществляет копирование из текущего массива в другой и выводит
результат на экран (рисунок 2.7.1).
Для перехода к другому набору данных нужно
выбрать пункт «Другой НД». Этот переход осуществляется операторами, которые
меняют местами текущий и другой массивы. В результате в главном меню меняется
текущий элемент (2.7.2).
Рисунок 2.7.1 - Запуск модуля V_DR_ND
Рисунок 2.7.2 - Переход к другому НД
Заключение
Программа копирует данные из файла в массив
указателей. Для этого используется переменная комбинированного типа, на котором
основан тип указателей. После этого данные можно редактировать.
Программа позволяет создать другие файлы с
данными.
Из массива указателей данные можно выводить на
экран в виде таблицы. Данные можно дописать в другой набор данных или наоборот,
дописать в текущий массив данные из другого.
Программа позволяет отслеживать текущий элемент,
осуществлять поиск по номеру элементов.
Программы позволяет добавлять новые данные в
конец массива, после завершения ввода полученный массив выводится на экран.
Данная программа справилась со всеми запросами и
реализовала различные варианты работы с массивом указателей.
Список использованных источников
1
Зуев,
Е. А. Программирование на языке Turbo Pascal 6.0,7.0,/ Е. А. Зуев//
М.:Веста,Радио и связь, 1993. - 376с.
2
Свободная
энциклопедия ВикипедиЯ [Электронный ресурс]. - 2012. - Режим доступа:
http://ru.wikipedia.org. - Дата доступа: 07.05.2012.
3
Pascaler
[Электронный ресурс]. - 2012. - Режим доступа: http://pascaler.ru. - Дата
доступа: 07.05.2012.
4
Каталог
картин [Электронный ресурс]. - 2012. - Режим доступа: http://catalog-kartin.ru.
- Дата доступа: 07.05.2012.
Приложение
ПРОГРАММНЫЙ КОД МОДУЛЕЙ
Главная программа GLAV
program glav;
uses
crt,menu,sozdanye,poisk,vivod,dobavlen,dozap,v_dr_nd,open;
var a:masmenu;
pos,x,y,x1,y1,n:byte;
i,pozn,l:integer;
u:char;
put:string;
flag:boolean;
vvod(nd1,nd2,n1,n2);
clrscr;
x:=1;
y:=10;
n:=7;
l:=1;
put:=put1;
raz:=n1;
nd:=nd1;
vs:=nd2;
nvs:=n2;
flag:=true;
repeat
a[1]:='создание НД';
a[2]:='добавление данных';
a[3]:='просмотр данных';
a[4]:='поиск по номеру';
a[5]:='копирование из другого НД';
a[6]:='копирование в другой НД';
a[7]:='другой НД';
clrscr;
{Вывод текущего элемента}
writeln('Текущий элемент:');
if l<=raz then
with nd[l]^ do
begin
write('автор - ');
writeln(avt);
write('название - ');
writeln(nazv);
write('стоимость - ');
writeln(stoim);
write('вид - ');
case kart of
jiv:writeln(j);
graf:writeln(g);
ask:writeln(a);
oth:writeln(o)
end;
end
{end with}
else
with nd[raz-1]^ do
begin
write('автор - ');
writeln(avt);
write('название - ');
writeln(nazv);
write('стоимость - ');
writeln(stoim);
write('вид - ');
case kart of
jiv:writeln(j);
graf:writeln(g);
ask:writeln(a);
oth:writeln(o)
end;
end;
{end with}
{Формирование меню}
vertmenu(a,n,x,y,pos);
textbackground(black);
textcolor(white);
clrscr;
window(1,1,80,25);
case pos of
1:sozd;
2:begin
clrscr;
dob(nd,raz);
if flag then
begin
n1:=raz;
nd1:=nd;
end
else
begin
n2:=raz;
nd2:=nd;
end;
{end if}
viv(nd,raz);
end;
3:begin
clrscr;
viv(nd,raz);
end;
4:begin
clrscr;
writeln('введите номер картины:');
readln(l);
p(nd,l,raz);
end;
5:begin
copy(vs,nvs,nd,raz);
if flag then
begin
nd1:=nd;
n1:=raz;
end
else
begin
nd2:=nd;
n2:=raz;
end;
{end if}
viv(nd,raz);
end;
6:begin
copy2(nd,raz,vs,nvs);
if flag then
begin
nd2:=vs;
n2:=nvs
end
else
begin
nd1:=vs;
n1:=nvs
end;
{end if}
viv(vs,nvs);
7:if flag then
begin
nd:=nd2;
raz:=n2;
vs:=nd1;
nvs:=n1;
l:=1;
flag:=false
end
else
begin
nd:=nd1;
raz:=n1;
vs:=nd2;
nvs:=n2;
flag:=true;
l:=1;
end;
{end if flag}
end;
writeln('нажмите Esc для выхода или любую
клавишу');
u:=readkey;
until u=#27;.
Модуль меню MENU
unit menu;
uses crt,sozdanye,open;
type masmenu=array[1..25] of string[50];
procedure vertmenu(a:masmenu;n,x,y:byte;var
pos:byte);
procedure vertmenu;
var i,j,x1,y1,p,max:byte;
key:char;
begin
if (x<0) or (x>80) or (y<0) or
(y>25) then
begin
writeln('верхний угол не попадает в границы
экрана');
exit
end;
{end if (x<0) or (x>80) or (y<0) or
(y>25)}
max:=length(a[1]);
for i:=2 to n do
if max<length(a[i]) then
max:=length(a[i]);
{end if max<length(a[i])}
{end for i:=2 to n}
for i:=1 to n do
for j:=length(a[i]) to max do
a[i]:=a[i]+' ';
{end for j:=length(a[i]) to max}
{end for i:=1 to n}
x1:=x+max;
y1:=y+n;
if (x1<0) or (x1>80) or (y1<0) or
(y1>25) then
begin
writeln('нижний угол не попадает в границы
экрана');
exit
end;
{end if (x1<0) or (x1>80) or (y1<0) or
(y1>25)}
window(x,y,x1,y1);
textbackground(white);
textcolor(green);
asm
mov ah,$01
mov ch,$20
mov cl,$00
int $10
end;
for i:=1 to n do
begin
gotoxy(1,i);
write(a[i])
end;
{end for i:=1 to n}
gotoxy(1,1);
textbackground(red);
textcolor(white);
write(a[1]);
pos:=1;
repeat
p:=pos;
key:=readkey;
if key=#0 then
key:=readkey;
{end if key=#0}
case key of
#27:begin
pos:=0;
break
end;
#13:break;
#72:begin
pos:=pos-1;
if pos=0 then
pos:=n;
{end if pos=0}
end;
#80:begin
pos:=pos+1;
if pos=n+1 then
pos:=1;
{end if pos=n+1}
end;
end;
gotoxy(1,p);
textbackground(white);
textcolor(green);
write(a[p]);
gotoxy(1,pos);
textbackground(red);
textcolor(white);
write(a[pos]);
until false;
asm
mov ah,$01
mov ch,$06
mov cl,$07
int $10
end;
end;.
Модуль создания файла с данными SOZDANYE
sozdanye;
uses crt;
{описание основных типов}
type
vid=(jiv,graf,ask,oth);
uk=^zap;
zap=record
avt:string[20];
nazv:string[20];
stoim:longint;
case kart:vid of
jiv:(j:string[10]);
graf:(g:string[10]);
ask:(a:string[10]);
oth:(o:string[10]);
end;
mas=array[1..200] of uk;
var nd1,nd2:file of zap;
procedure sozd;
procedure sozd;
var zapis:zap;
ind:byte;
key:char;
put:string;
f:file of zap;
begin
clrscr;
{Открытие файла}
writeln('введите путь к файлу:');
readln(put);
assign(f,put);
rewrite(f);
repeat
with zapis do
begin
writeln('введите ФИО автора картины');
readln(avt);
writeln('введите название картины:');
readln(nazv);
writeln('введите стоимость картины:');
readln(stoim);
writeln('введите:');
writeln('1 если живопись');
writeln('2 если графика');
writeln('3 если эскиз');
writeln('4 если другое');
readln(ind);
case ind of
1:kart:=jiv;
2:kart:=graf;
3:kart:=ask;
4:kart:=oth;
end;
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое'
end;
end;
{end with zapis}
{Запись в файл}
write(f,zapis);
writeln('нажмите Esc для выхода или любую
клавишу');
key:=readkey;
until key=#27;
end;.
Модуль создания набора данных OPEN
open;
uses crt,sozdanye;
const put1='NABOR1.dat';
put2='NABOR2.dat';
var nd,nd1,nd2,vs:mas;
n1,n2,raz,nvs:integer;
z1,z2:zap;
f1,f2:file of zap;
procedure vvod(var nd1,nd2:mas;var
n1,n2:integer);
implementation
procedure vvod;
begin
assign(f1,put1);
reset(f1);
n1:=1;
n2:=1;
{Чтение из файла и вывод в динамическую память}
repeat
read(f1,z1);
new(nd1[n1]);
nd1[n1]^.avt:=z1.avt;
nd1[n1]^.nazv:=z1.nazv;
nd1[n1]^.stoim:=z1.stoim;
nd1[n1]^.kart:=z1.kart;
with nd1[n1]^ do
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое';
end;
{end with nd1[n1]^}
inc(n1);
until eof(f1);
close(f1);
assign(f2,put2);
reset(f2);
repeat
read(f2,z2);
new(nd2[n2]);
nd2[n2]^.avt:=z2.avt;
nd2[n2]^.nazv:=z2.nazv;
nd2[n2]^.stoim:=z2.stoim;
nd1[n2]^.kart:=z2.kart;
with nd2[n2]^ do
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое';
end;
{end with nd2[n2]^}
inc(n2);
until eof(f2);
close(f2);
end;.
Модуль вывода VIVOD
vivod;
uses crt,sozdanye;
procedure viv(nd:mas;raz:integer);
procedure viv;
var i:integer;
z:zap;
begin
{Формирование таблицы}
i:=0;
write('┌────┬');
writeln('─────────┬──────────┬──────────┐');
write('│ # │ ФИО автора │');
writeln(' Название│ Стоимость│ Вид│');
while i<>(raz-1) do
begin
inc(i);
write('├───┼────────────────────┼');
writeln('─────────┼──────────┼──────────┤');
z.avt:=nd[i]^.avt;
z.nazv:=nd[i]^.nazv;
z.stoim:=nd[i]^.stoim;
z.kart:=nd[i]^.kart;
case z.kart of
jiv:z.j:='живопись';
graf:z.g:='графика';
ask:z.a:='эскиз';
oth:z.o:='другое'
end;
with z do
begin
write('│',i:3,'│',avt:20,'│',nazv:20,'│',stoim:10,'│');
case kart of
jiv:writeln(j:10,'│');
graf:writeln(g:10,'│');
ask:writeln(a:10,'│');
oth:writeln(o:10,'│');
end;
end;
{end with z}
end;
{end while i<>(raz-1)}
write('└───┴────────────────────┴');
writeln('───┴──────────┴──────────┘');
end;.
Модуль добавления данных в конец DOBAVLEN
dobavlen;
uses crt,sozdanye;
procedure dob(var nd:mas;var raz:integer);
procedure dob;
var key:char;
nz:zap;
k,x,y,id:byte;
b:masmenu;
begin
k:=4;
x:=1;
y:=10;
b[1]:='живопись';
b[2]:='графика';
b[3]:='эскиз';
b[4]:='другое';
repeat
with nz do
begin
writeln('введите ФИО автора картины');
readln(avt);
writeln('введите название картины:');
readln(nazv);
writeln('введите стоимость картины:');
readln(stoim);
vertmenu(b,k,x,y,id);
textbackground(black);
window(1,1,80,25);
clrscr;
case id of
1:kart:=jiv;
2:kart:=graf;
3:kart:=ask;
4:kart:=oth;
end;
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое'
end;
end;
{end with}
new(nd[raz]);
nd[raz]^:=nz;
inc(raz);
writeln('нажмите Esc для выхода или любую
клавишу');
key:=readkey;
until key=#27;
end;.
Модуль поиска POISK
poisk;
uses crt,sozdanye;
procedure p(nd:mas;nom,raz:integer);
procedure p;
begin
if nom>=raz then
writeln('номер пуст')
else
with nd[nom]^ do
begin
writeln('название картины - ',nazv);
writeln('стоимость картины - ',stoim);
write('вид - ');
case kart of
jiv:writeln(j);
graf:writeln(g);
ask:writeln(a);
oth:writeln(o);
end;
end;
{end with};
{end if}
end;.
Модуль DOZAP
dozap;
uses crt,sozdanye;
procedure copy(vs:mas;nvs:integer;var nd:mas;var
raz:integer);
procedure copy;
var putcopy:string;
j,q,h:integer;
begin
j:=1;
{Запись в текущий НД}
repeat
new(nd[raz]);
nd[raz]^:=vs[j]^;
with nd[raz]^ do
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое';
end;
{end with}
inc(j);
inc(raz);
until j=nvs;
writeln('скопировано');
end;.
Модуль V_DR_ND
unit v_dr_nd;
uses crt,sozdanye;
procedure copy2(nd:mas;raz:integer;var
vs:mas;var nvs:integer);
procedure copy2;
var j:integer;
begin
j:=1;
{Запись в другой НД}
repeat
new(vs[nvs]);
vs[nvs]^:=nd[j]^;
with vs[nvs]^ do
case kart of
jiv:j:='живопись';
graf:g:='графика';
ask:a:='эскиз';
oth:o:='другое';
end;
{end with}
inc(j);
inc(nvs);
until j=raz;
writeln('скопировано');
end;.