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