Федеральное агентство по образованию РФ
ФГОУ СПО «Перевозский строительный колледж»
Лабораторная работа по дисциплине «Базы данных»
на тему: «АЛГОРИТМЫ И ОРГАНИЗАЦИЯ ДАННЫХ»
Подготовил студент 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
ShowMessage ('Ошибка в P (1) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[0,0]:='';
Exit;
If Length (StringGrid1.Cells[1,0])>3 then
ShowMessage ('Ошибка в P (2) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[1,0]:='';
If Length (StringGrid1.Cells[2,0])>3 then
ShowMessage ('Ошибка в P (3) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[2,0]:='';
If Length (StringGrid1.Cells[3,0])>3 then
ShowMessage ('Ошибка в P (4) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[3,0]:='';
If Length (StringGrid1.Cells[4,0])>3 then
ShowMessage ('Ошибка в P (5) !!! Нельзя ввести число больше "999".');
StringGrid1.Cells[4,0]:='';
If Length (Edit1.Text)>3 then
ShowMessage ('Ошибка в "Образец" !!! Нельзя ввести число больше "999".');
Edit1.Text:='';
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
ShowMessage ('Введены не все элементы уравнения. ПРОДОЛЖЕНИЕ НЕВОЗМОЖНО!');
If (Edit1.Text='') then
ShowMessage ('Не введен образец. ПРОДОЛЖЕНИЕ НЕВОЗМОЖНО!');
// ввод массива
For i:=1 to SIZE do
a[i]:=StrToInt (StringGrid1.Cells[i-1,0]);
If Length (StringGrid1.Cells[0,0])=0 then
ShowMessage ('Введены не все элементы массива!!!');
// ввод образца для поиска
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 ('Совпадение с образцом нет.');
procedure TForm1.FormActivate(Sender: TObject);
Edit2.Text:=' P (1) ';
Edit3.Text:=' P (2) ';
Edit4.Text:=' P (3) ';
Edit5.Text:=' P (4) ';
Edit6.Text:=' P (5) ';
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
Key:=Chr(0);
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char);
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
Case Key of
'0'..'9':;
#8:;
else
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
procedure TForm1.StringGrid1Click(Sender: TObject);
If StringGrid1.Cells[0,0]=StringGrid1.Cells[1,0] then
If Length (StringGrid1.Cells[0,0])<>0 then
ShowMessage ('Нельзя ввести одинаковые числа!!!');
If Length (StringGrid1.Cells[1,0])<>0 then
If StringGrid1.Cells[0,0]=StringGrid1.Cells[2,0] then
If Length (StringGrid1.Cells[2,0])<>0 then
If StringGrid1.Cells[0,0]=StringGrid1.Cells[3,0] then
If Length (StringGrid1.Cells[3,0])<>0 then
If StringGrid1.Cells[0,0]=StringGrid1.Cells[4,0] then
If Length (StringGrid1.Cells[4,0])<>0 then
If StringGrid1.Cells[1,0]=StringGrid1.Cells[2,0] then
If StringGrid1.Cells[1,0]=StringGrid1.Cells[3,0] then
If StringGrid1.Cells[1,0]=StringGrid1.Cells[4,0] then
If StringGrid1.Cells[2,0]=StringGrid1.Cells[3,0] then
If StringGrid1.Cells[2,0]=StringGrid1.Cells[4,0] then
If StringGrid1.Cells[3,0]=StringGrid1.Cells[4,0] then
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);
For J:=N downto 1 do
Max:=A[J];
Ind := J;
For I:=J downto 0 do
If A[I]>Max then
Max:=A[I];
Ind:=I;
If Ind<>J then
К:=A[Ind];
A[Ind]:=A[J];
A[J]:=К;
End;
END.
Приведенная программа не реализует алгоритм сортировки простым выбором.
Задание 3.12
Напишите программу индексирования основного файла по одному реквизиту. Используйте любой доступный вам язык программирования.
Индексирование основного файла по одному реквизиту будем делать на примере вот этой таблицы:
А
В
С
1
Первый завод
Стул
2
Второй завод
Стол
3
Третий завод
Компьютер
Индексирование файла будем делать по реквизиту «A».
Индексный файл будет выглядеть так:
Алгоритм программы:
1. Запуск программы.
2. Ввод размеров таблицы, т.е. количество столбцов и строк.
3. Ввод всех записей таблицы.
4. Запись этой таблицы в файл «Baza.txt».
5. Ввод названия реквизитов, по которым нужно индексировать файл.
6. Проверка всех записей основного реквизита на упорядоченность, т.е. расположение по возрастанию или убыванию (по алфавиту или по цифрам):
1) Если все записи упорядочены, то:
1) Если записей в реквизите меньше 10, то в индексе необходимо помещать указатель на каждую запись.
2) Если записей в реквизите больше 10, то в индексе необходимо помещать указатель не на каждую запись, а на ключи, которые будут создаваться, например, с промежутком в 7 записей (промежуток зависит от того, сколько записей в реквизите всего находится).
2) Если все записи не упорядочены, то, в индексе необходимо помещать указатель на каждую запись, а сам индексный файл можно упорядочить по значениям ключа индексирования.
7. Запись индексированной таблицы в файл «Index.txt».
8. Выход из программы.
Задание 3.17
Рассмотрите файл из двух реквизитов А и В с первой записью (11,8) и последующими значениями А и В, получаемыми по формулам:
состоящий из 25 записей. Создайте индексные файлы по реквизитам А и В и двум реквизитам совместно. Необходимые дополнительные параметры выберите самостоятельно.