Федеральное агентство по образованию РФ
ФГОУ СПО «Перевозский строительный колледж»
Лабораторная работа по дисциплине «Базы данных»
на тему: «АЛГОРИТМЫ И ОРГАНИЗАЦИЯ ДАННЫХ»
Подготовил студент 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 записей. Создайте индексные файлы по реквизитам А и В и двум реквизитам совместно. Необходимые дополнительные параметры выберите самостоятельно.
Решение: