У вас вопросы?
У нас ответы:) SamZan.net

на тему- Организация хешированного файла по дисциплине Базы данных Выполнил- Забелин В

Работа добавлена на сайт samzan.net: 2015-07-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 7.6.2025

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕСИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ – УЧЕБНО-НАУЧНО-

ПРОИЗВОДСТВЕННЫЙ КОМПЛЕКС»

Кафедра «Информационные системы»

О Т Ч Е Т

о выполнении лабораторной работы № 1

на тему: «Организация хешированного файла»

по дисциплине «Базы данных»

Выполнил: Забелин В.В., Коняхин В.В.         Шифр: 090265, 091102

Факультет УНИИ ИТ

Направление / специальность: Прикладная информатика (в экономике)

Группа: 31 – ЭИ 

Преподаватель: Рыженков Д.В.

Орел, 2012


Исходный код программы

unit main;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls;

type

 TMode = (_add,_delete,_change,_search);

 TCatalog=record

        first,last: integer;

      end;

 TZap=record

        info: boolean;

        ID: integer;

        SName: string[20];

        Fam: string[20];

        Otch: string[30];

        NumGr: integer;

      end;

//   82

 TBlockForTZap=record

       hndl: integer;

       block: array [0..4] of TZap;

       RestArea: array[1..20] of byte;

      end;

 TBlock0=record

        About: string[253];

        RestArea: array[1..118] of byte;

        last_block: integer;

        catalog: array [0..3] of TCatalog

        end;

 TDB_Heap = class(TForm)

   Memo1: TMemo;

   leID: TLabeledEdit;

   leSName: TLabeledEdit;

   leFam: TLabeledEdit;

   leNumGr: TLabeledEdit;

   Add: TButton;

   Search: TButton;

   Delete: TButton;

   Edit: TButton;

   Show: TButton;

   Bevel1: TBevel;

   Bevel2: TBevel;

   Button1: TButton;

   RadioButton1: TRadioButton;

   RadioButton2: TRadioButton;

   leOtch: TLabeledEdit;

   procedure FormCreate(Sender: TObject);

   procedure AddClick(Sender: TObject);

   procedure SearchClick(Sender: TObject);

   procedure ShowClick(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure DeleteClick(Sender: TObject);

   procedure ClearPole;

   procedure RadioButton2Click(Sender: TObject);

   procedure RadioButton1Click(Sender: TObject);

   function hash (const key: integer): integer;

   function fSearch_res (const hash_val: integer; const current_mode: TMode; var last: integer): integer;

   function fSearch_by_key (const key: integer): boolean;

   function fSearch_by_no_key(const Name,Fam: string; Com: real): boolean;

   procedure EditClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

const

  rec0:TZap=(Info:true; ID:0; SName:'None';Fam:'None';Otch:'None';NumGr:0);

var

 Mode: TMode;

 schema:TBlock0=(About:'Отношение студенты - ID:integer; '+'SName:string[133]; '+'Fam:string[97]; '+'NumGr:real');

 DB_Heap: TDB_Heap;

 list: TBlockForTZap;

 rec,search_rec: TZap;

 f: file;

 i,j,condition,last_elem,c: integer;

implementation

{$R *.dfm}

function TDB_Heap.fSearch_by_key (const key: integer): boolean;

begin

    reset(f,410);

    repeat

     Seek(f,condition);

     BlockRead(f,list,1);

     for i:=0 to 4 do

           begin

             if not(list.block[i].info) and (key=list.block[i].ID)

             then

               begin

                 leSName.Text:=list.block[i].SName;

                 leFam.Text:=list.block[i].Fam;

                 leOtch.Text:=list.block[i].Otch;

                 leNumGr.Text:=IntToStr(list.block[i].NumGr);

                 Result:=true;

                 CloseFile(f);

                 exit;

               end;

           end;

      condition:=list.hndl;

    until condition=0;

   Result:=false;

   CloseFile(f);

end;

function TDB_Heap.hash (const key: integer): integer;

begin

 Result:= key mod 4;

end;

function TDB_Heap.fSearch_res (const hash_val: integer; const current_mode: TMode; var last: integer): integer;

begin

 reset(f,410);

 If FileSize(f)<>0 then

 begin

//Читаем служебную инфу в первом блоке

    Seek(f,0);

//Прочитали в спец. переменную

    BlockRead(f,schema,1);

//Если у нас по полученному значению хеш-функции (т.е. по номеру бакета) нет ниодного блока

//то тогда возвращаем функции 0. Иначе возвращаем номер последнего бакет для данного файла

    if schema.catalog[hash_val].first=0 then Result:=0

    else

    begin

       case current_mode of

         _delete,_change,_search: Result:=schema.catalog[hash_val].first;

         _add:

           begin

             Result:=schema.catalog[hash_val].first;

             last:=schema.catalog[hash_val].last;

           end;

       end;

    end;

 end

 else

 Result:=-1;

end;

procedure TDB_Heap.FormCreate(Sender: TObject);

begin

 for i:=0 to 3 do

 begin

   schema.catalog[i].first:=0;

   schema.catalog[i].last:=0;

 end;

 schema.last_block:=0;

 AssignFile (f, 'file.dat');

end;

procedure TDB_Heap.AddClick(Sender: TObject);

begin

 reset(f,410);

 rec.info:=false;

 rec.ID:=StrToInt(leID.Text);

 rec.SName:=leSName.Text;

 rec.Fam:=leFam.Text;

 rec.Otch:=leOtch.Text;

 rec.NumGr:=StrToInt(leNumGr.Text);

 condition:=fSearch_res(hash(rec.ID),_add,last_elem);

 if  condition=-1 then

   begin

     //файл пустой

         inc(schema.last_block);

     //увеличиваем число блоков

     //далее вносим изменения в каталог

         schema.catalog[hash(rec.ID)].first:=schema.last_block;

         schema.catalog[hash(rec.ID)].last:=schema.last_block;

     //пишем изменения в файл

         BlockWrite(f,schema,1);

     //Пишем блок

         list.block[0]:=rec;

         list.block[1]:=rec0;

         list.block[2]:=rec0;

         list.block[3]:=rec0;

         list.block[4]:=rec0;

         list.hndl:=0;

         BlockWrite (f,list,1);

         CloseFile(f);

         exit;

   end

else

if  condition=0 then

   begin

       reset(f,410);

   //То есть по данному бакету не создано ни одного блока

       inc(schema.last_block);

   //Вносим изменения

       schema.catalog[hash(rec.ID)].first:=schema.last_block;

       schema.catalog[hash(rec.ID)].last:=schema.last_block;

   //Пишем

       BlockWrite(f,schema,1);

   //Пишем блок

       Seek(f,Filesize(f));

       list.block[0]:=rec;

       list.block[1]:=rec0;

       list.block[2]:=rec0;

       list.block[3]:=rec0;

       list.block[4]:=rec0;

       list.hndl:=0;

       BlockWrite (f,list,1);

   end

 else

//вход сюда,если мы обнаружили по хешу уже начатый бакет

 begin

 reset(f,410);

 c:=condition;

//Перемещаемся на первый блок и осуществляем поиск дубликатов

   repeat

     Seek(f,c);

     BlockRead(f,list,1);

     for i:=0 to 4 do

           begin

             if not(list.block[i].info) and (Rec.ID=list.block[i].ID)

             then

               begin

                 ShowMessage('Такая запись уже существует.');

                 CloseFile(f);

                 ClearPole;

                 exit;

               end;

           end;

      c:=list.hndl;

   until c=0;

   repeat

     Seek(f,condition);

     BlockRead(f,list,1);

//проверяем на заполненность

   for i:=0 to 4 do

           begin

//если нашли "пусто",то впихиваем на это место и полностью переписываем блок

             if list.block[i].info

             then

               begin

                 Seek(f,condition);

                 list.block[i]:=rec;

                 BlockWrite (f,list,1);

                 CloseFile(f);

                 ClearPole;

                 exit;

               end;

           end;

     condition:=list.hndl;

   until condition=0;

//Если все полностью забито,то меняем схему и в бакете указываем на прибавление

//и пишем нужный блок

//увеличиваем общее число блоков

   inc(schema.last_block);

   list.hndl:=schema.last_block;

   Seek(f,last_elem);

   BlockWrite (f,list,1);

   schema.catalog[hash(rec.ID)].last:=schema.last_block;

   Seek(f,0);

   BlockWrite (f,schema,1);

   Seek(f,Filesize(f));

   list.block[0]:=rec;

   list.block[1]:=rec0;

   list.block[2]:=rec0;

   list.block[3]:=rec0;

   list.block[4]:=rec0;

   list.hndl:=0;

   BlockWrite(f,list,1);

   CloseFile(f);

 end;

end;

procedure TDB_Heap.ClearPole;

begin

 leID.Clear;

 leID.Focused;

 Memo1.Lines.Clear;

end;

procedure TDB_Heap.SearchClick(Sender: TObject);

begin

 if (length(leID.Text)<>0) then search_rec.ID:=StrToInt(leID.Text);

 search_rec.SName:=leSName.Text;

 search_rec.Fam:=leFam.Text;

 if (length(leNumGr.Text)<>0) then search_rec.NumGr:=StrToInt(leNumGr.Text)

 else search_rec.NumGr:=-1;

 condition:=fSearch_res(hash(search_rec.ID),_add,last_elem);

 if  condition=-1 then

 begin

   Memo1.Lines.add('Файл пуст');

 end

 else

 begin

 if RadioButton2.Checked then

  if condition=0 then

   begin

     ShowMessage('Не найдено');

     CloseFile(f);

     exit;

   end

   else

     if not fSearch_by_key(search_rec.ID) then  ShowMessage('Не найдено');

  if RadioButton1.Checked then

    if (not fSearch_by_no_key(search_rec.SName,search_rec.Fam,search_rec.NumGr))

     then  ShowMessage('Не найдено');

 end;

end;

procedure TDB_Heap.ShowClick(Sender: TObject);

begin

    Memo1.Clear;

    reset(f,410);

    if FileSize(f)<>0 then

    begin

//Читаем служебную инфу в первом блоке

      Seek(f,0);

//Прочитали в спец. переменную

      BlockRead(f,schema,1);

      Memo1.Lines.Add(schema.About+' и всего блоков '+IntTostr(schema.last_block));

      for i:=0 to 3 do

        if schema.catalog[i].first=0 then

          begin

            Memo1.Lines.Add('      Бакет №'+IntToStr(i)+' пуст');

          end

          else

          begin

            Memo1.Lines.Add('      Бакет №'+IntToStr(i)+' :');

            Seek(f,schema.catalog[i].first);

            BlockRead(f,list,1);

            Memo1.Lines.Add('Блок №'+IntToStr(schema.catalog[i].first));

            for j:=0 to 4 do

            begin

              rec:=list.block[j];

              Memo1.Lines.Add(IntToStr(rec.ID));

              Memo1.Lines.Add(rec.SName);

              Memo1.Lines.Add(rec.Fam);

              Memo1.Lines.Add(rec.Otch);

              Memo1.Lines.Add(IntToStr(rec.NumGr));

              Memo1.Lines.Add('------------------');

            end;

            while list.hndl<>0 do

            begin

             Memo1.Lines.Add('Блок №'+IntToStr(list.hndl));

             Seek(f,list.hndl);

             BlockRead(f,list,1);

             for j:=0 to 4 do

             begin

              rec:=list.block[j];

              Memo1.Lines.Add(IntToStr(rec.ID));

              Memo1.Lines.Add(rec.SName);

              Memo1.Lines.Add(rec.Fam);

              Memo1.Lines.Add(rec.Otch);

              Memo1.Lines.Add(IntToStr(rec.NumGr));

              Memo1.Lines.Add('------------------');

             end;

            end;

          end;

    end

    else  Memo1.Lines.Add('Файл пуст');

end;

procedure TDB_Heap.Button1Click(Sender: TObject);

begin

 Rewrite(f);

 schema.last_block:=0;

end;

procedure TDB_Heap.DeleteClick(Sender: TObject);

begin

 search_rec.ID:=StrToInt(leID.Text);

 condition:=fSearch_res(hash(search_rec.ID),_add,last_elem);

 reset(f,410);

    repeat

     Seek(f,condition);

     BlockRead(f,list,1);

     for i:=0 to 4 do

           begin

             if not(list.block[i].info) and (search_rec.ID=list.block[i].ID)

             then

               begin

                 list.block[i]:=rec0;

                 Seek(f,condition);

                 BlockWrite(f,list,1);

                 CloseFile(f);

                 Showmessage('Запись успешно стерта');

                 exit;

               end;

           end;

      condition:=list.hndl;

    until condition=0;

 Showmessage('Такая запись не найдена');

 CloseFile(f);

end;

procedure TDB_Heap.RadioButton2Click(Sender: TObject);

begin

  RadioButton2.Checked:=true;

  RadioButton1.Checked:=false;

end;

procedure TDB_Heap.RadioButton1Click(Sender: TObject);

begin

  RadioButton1.Checked:=true;

  RadioButton2.Checked:=false;

end;

procedure TDB_Heap.EditClick(Sender: TObject);

begin

 rec.info:=false;

 rec.ID:=StrToInt(leID.Text);

 rec.SName:=leSName.Text;

 rec.Fam:=leFam.Text;

 rec.Otch:=leOtch.Text;

 rec.NumGr:=StrToInt(leNumGr.Text);

 search_rec.ID:=StrToInt(leID.Text);

 condition:=fSearch_res(hash(search_rec.ID),_add,last_elem);

 reset(f,410);

    repeat

     Seek(f,condition);

     BlockRead(f,list,1);

     for i:=0 to 4 do

           begin

             if not(list.block[i].info) and (search_rec.ID=list.block[i].ID)

             then

               begin

                 list.block[i]:=rec;

                 Seek(f,condition);

                 BlockWrite(f,list,1);

                 CloseFile(f);

                 Showmessage('Запись успешно изменена');

                 exit;

               end;

           end;

      condition:=list.hndl;

    until condition=0;

 Showmessage('Такая запись не найдена');

 CloseFile(f);

end;

end.




1. Автоматизация работы фирмы по продаже квартир
2. Понятие о патологическом агенте экзо и эндогенные патологические агенты Понятие об этиологии
3. Эй Парень непонятно откуда послышался приглушенный голос как из бынки
4. Теневая экономика - антипод цивилизованного мира
5. Notes tht gol setting is widely considered to be used for improving corporte performnce when in fct it should be used with gret cre becuse of its potentilly hrmful sideeffects mong these is the ris
6.  Держава- поняття та ознаки Держава це особлива політ
7. На тему- rdquo;Тарле ~ Наполеонrdquo;
8. доктор философских наук главный научный сотрудник Института философии РАН
9. Лекция 1 Виды складских помещений Быстроразвивающаяся рыночная экономика привела к созданию высококонк
10. тема трудового права