Автор работы: Пользователь скрыл имя, 29 Мая 2010 в 18:53, Не определен
база данных на pascal с функциями писка, добавления и т.д.
Подводя итог можно сказать, что фактически перемещение происходит в стеке, а на экран выводится лишь товар с кодом товара из вершины стека.
Полностью описывать весь алгоритм данных процедур в данном разделе не будем, затронем только те их части, которые взаимодействуют непосредственно со списком.
При работе со списком используются следующие функции:
Объект данных обладает динамической структурой, если его размер изменяется в процессе выполнения программы или он потенциально бесконечен.
Статические и динамические переменные в Паскале
В Паскале одной из задач описания типов является то, чтобы зафиксировать на время выполнения программы размер значений, а, следовательно, и размер выделяемой области памяти для них. Описанные таким образом переменные называются статическими.
Все
переменные, объявленные в программе,
размещаются в одной
Однако порой заранее не известны не только размеры значений, но и сам факт существования значения той или иной переменной. Для результата переменной приходится отводить память в расчете на самое большое значение, что приводит к нерациональному использованию памяти. Особенно это затруднительно при обработке больших массивов данных.
Выходом
из положения может служить
Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК.
ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Например, при разработке САПР статическое распределение памяти невозможно, т.к. размерность математических моделей в разных проектах может значительно различаться.
И статические и динамические переменные вызываются по их адресам. Без адреса не получить доступа к нужной ячейке памяти, но при использовании статических переменных, адрес непосредственно не указывается. Обращение осуществляется по имени. Компилятор размещает переменные в памяти и подставляет нужные адреса в коды команд.
Адресация динамических переменных осуществляется через указатели. Их значения определяют адрес объекта.
Для работы с динамическими переменными в программе должны быть выполнены следующие действия:
Программист должен сам резервировать место, определять значение указателей, освобождать ДП.
Вместо любой статической переменной можно использовать динамическую, но без реальной необходимости этого делать не стоит.
В данном разделе указатель перемещается на последний элемент и считывается хранящийся там код элемента. Далее, с этим кодом элемента происходит либо, какое то сравнение, условие, либо присваивается некоторой переменной, либо удаляется код из списка.
Добавление кода элемента в список происходит по следующему алгоритму:
Поиск осуществляется по следующему алгоритму:
Удаления кода элемента из списка выполняется по следующему алгоритму:
Последовательность операций с данными заключается в следующем (приложение 5 схема 1):
Для реализации выше перечисленных функций использовались следующие процедуры.
Программа отвечает на то, какую клавишу нажал пользователь и передает управление процедуре main. Процедура readkey используется в основном блоке программы. Для работы с управляющими клавишами используются их коды в таблице ISCII. Тут:
80 – курсор вверх
72 – курсор вниз
27 – ESC
13 – Enter
При нажатии на клавишу «Ввод» управление передается продцедуре main. При этом используются глобальные переменные.
В процедуре main управление переходит к подпрограмме, согласно текущему меню, но порой надо знать откуда был осуществлен вход. Как я уже говорил, зайти в меню выбора таблиц можно по разному. Все меню имеют разные заголовки, которые и используются для их идентификации. При нажатии на кнопку «Выход», текущем становится первоначальное меню.
Интерфейсная часть программы состоит из трех процедур:
procedure menus(m:pered;max:byte); {Вывод меню}
begin
clrscr;
if i=1 then begin
textcolor(1); gotoxy(9,2); write(m.st[i]);
end
else begin
if i=2 then textcolor(9)
else textcolor(3);
gotoxy(8,i+3);write(m.st[i]);
end;
end;
end;
С помощью этой процедуры на экране меняются меню. Нужно учесть, что мы первоначально знаем, из сколки строк состоит каждое меню, что упрощает задачу. Заголовок и содержание меню пишутся разными цветами. Изменение цвета выводимых символов идет с помощью команды textcolor, параметром котором является предопределенная константа.
Следующая процедура:
procedure krutis; {Звездочка рядом с активным элементом}
begin
textcolor(14);
if kr='/' then kr:='-'
else if kr='-' then kr:='\'
else if kr='\' then kr:='|'
else kr:='/';
gotoxy(6,tek+3);write(kr);
textcolor(3);
end;
Эта процедура работает таким образом – обращение к ней идет из основного блока программы, в котором стоит бесконечный цикл. На экране отображается что то похожее на бенгальский огонь. Это достигается путем последовательного вывода на одном и том же месте символов: \, |, /, —. В переменной tek у нас содержится номер активной строки, а относительно нее мы и должны поставить звездочку.
Следующая процедура:
procedure ramka(ch:char); {перемещение указателя}
begin
gotoxy(6,tek+3);Writeln(' ');
textcolor(3);gotoxy(8,tek+3);
if ch='+' then tek:=tek+1
else tek:=tek-1;
if tek=1 then tek:=nast.m
else if tek=nast.m+1 then tek:=2;
key:=#0;
textcolor(9);gotoxy(8,tek+3);
krutis;
end;
Данная процедура имеет параметр символьного типа. По содержанию ch определяется – вверх или вниз сдвинулась активная строка. Обращение к этой процедуре идет из основного блока программы. Больше процедур такого рода нет (ко всем другим процедурам обращение идет из процедуры main).
Эта процедура затирает элемент, который был активен перед этим цветом по умолчанию (голубым) и стирает предыдущее положение звездочки. После этого исходя из значения ch изменяется значение tek и выделяется элемент, на который был осуществлен переход. В подпрограмме вставлены два условия:
if tek=1 then tek:=nast.m
else if tek=nast.m+1 then tek:=2;
Они срабатывают когда активным является верхний элемент меню и пользователь нажал кнопку вверх, тогда текущей становится последняя строка, и наоборот – текущая строка является последней, а пользователь нажал кнопку вниз, тогда активной станет первая строка активного меню.
Следующая процедура - obrabotka(iz,t:integer; var rab:cc). Эта процедура вызывается при корректировке записей. Через параметр iz процедура выбирает путь дальнейшего хода. То есть надо ли добавить запись, изменить или удалить. Параметр rab – это таблица, которая передается в процедуру, и параметр var показывает, что данную таблицу можно изменять непосредственно из процедуры.
В ней используются локальные переменные –
dlud:string;
bis:boolean;
tems,temr,tem:cc;
Здесь все переменные типа cc – временные, dlud служит для ввода данных, а bis показывает, выполнимо ли выбранное действие или нет.
Продцедура sort(iz,t:integer; var rab:cc) осуществляет сортировку записей в выбранной таблице по выбранному полю. Ее работа и параметры с переменными аналогичны предыдущей процедуре.
При
запросах выполняется процедура zapros(num:integer),
где через параметр num передается,
какой именно запрос должен выполняться.
Потом через условие case идет обработка
запросов. Связь между таблицами осуществляется
по уникальным полям.