Автоматизация работы с базами данных
Разработка программы средствами Turbo Pascal для автоматизации процесса работы с небольшими базами данных. Состав используемого аппаратного обеспечения. Общая схема структуры языка программирования Паскаля и приемы процедурного программирования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 09.03.2011 |
Размер файла | 61,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Таблица 1. Вводимы данные
Fio |
num |
|
Иванов Иван |
50 |
|
Сидоров Сидор |
33 |
|
Петров Петр |
100 |
|
Иванова Иванна |
25 |
|
Сидорова Сидора |
44 |
|
Петрова Петра |
75 |
|
Баночкин Федор |
77 |
Размещено на http://www.allbest.ru/
Рис. 5. Двоичное дерево поиска, полученное в результате ввода указанных данных
По результатам ввода было построено следующее дерево (о структуре дерево можно судить по порядку последующего считывания из файла при повторном запуске программы).
6. Текст программы
Пользовательский модуль - файл Trees.pas
{Модуль работы с двоичным деревом поиска - динамической структурой}
Unit trees;
{Интерфейсная часть модуля - описание объектов, доступных
для программы, к которой подключается модуль}
INTERFACE
Uses
Crt; {подключение библиотеки Crt для работы с консолью}
Type
{Описание типа компоненты дерева и указателя на компоненту
стандартное описание для динамических структур}
pTree = ^Tree; {указатель на компоненту}
Tree = record {описание компоненты с полями:}
fio : string[40]; {ФИО}
num : word; {табельный номер}
pol : char; {пол}
dat : string[10]; {дата рождение}
dol : string[40]; {должность}
left, right : pTree {указатели на поддеревья}
end; {размер - SizeOf(Tree) = 111 Bt}
{Описание типа компоненты типизированного файла полностью
соответствует структуре компоненты дерева за исключением
указателей на поддеревья для связи в структуре}
CompF = record
fio : string[40];
num : word;
pol : char;
dat : string[10];
dol : string[40];
end;
{подпрограммы, доступные из модуля}
Procedure print(v : pTree);
Procedure add(var x : CompF; var p : pTree);
Procedure del(x : word; var p : pTree);
{Часть реализации модуля - содержит описание подпрограмм
как объявленных в интерфейсной части так и для внутреннего
пользования (локальные в рамках модуля)}
IMPLEMENTATION
{Процедура вывода содержимого компоненты двоичного дерева поиска.}
procedure print(v : pTree);
{формальный параметр - указатель на компоненту}
begin {для организации паузы}
if WhereY > 20 then {анализируем текущее строку}
begin {расположения курсора, если > 20}
readkey; {организуем ожидание нажатия любой клавиши}
clrscr {и очищаем экран}
end;
with v^ do {организуем вывод на экран}
begin
writeln('Фамилия: ',fio);
writeln('табельный номер:',num);
writeln('Пол: ',pol);
writeln('Дата рождения: ',dat);
writeln('Должлость: ',dol);
writeln
end;
end;
{Рекурсивная процедура добавления компоненты в двоичное дерево поиска.}
{Метод - поиск по дереву поиска по ключу и добавление компоненты-листа.}
Procedure add(var x : CompF; var p : pTree);
{формальные параметры: запись с данными о работнике и указатель на корень}
begin
if p = nil then {указатель = nil}
begin {добавление комоненты - листа}
new(p); {заказ области в динамической памяти}
Move(x,p^,SizeOf(CompF)); {копирование значений полей в компоненту}
with p^ do {компоненты - лист => нет поддеревьев}
begin
left := nil;
right := nil;
end;
end
else {указатель <> nil}
if x.num < p^.num then {табельный номер<}
add(x,p^.left) {рекурсивный вызов для левого поддерева}
else
if x.num > p^.num then {табельный номер>}
add(x,p^.right) {рекурсивный вызов для правого поддерева}
else {табельные номера одинаковы - ошибка}
begin
writeln(#13#10'Ошибка! Такой номер уже есть!');
readkey
end
end;
{Рекурсивная процедура удаления компоненты из двоичного дерева поиска.}
{Метод - поиска по дереву узла; если лист или имеет одно поддерево, то
удаление с восстановлением связей; если два поддерева - поиск в левом
поддереве крайнего правого узла, его удаление с предварительной записью
его данных в удаляемый узел}
Procedure del(x : word; var p : pTree);
{формальные параметры: табельный номер и указатель на корень}
var
{локальные переменные:}
q : pTree; {указатель на удаляемую вершину}
d : char; {для организации запроса удаления}
{рекурсивная локальная процедура для организации поиска крайнего
правого узла в левом поддереве в случае удаления узла с двумя
поддеревьями}
procedure delt(var r : pTree);
{формальный параметр: указатель на компоненту}
begin
if r^.right <> nil then {движение в правые поддеревья}
delt(r^.right)
else
begin {крайний правый узел}
move(r^,q^,SizeOf(CompF)); {копируем данные в удаляемый}
q := r; {запоминаем для высвобождения}
r := r^.left {сохраняем связь с левым поддеревом}
end
end;
begin
if p <> nil then {уазатель на компоненту}
if x < p^.num then {табельный номер< чем у текущей}
del(x,p^.left) {рекурс. вызов комп. в левом поддереве}
else
if x > p^.num then {табельный номер< чем у текущей}
del(x,p^.right) {рекурс. вызов комп. в правом поддереве}
else
begin {компонента найдена}
print(p); {вывод содержимого компоненты}
writeln('Удалить (Y/Д)? ');{запрос на удаление}
d := readkey;
if not (d in ['Y','y','Н','н','L','l','Д','д']) then
begin
writeln('Отмена удаления...');
exit;
end;
q := p; {запоминаем через указатель компоненту}
if q^.right = nil then {если нет правого поддерева}
p := q^.left {исключаем из связи - связь на левое}
else
if q^.left = nil then {если нет левого поддерева}
p := q^.right {исключаем из связи - связь на правое}
else
delt(q^.left); {два поддерева - поиск в левом}
dispose(q); {высвобождение динамической памяти }
writeln('Удален...');
end
else {указатель = nil}
writeln('Введенный табельный номер не найден...');
end;
{Часть инизиализации модуля - содержит команды, которые будут выполняться
до основной программы в программе, к которой подключен модуль}
BEGIN
END.
Основная программа - файл Rab.pas
{Директива $M определяет параметры распределения памяти}
{$M 65520,111000,655360}
{Подключение библиотек:
Crt - стандартная для работы с консолью,
Trees - пользовательский модуль для работы с двоичным деревом поиска.}
Uses crt,trees;
Var
{Описание глобальных переменных}
root : pTree; {указатель на корень дерева}
f,fs : file of CompF; {файловые переменные для типизированного файла}
count : longint; {для хранения количества компонент}
c : char; {для организации диалога}
st : CompF; {для чтения файла, ввода, фактический пар.}
pClear : pointer;{бестиповый указ. для запоминания состояния дин.пам.}
{Процедура добавления работника}
Procedure AddRab;
var
z : integer; {для сохранения расположения курсора}
begin
inc(count); {увеличиваем счетчик на 1}
repeat
clrscr; {очистка экрана}
with st do {оператор присоединения}
begin {ввод данных}
write('Введите ФИО: '); readln(fio);
{$I-} {программный анализ ошибки ввода}
repeat
write('Введите табельный номер: '); readln(num);
until IOResult = 0;
{$I+}
repeat
write('Введите пол: ');
pol := readkey;
writeln(pol);
until pol in ['Ж','ж','М','м'];
write('Введите дату рождения: '); readln(dat);
write('Должность: '); readln(dol);
end;
z := WhereY; {организация запроса на подтверждения ввода}
TextColor(Green);
gotoxy(15,25);
write('Занести в базу (Y/Д - да, любая клавиша - нет, ESC - отмена)?');
TextColor(LightGray);
gotoxy(1,z);
c := readkey;
until c in ['Y','y','Н','н','L','l','Д','д',#27];
if c <> #27 then
add(st,root) {вызов процедуры добавления в дерево}
else
dec(count); {отмена добавления - уменьшаем счетчик на 1}
end;
{Процедура удаления работника}
Procedure DelRab;
var
z : word; {для указания табельного номера}
begin
clrscr;
{$I-}
repeat
write('Введите табельный номер: ');
readln(z);
until IOResult = 0;
{$I+}
del(z,root); {вызов процедуры удаления компоненты из дерева}
readkey
end;
{Процедура организации поиска и отбора работников по критерию}
{Метод - обход дерева слева-направо с анализом критерия поиска
и, в случае необходимости, вывод на экран}
procedure SearchRab;
var
tmps : string; {для указания ключа поиска}
tmpc : word; {для указания ключа поиска}
{Локальная рекурсивная процедура обхода дерева слева-направо}
{при проверке критерия используются глобальные по отношению
к процедуре переменные с, tmps и tmpc}
Procedure Search(t : pTree);
begin
if t <> nil then
begin
Search(t^.left); {движение в левое поддерево}
case c of {проверка ключа поиска}
'1' : if pos(tmps,t^.fio) <> 0 then Print(t);
'2' : if pos(tmps,t^.dol) <> 0 then Print(t);
'3' : if tmpc = t^.num then Print(t);
end;
Search(t^.right); {движение в правое поддерево}
end
end;
begin
clrscr;
writeln('Поиск по:'); {выбор критерия поиска}
writeln(' 1. фамилии');
writeln(' 2. должности');
writeln(' 3. табельному номеру');
writeln('Отмена - любая клавиша.');
c := readkey;
write('Введите ключ поиска: ');
{$I-}
case c of
'1','2' : readln(tmps); {ввод ключа поиска}
'3' : readln(tmpc); {ввод ключа поиска}
else
exit
end;
writeln;
if IOResult <> 0 then
writeln('Неверный ввод.')
else
begin
Search(root); {вызов процедуры обхода}
writeln('Поиск окончен...');
end;
{$I+}
readkey
end;
{Рекурсивная процедура вывода всех работников в порядке табельных номеров}
{Метод - обход дерева слева-направо с вызовом процедуры вывода print}
procedure PrintRab(r : pTree);
begin
if r <> nil then
begin
PrintRab(r^.left); {движение в левое поддерево}
Print(r); {вызов процедуры вывода компоненты}
PrintRab(r^.right); {движение в правое поддерево}
end
end;
{Процедура меню - организация простого интерфейса пользователя}
procedure Menu;
begin
repeat
clrscr;
writeln('1. Добавление работника');
writeln('2. Удаление работника ');
writeln('3. Поиск работника по фамилии, табельному номеру, должности');
writeln('4. Вывод работника');
writeln('5. Выход');
gotoxy(44,25);
write('Выберите необходимое действие...');
c := readkey;
case c of
'1' : AddRab;
'2' : DelRab;
'3' : SearchRab;
'4' : begin
clrscr;
if root = nil then
writeln('База пуста...')
else
PrintRab(root);
readkey
end;
'5',#27 : break;
else
begin
gotoxy(44,25);
write('Неверный выбор. Введите от 1 до 5.');
end;
end;
until false;
end;
{Процедура загрузки данных из файла при запуске программы}
Procedure LoadOfFile;
begin
assign(f,'Rab.dat'); {связь файловой переменной с физическим файлом}
{$I-} {отключение реакции на ошибки ввода-вывода}
reset(f); {открытия файла на чтение/запись}
if IOresult <> 0 then {ошибка открытия}
begin
writeln('Файл с данными не найден.',#13#10,
'Файл Rab.dat будет создан...',#13#10);
rewrite(f); {открытие файла на запись и создание его}
end
else {файл открыт}
while not eof(f) do {пока не конец файла}
begin
count := filepos(f); {запоминаем номер текущей компоненты файла}
read(f,st); {считываем компоненту}
Writeln('Считан из файла - ',count,'. ',st.fio);
add(st,root); {вызов процедура добавления в дерево}
end;
if IOResult <> 0 then {ошибка чтения файла}
writeln('Ошибка чтения файла...')
else {чтение успешно}
begin
close(f); {закрываем файл}
writeln('Всего записей: ',count+1);
gotoxy(60,25);
Write('Чтение окончено...');
end; {включение реакции на ошибки ввода-вывода}
{$I+}
readkey;
end;
{Рекурсивная процедура записи компонент дерева в файл}
{Метод - обход дерева сверху-вниз с организацией записи
компоненты дерева в файл}
Procedure SaveToFile(t : pTree);
begin
if t <> nil then
begin
move(t^,st,SizeOf(CompF)); {копируем содержимое компоненты дерева в st}
{$I-}
write(f,st); {запись компоненты в файл}
Writeln('Записан в файл - ',st.fio);
if IOResult <> 0 then {ошибка записи}
begin
writeln(#13#10,'Ошибка записи в файл!');
exit;
end;
{$I+}
SaveToFile(t^.left); {движение в левое поддерево}
SaveToFile(t^.right); {движение в правое поддерево}
end;
end;
{Тело программы}
begin
clrscr; {очистка экрана}
mark(pClear);{запоминаем состояние динамической памяти}
root := nil; {дерево пустое - корень = nil}
count := -1; {нет ни одного работника}
{Чтение данных из файла - процедура LoadOfFile}
LoadOfFile;
{Вызов процедуры меню - работа пользователя}
Menu;
{Окончание работы - организация сохранения данных}
clrscr;
{$I-}
assign(f,'Rab.tmp'); {связываем с резервной копией}
erase(f); {удаляем файл}
if IOResult <> 0 then writeln('Ошибка удаления - Rab.tmp.');
assign(f,'Rab.dat'); {связываем с файлом данных с прошлого сеанса}
rename(f,'Rab.tmp'); {переименовываем - резервная копия}
if IOResult <> 0 then writeln('Ошибка создания копии - Rab.tmp.');
{$I+}
{Сохраняем данные в файл}
assign(f,'Rab.dat');
rewrite(f); {открываем на перезапись}
SaveToFile(root); {вызов процедуры записи в файл}
close(f); {закрываем файл - запись окончена}
gotoxy(60,25);
write('Запись окончена...');
release(pClear);{очищаем динамическую память от результатов работы}
readkey
end.
Список использованной литературы
1. Вирт Никлаус. Алгоритмы и структуры данных: Пер. с англ. - 2-е изд., испр. - СПб.: Невский Диалект, 2001. - 352 с.: ил.
2. Епанешников А., Епанешников В. Программирование в среде Turbo Pascal 7.0. - 4-е изд., испр. и дополн. - М.: «ДИАЛОГ-МИФИ», 1998. - 367 с.
3. Зуев Е.А. Turbo Pascal. Практическое программирование. - М.: «Издательство ПРИОР», 1999. - 336 с.
4. Климова Л.М. Практическое программирование. Решение типовых задач. - М.: КУДИЦ-ОБРАЗ, 2000. - 496 с., ил.
5. Ляхович В.Ф. Информатика: Пособие для учащихся 10-11 кл. общеобразоват. учреждений. - М.: Просвещение, 1998. - 352 с.
6. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. Учебное пособие. - М.: «Нолидж», 2001
7. Фаронов В.В. Turbo Pascal 7.0. Практика программирования. Учебное пособие. - М.: «Нолидж», 2001
Размещено на Allbest.ru
Подобные документы
Символьный тип данных как составляющая языка программирования: управляющие символы, лексемы и разделители. Разработка программного обеспечения для практической реализации решения задач, содержащих символьные величины языка программирования Turbo Pascal.
курсовая работа [37,7 K], добавлен 03.05.2012Строгая типизация и наличие средств структурного (процедурного) программирования императивного языка Pascal. Структура программы, выражения, строки. Правила и описание типов, процедур и функций, операторов ввода - вывода, модулей и подпрограмм.
курсовая работа [37,3 K], добавлен 28.06.2008Описание возможностей языка программирования Turbo Pascal. Написание программы создания файлов с прямым доступом, которая также будет обрабатывать наборы данных с определенными полями и ограничениями. Контрольный пример работы поисковой программы.
курсовая работа [563,6 K], добавлен 22.01.2016Изучение текстового режима языка программирования Turbo Pascal. Написание игры "Змейка" с помощью средств, процедур и функций языка программирование Turbo Pascal. Структурное и функциональное описание разработки. Листинг и общие примеры работы программы.
контрольная работа [286,3 K], добавлен 10.04.2011При помощи Turbo Pascal достаточно не просто создать программу, которая бы демонстрировала работу с базами данных. Для этого существует огромное количество специализированных программ. Основа и сущность формирования базы данных при помощи Turbo Pascal.
курсовая работа [479,7 K], добавлен 04.07.2008Иерархические, сетевые и реляционные модели данных. Различия между OLTP и OLAP системами. Обзор существующих систем управления базами данных. Основные приемы работы с MS Access. Система защиты базы данных, иерархия объектов. Язык программирования SQL.
курс лекций [1,3 M], добавлен 16.12.2010Обзор существующих систем управления базами данных. Концептуальное, логическое и физическое проектирование и создание базы данных. Обзор языков программирования. Создание и реализация клиентского приложения с помощью выбранного языка программирования.
дипломная работа [2,4 M], добавлен 02.06.2013Разработка эскизного и технического проектов программы "Helpopr" (ввод, хранение и вывод данных на дисплей по запросу пользователя). Язык программирования Turbo Pascal. Описание алгоритма программы. Требования к компьютеру и программному обеспечению.
курсовая работа [198,1 K], добавлен 03.02.2010Устройства внешней памяти. Система управления базами данных. Создание, ведение и совместное использование баз данных многими пользователями. Понятие системы программирования. Страницы доступа к данным. Макросы и модули. Монопольный режим работы.
реферат [27,5 K], добавлен 10.01.2011Основные классифицирующие признаки системы управления базами данных. Модель данных, вид программы и характер ее использования. Средства программирования для профессиональных разработчиков. Организация центров обработки данных в компьютерных сетях.
презентация [6,8 K], добавлен 14.10.2013