Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник задач Бабалова.doc
Скачиваний:
95
Добавлен:
04.06.2015
Размер:
1.16 Mб
Скачать

Приложение.

Program Number_2_10;

uses menu1;

{Библиотечные данные хранятся в файле неупорядоченными по номерам разделов. Описание библиотеки предполагает перечисление следующих данных: номер библиотечного раздела, количество записей в этом разделе и наименование раздела. Если в разделе нет записей, то считается, что раздел пуст. Вывести информацию по всем разделам библиотеки, определить пустые разделы, ввести инфорацию в любые разделы, в том числе и в пустые. Всю информацию представить в виде хеш-таблицы, где номера разделов позволяют вычислить ключи хеш-функции. Количество записей в каждой строке таблицы - произвольное и представляется списком.}

begin

menu_;

end.

unit utable;{этот модуль нужен для описания всех методов, обеспечивающих обработку заданной структуры данных - таблицы }

Interface

const

lenstr=40;

type

st1=string[lenstr];

elmnt=record

st:st1; {Наименование раздела из неболее чем 40 символов}

Ik:word;{количество записей}

nn:word; {номер раздела}

end;

Tpzap=^zap; {элемент строки таблицы – это элемент списка}

zap=record

el:elmnt;

pnext:Tpzap;

end;

ff=file of elmnt; {сохраняемые в файле данные}

Tabl=^tst;

tst= array [0..0] of Tpzap;{индексы элементов- это ключи хеш-функции.Количество индексов-ключей можно выбрать любое. В данном решении возьмем количество ключей, равное 10}

OTabl=object

tbl:Tabl;{Объект- таблица включает в себя табличные переменные}

T,P,Q,PQ:Tpzap;{Элементы для формирования списков в строках таблицы}

IEl:elmnt;

f:ff;

constructor init(var Ok:boolean);

destructor done(var Ok:boolean);

procedure new_el_tb(nEl:elmnt);{запись элемента в хеш-таблицу}

procedure vvod_tb;{ввод таблицы}

procedure dopoln;{поиск пустых разделов таблицы}

procedure read_f;{читать из файла}

procedure save_f;{записать элементы таблицы в файл}

procedure show_tb;{вывести таблицу}

end;

Var init_Ok:boolean;

Implementation

uses crt,utils;

constructor Otabl.init(var Ok:boolean);

Var I:word;

begin

getmem(Tbl,10*sizeof(Tpzap));{}

{резервируем память для сохранения вектора указателей на строки с описанием разделов}

for i:=0 to 9 do

Tbl^[i]:=nil;

{Указатели делаем пустыми, чтобы работать только с имеющимися в данном тексте длинами слов}

Ok:=true;

end;

procedure Otabl.new_el_tb(nEl:elmnt);

Var m:word;

stop:boolean;

begin

m:=nEl.nn mod 10;

T:=Tbl^[m];{ключ найден в соотвествии с номером раздела}

if (T=nil) then

begin

new(p);

P^.el:=nEl;

P^.pnext:=nil;{этот оператор работает только для создания первого элемента списка типа стека}

Tbl^[m]:=P;

end else

begin

new(PQ);

PQ^.el:=nEl;

PQ^.pnext:=Tbl^[m];

Tbl^[m]:=PQ;

end;

end;{Конец метода включения нового элемента в таблицу }

procedure OTabl.vvod_tb;

var

stop:boolean;

L,iL:byte;

s:st1;

d,code:word;

ch:char;

begin

assign(f,'tab.dat');

rewrite(f);

repeat

window(40,12,79,18); clrscr;

textcolor(yellow);

gotoxy(1,1); {stop:=false;}

writeln(' Введите данные картотеки');

write(' Раздел номер ');

readln(iEl.nn);

write(' Количество записей в разделе ');

readln(iEl.ik);

write(' Название раздела ');

readln(iEl.st);

write(f,iEl);

new_el_tb(iEl);

writeln(' Есть еще данные?');

readln(ch);

until ch='n';

window(1,1,80,24);

end;

procedure OTabl.dopoln;