Федеральное агентство по образованию РФ
ФГОУ СПО «Перевозский строительный колледж»
Лабораторная работа по дисциплине «Базы данных»
на тему: «АЛГОРИТМЫ И ОРГАНИЗАЦИЯ ДАННЫХ»
Подготовил студент 351 группы: Дмитриев А.С.
Проверила: Патлай Н.А.
Задание 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
|
Компьютер
|
|
|
Алгоритм программы:
1. Запуск программы.
2. Ввод размеров таблицы, т.е. количество столбцов и строк.
3. Ввод всех записей таблицы.
4. Запись этой таблицы в файл «Baza.txt».
5. Ввод названия реквизитов, по которым нужно индексировать файл.
6. Проверка всех записей основного реквизита на упорядоченность, т.е. расположение по возрастанию или убыванию (по алфавиту или по цифрам):
1) Если все записи упорядочены, то:
1) Если записей в реквизите меньше 10, то в индексе необходимо помещать указатель на каждую запись.
2) Если записей в реквизите больше 10, то в индексе необходимо помещать указатель не на каждую запись, а на ключи, которые будут создаваться, например, с промежутком в 7 записей (промежуток зависит от того, сколько записей в реквизите всего находится).
2) Если все записи не упорядочены, то, в индексе необходимо помещать указатель на каждую запись, а сам индексный файл можно упорядочить по значениям ключа индексирования.
7. Запись индексированной таблицы в файл «Index.txt».
8. Выход из программы.
Задание 3.17
Рассмотрите файл из двух реквизитов А и В с первой записью (11,8) и последующими значениями А и В, получаемыми по формулам:
состоящий из 25 записей. Создайте индексные файлы по реквизитам А и В и двум реквизитам совместно. Необходимые дополнительные параметры выберите самостоятельно.
Решение:
|