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