Автоматизация работы с базами данных

тестовые примеры

Так как входные данные могут формироваться только самой программой, то, если не будет вмешательство в содержимое файла Rab.dat, данные будут всегда корректно считываться из файла. Если файл будет отсутствовать в каталоге, из которого запущена программа, или просто-напросто файл не будет найден (необходимо учитывать переменные окружения ОС – команда path), то программа сама

создаст пустой файл. Все вводимые значение в процессе выполнения программы анализируется на корректность ввода. Таким образом, практически исключено возникновение ошибочных ситуаций. Единственно, в программе не учтены возможные ошибки работы с динамической памятью, так как предполагается использование программы для небольшого количества работников. Данные ситуации потенциально могут возникать при выделении динамической памяти процедурой New. Тогда перед выделением можно функцией MaxAvail определить размер самого большого свободного участка динамической памяти, если он больше размера компоненты дерева (111 Бт), тогда использовать процедуру New.

При тестировании программы вводились различные данные и выполнялись различные операции пользователя. В ходе тестирования были выявлены и устранены различные ошибки. Для выявления ошибок также использовались стандартные средства отладки среды Turbo Pascal.

Приведем пример одного из тестовых примеров. Вводились следующие данные (значения остальных полей не указаны, так как не имеют принципиального значения в данном примере):

Таблица 1. Вводимы данные

Fio

num

Иванов Иван

50

Сидоров Сидор

33

Петров Петр

100

Иванова Иванна

25

Сидорова Сидора

44

Петрова Петра

75

Баночкин Федор

77

Рис. 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;

Страница:  1  2  3  4  5  6  7  8  9  10 


Другие рефераты на тему «Программирование, компьютеры и кибернетика»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы