Лабораторная работа по дисциплине «Базы данных»
на тему: «АЛГОРИТМЫ И ОРГАНИЗАЦИЯ ДАННЫХ»
Задание 3.1
Напишите программу последовательного поиска в последовательном неотсортированном массиве реквизитов единственного значения q. Используйте любой доступный вам язык программирования.
Решение:
Код программы:
unit Proga;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Image1: TImage;
Label2: TLabel;
Label1: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{поиск в массиве перебором}
procedure TForm1.Button1Click(Sender: TObject);
Const
SIZE=5;
Var
a:Array [1..SIZE] of Integer; // массив
obr:Integer; // образец для поиска
found:Boolean; // TRUE - совпадение образца с элементом массива
i:Integer; // индекс элемента массива
begin
If Length (StringGrid1.Cells[0,0])>3 then
begin
ShowMessage ('Ошибка в P (1) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[0,0]:='';
Exit;
end;
If Length (StringGrid1.Cells[1,0])>3 then
begin
ShowMessage ('Ошибка в P (2) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[1,0]:='';
Exit;
end;
If Length (StringGrid1.Cells[2,0])>3 then
begin
ShowMessage ('Ошибка в P (3) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[2,0]:='';
Exit;
end;
If Length (StringGrid1.Cells[3,0])>3 then
begin
ShowMessage ('Ошибка в P (4) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[3,0]:='';
Exit;
end;
If Length (StringGrid1.Cells[4,0])>3 then
begin
ShowMessage ('Ошибка в P (5) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[4,0]:='';
Exit;
end;
If Length (Edit1.Text)>3 then
begin
ShowMessage ('Ошибка в "Образец" !!! Нельзя ввести число больше "999".');
Edit1.Text:='';
Exit;
end;
If (StringGrid1.Cells[0,0]='') or (StringGrid1.Cells[1,0]='') or (StringGrid1.Cells[2,0]='') or (StringGrid1.Cells[3,0]='') or (StringGrid1.Cells[4,0]='') then
begin
ShowMessage ('Введены не все элементы уравнения. ПРОДОЛЖЕНИЕ НЕВОЗМОЖНО!');
Exit;
end;
If (Edit1.Text='') then
begin
ShowMessage ('Не введен образец. ПРОДОЛЖЕНИЕ НЕВОЗМОЖНО!');
Exit;
end;
// ввод массива
For i:=1 to SIZE do
a[i]:=StrToInt (StringGrid1.Cells[i-1,0]);
If Length (StringGrid1.Cells[0,0])=0 then
begin
ShowMessage ('Введены не все элементы массива!!!');
Exit;
end;
// ввод образца для поиска
obr:=StrToInt (Edit1.Text);
// поиск
found:=FALSE; // пусть нужного элемента в массиве нет
i:=1;
Repeat
If a[i]=obr then
found:=TRUE else
i:=i+1;
Until (i>SIZE) or (found=TRUE);
If found then
ShowMessage ('Совпадение с элементом номер P ('+IntToStr (i)+').'+#13+'Поиск успешен.') else
ShowMessage ('Совпадение с образцом нет.');
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Edit2.Text:=' P (1) ';
Edit3.Text:=' P (2) ';
Edit4.Text:=' P (3) ';
Edit5.Text:=' P (4) ';
Edit6.Text:=' P (5) ';
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Chr(0);
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Chr(0);
end;
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Chr(0);
end;
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Chr(0);
end;
procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Chr(0);
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
Case Key of
'0'..'9':;
#8:;
else
Key:=Chr(0);
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Case Key of
'0'..'9':;
#8:;
else
Key:=Chr(0);
end;
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
If StringGrid1.Cells[0,0]=StringGrid1.Cells[1,0] then
begin
If Length (StringGrid1.Cells[0,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[1,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[0,0]:='';
StringGrid1.Cells[1,0]:='';
end;
If StringGrid1.Cells[0,0]=StringGrid1.Cells[2,0] then
begin
If Length (StringGrid1.Cells[0,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[2,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[0,0]:='';
StringGrid1.Cells[2,0]:='';
end;
If StringGrid1.Cells[0,0]=StringGrid1.Cells[3,0] then
begin
If Length (StringGrid1.Cells[0,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[3,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[0,0]:='';
StringGrid1.Cells[3,0]:='';
end;
If StringGrid1.Cells[0,0]=StringGrid1.Cells[4,0] then
begin
If Length (StringGrid1.Cells[0,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[4,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[0,0]:='';
StringGrid1.Cells[4,0]:='';
end;
If StringGrid1.Cells[1,0]=StringGrid1.Cells[2,0] then
begin
If Length (StringGrid1.Cells[1,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[2,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[1,0]:='';
StringGrid1.Cells[2,0]:='';
end;
If StringGrid1.Cells[1,0]=StringGrid1.Cells[3,0] then
begin
If Length (StringGrid1.Cells[1,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[3,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[1,0]:='';
StringGrid1.Cells[3,0]:='';
end;
If StringGrid1.Cells[1,0]=StringGrid1.Cells[4,0] then
begin
If Length (StringGrid1.Cells[1,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[4,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[1,0]:='';
StringGrid1.Cells[4,0]:='';
end;
If StringGrid1.Cells[2,0]=StringGrid1.Cells[3,0] then
begin
If Length (StringGrid1.Cells[2,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[3,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[2,0]:='';
StringGrid1.Cells[3,0]:='';
end;
If StringGrid1.Cells[2,0]=StringGrid1.Cells[4,0] then
begin
If Length (StringGrid1.Cells[2,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[4,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[2,0]:='';
StringGrid1.Cells[4,0]:='';
end;
If StringGrid1.Cells[3,0]=StringGrid1.Cells[4,0] then
begin
If Length (StringGrid1.Cells[3,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
If Length (StringGrid1.Cells[4,0])<>0 then
begin
ShowMessage ('Нельзя ввести одинаковые числа!!!');
end;
StringGrid1.Cells[3,0]:='';
StringGrid1.Cells[4,0]:='';
end;
end;
end.
Скриншот:
Задание 3.9
Реализует ли приведенная ниже программа алгоритм сортировки простым выбором?
PROGRAM Simple_Select;
Const N=400;
Var J,I,K:Integer;
Max,Ind: Integer;
A: Array [0..N] of Integer;
BEGIN
For I:=0 to N do
Begin
A[I]:=Random (N);
Write (A[I]:4);
end;
For J:=N downto 1 do
begin
Max:=A[J];
Ind := J;
For I:=J downto 0 do
If A[I]>Max then
Begin
Max:=A[I];
Ind:=I;
end;
If Ind<>J then
Begin
К:=A[Ind];
A[Ind]:=A[J];
A[J]:=К;
End;
end;
For I:=0 to N do
Write (A[I]:4);
END.
Решение:
Скриншот:
Приведенная программа не реализует алгоритм сортировки простым выбором.
Задание 3.12
Напишите программу индексирования основного файла по одному реквизиту. Используйте любой доступный вам язык программирования.
Решение:
Индексирование основного файла по одному реквизиту будем делать на примере вот этой таблицы:
А |
В |
С |
1 |
Первый завод |
Стул |
2 |
Второй завод |
Стол |
3 |
Третий завод |
Компьютер |
Индексирование файла будем делать по реквизиту «A».
Индексный файл будет выглядеть так:
А |
С |
1 |
Стул |
2 |
Стол |
3 |
Компьютер |
Алгоритм программы:
Запуск программы.
Ввод размеров таблицы, т.е. количество столбцов и строк.
Ввод всех записей таблицы.
Запись этой таблицы в файл «Baza.txt».
Ввод названия реквизитов, по которым нужно индексировать файл.
Проверка всех записей основного реквизита на упорядоченность, т.е. расположение по возрастанию или убыванию (по алфавиту или по цифрам):
Если все записи упорядочены, то:
Если записей в реквизите меньше 10, то в индексе необходимо помещать указатель на каждую запись.
Если записей в реквизите больше 10, то в индексе необходимо помещать указатель не на каждую запись, а на ключи, которые будут создаваться, например, с промежутком в 7 записей (промежуток зависит от того, сколько записей в реквизите всего находится).
2) Если все записи не упорядочены, то, в индексе необходимо помещать указатель на каждую запись, а сам индексный файл можно упорядочить по значениям ключа индексирования.
Запись индексированной таблицы в файл «Index.txt».
Выход из программы.
Задание 3.17
Рассмотрите файл из двух реквизитов А и В с первой записью (11,8) и последующими значениями А и В, получаемыми по формулам:
состоящий из 25 записей. Создайте индексные файлы по реквизитам А и В и двум реквизитам совместно. Необходимые дополнительные параметры выберите самостоятельно.
Решение: