
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«Ижевский государственный технический университет имени М.Т. Калашникова»
Факультет «Информатика и вычислительная техника»
Кафедра АСОИУ
ОТЧЕТ
по лабораторной работе №2
по дисциплине «Информатика»
на тему «Поиск слова в таблице»
Выполнил: |
|
Студент группы Б01-782-1
|
Иванов А. В. |
Проверил: |
|
Ст. преподаватель кафедры АСОиУ |
Соловьева А. Н. |
Ижевск 2012
Постановка задачи:
В текстовом файле (*.txt) содержится набор строк (больше 15) с повторениями (список поступивших абитуриентов; список недавних посетителей сайта; список песен, выбранных радиослушателями и т.п.). Считывая из файла по одной строке, необходимо заполнить ими массив строк длины 15 так, чтобы он не содержал повторов.
Программа должна считывать строки из файла, проверять их наличие в массиве и при отрицательном результате добавлять их в свободные ячейки.
Для проверки наличия строк в массиве использовать один из трех методов: метод перебора, бинарный поиск и хеширование. Пользователь должен иметь возможность выбора метода.
Каждый из трех методов поиска должен быть выделен в отдельную процедуру (функцию).
Для каждой очередной строки выполнять подсчет количества сравнений с содержимым ячеек массива и выводить его на экран.
Для каждого метода поиска построить график зависимости числа сравнений при поиске строки от степени заполнения массива для каждого алгоритма. Подсчитать и привести в выводах среднее числоcравнений по всем строкам для каждого из трех методов.
Блок-схемы
Блок-схема основной программы приведена на рисунке 2.1.
Рисунок 2.1 – Блок схема основной программы
Блок-схема процедуры perebor приведена на рисунке 2.2
Рисунок 2.2 – Блок-схема процедуры perebor
Блок-схема процедуры bin представлена на рисунке 2.3
Рисунок 2.3 – Блок-схема процедуры bin
Блок-схема процедуры hesh приведена на рисунке 2.4
Рисунок 2.4 – Блок-схема процедуры hesh
Исходный код
var t:text;
a:array [0..16] of string;
b,c,d:string;
i,j,l,k,m,min,max,p,h:integer;
procedure perebor;
begin
readln(t,a[1]);
i:=2;
While not eof(t) do
begin
readln(t,b);
j:=1;
k:=0;
l:=0;
While (j<i) and (k=0) do
begin
If b=a[j] then k:=1;
l:=l+1;
j:=j+1;
end;
If k=0 then begin a[i]:=b; i:=i+1; end;
writeln(i-1,' ',l);
end;
end;
procedure bin;
begin
readln(t,a[1]);
i:=2;
While not eof(t) do
begin
readln(t,b);
min:=1;
max:=i-1;
j:=i div 2;
l:=0;
k:=0;
While (l=0) and (min<>max) do
begin
If a[j]=b then begin l:=1; writeln(i-1,' ',k+1); end else
If b>a[j] then begin min:=j+1; j:=(max+min) div 2; end else begin max:=j-1; j:=(max+min) div 2; end;
k:=k+1;
end;
If (min=max) then If a[min]=b then begin l:=1; writeln(i-1,' ',k+1); end else begin If b>a[min] then if a[min+1]='' then a[min+1]:=b else begin
c:=a[min+1];
a[min+1]:=b;
for p:=min+2 to i do
begin
d:=a[p];
a[p]:=c;
c:=d;
end;
end
else begin
c:=a[min];
a[min]:=b;
for p:=min+1 to i do
begin
d:=a[p];
a[p]:=c;
c:=d;
end;
end;
writeln(i-1,' ',k+1);
end;
If l=0 then i:=i+1;
end;
end;
procedure hesh;
begin
i:=1;
While not eof(t) do
begin
readln(t,b);
h:=0;
for j:=1 to length(b) do
h:=h+ord(b[j]);
h:=h mod 16;
if h=0 then h:=1;
k:=1;
l:=0;
If a[h]='' then begin a[h]:=b; writeln(i-1,' ',k); i:=i+1; end else If a[h]<> b then while (l<14) do
begin
h:=(h+1) mod 16;
if h=0 then h:=1;
If a[h]='' then begin a[h]:=b; l:=14; writeln(i-1,' ',k); i:=i+1; end else if a[h]=b then begin writeln(i-1,' ',k+1); l:=14; end;
l:=l+1;
k:=k+1;
end
else writeln(i-1,' ',k);
end;
end;
begin
assign(t,'input.in');
reset(t);
read(m);
If m=1 then perebor else if m=2 then bin else hesh;
close(t);
for j:=1 to i do
writeln(a[j]);
end.