Есть строковый массив. Поступает некоторое слово. Узнать, есть ли слово в таблице
Категория: Delphi/Pascal
2012-01-04 16:55:03
Разработать 2 процедуры (или функции) решения задачи «Поиск слова в таблице» в соответствии с алгоритмами: поиск перебором, бинарный (двоичный) поиск. Отладить процедуры (функции) с помощью тестового набора слов в количестве n+1, где n>10 – размер таблицы. Таблица в алгоритме поиск перебором заполняется динамически по мере поступления слов. Таблица в алгоритме бинарный поиск должна быть заполнена предварительно словами, и слова в таблице должны быть упорядочены лексикографически. Тестовый набор слов для отладки и сбора статистики удобно размещать в текстовом файле, в этом случае при каждом запуске программы не нужно будет набирать слова заново.
code: #pascal
uses crt; const Max=10; type DataArray=array[1..Max] of string; var a:DataArray;{massiv dannyh} i,n:integer;{i-dlia indekos massiva,n-fakticheskoe kol-vo elementov} path:string;{imia faila} vybor,ch:char;{dlia konstrukcii [y/n]} Rez,Flag:boolean;{Rez-rezultat chtenia dannyh, Flag-polon li massiv} function ReadFromFile(FileName: string):boolean; {chtenie faila/konsoli parametr imia faila pustoi - konsol vozvraschaet TRUE pri uspeshnom zavershenii} var f:text; buf:string; begin Assign(f,FileName); {$I-} Reset(f); {$I+} if IOResult<>0 then begin ReadFromFile:=False; Writeln('Problemy s failom!'); exit; end; repeat inc(n); readln(f,buf); if buf<>'' then a[n]:=buf else begin dec(n); break; end; if n=Max then begin Flag:=True; writeln('Massiv polnostiu zapolnen!'); break; end; until eof(f)=True; Close(f); if n>0 then begin writeln('Prochitanno slov: ',n); ReadFromFile:=True; end else begin writeln('NE prochitanno ni odnogo slova!'); ReadFromFile:=False; end; end; procedure PereborSearch; {poisk polnym pereborom} var kol:integer;{kol-vo sovpadenii} s:string; begin repeat write('Nuzhno naiti: '); readln(s); if s='' then writeln('Massiv NE soderzhit pustyh strok! Zadaite druguiu stroku.'); until s<>''; kol:=0; for i:=1 to n do if a[i]=s then begin inc(kol); writeln('Pozicia: ',i,'.'); end; if kol>0 then writeln('Vsego sovpadenii: ',kol) else if (Flag=True) or (n=Max) then begin writeln('Nichego NE naideno!'); writeln('Slovo NE mozhet byt dobavlenno - massiv zapolnen!'); end else begin writeln('Nichego NE naideno!'); inc(n); a[n]:=s; writeln('Slovo ',a[n],' dobavlenno v massiv.'); end; end; procedure LexSort(var item: DataArray; count:integer); {leksikograficheskoe uporiadochivanie} procedure QuickSort(l, r: integer; var it:DataArray); var i_,j: integer; x, y: string; begin i_:=l; j:=r; x:=it[(l+r) div 2]; repeat while it[i_]do inc(i_); while x [j] do dec(j); if i_<=j then begin y:=it[i_]; it[i_]:=it[j]; it[j]:=y; inc(i_); dec(j); end; until i_>j; if l then QuickSort(l, j, it); if l then QuickSort(i_, r, it); end; begin QuickSort(1,count,item); end; procedure BinarSearch; {dvoichnyi poisk} var left,right,middle:integer; first,last,kol:integer; s:string; begin repeat write('Nuzhno naiti: '); readln(s); if s='' then writeln('Massiv NE soderzhit pustyh strok! Zadaite druguiu stroku.'); until s<>''; left:=1; right:=N; repeat middle:=left+(right-left) div 2; if A[middle]>s then right:=middle else left:=middle; until right-left<=1; if s=A[left] then last:=left else if s=A[right] then last:=right else last:=0; if last>0 then begin first:=last; kol:=0; repeat if a[first]=a[last] then begin dec(first); inc(kol); end; until a[first]<>a[last]; for i:=first+1 to last do writeln('Pozicia: ',i,'.'); writeln('Vsego sovpadenii ',kol); end else writeln('Nichego NE naideno!'); end; begin {osnovnaia programma} n:=0; textmode(259); TextBackGround(blue); textcolor(yellow); repeat clrscr; writeln('***********************'); writeln('******POISK SLOVA******'); writeln('***********************'); writeln; writeln('Vyberite variant poiska: '); writeln('1 - Polnyi perebor'); writeln('2 - Binarnyi poisk'); writeln; writeln('ESC - EXIT'); writeln('-----------------------'); write('...'); vybor:=readkey; until (vybor='1') or (vybor='2') or (vybor=#27); if vybor=#27 then halt; Flag:=False; case vybor of '1':begin clrscr; writeln('Prochitat iz faila? [y/n]'); ch:=readkey; ch:=upcase(ch); if ch='Y' then begin clrscr; writeln('Vvedite put k failu i ego imia (bez rashirenia): '); readln(path); path:=path+'.txt'; Rez:=ReadFromFile(path); if Rez=False then begin readkey; halt; end; writeln('IN: '+path); writeln('Poluchennye slova: '); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); writeln; write('Press any key to CONTINUE... '); readkey; repeat writeln; PereborSearch; writeln('Prodolzhit? [y/n]'); ch:=readkey; ch:=upcase(ch); if not Flag then begin clrscr; writeln('Vsego slov: ',n); writeln('IN: '+path); writeln('Poluchennye slova: '); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); writeln; end; until ch='N'; end else begin writeln('IN: consol'); writeln('Vvodite elementy. Konec - pustaia stroka:'); Rez:=ReadFromFile(''); if Rez=False then begin readkey; halt; end; writeln('Poluchennye slova: '); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); repeat writeln; PereborSearch; writeln('Prodolzhit? [y/n]'); ch:=readkey; ch:=upcase(ch); if not Flag then begin clrscr; writeln('Vsego slov: ',n); writeln('IN: '+path); writeln('Poluchennye slova: '); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); writeln; end; until ch='N'; end; end; '2':begin clrscr; writeln('Prochitat iz faila? [y/n]'); ch:=readkey; ch:=upcase(ch); if ch='Y' then begin clrscr; writeln('Vvedite put k failu i ego imia (bez rashirenia): '); readln(path); path:=path+'.txt'; Rez:=ReadFromFile(path); if Rez=False then begin readkey; halt; end; writeln('IN: '+path); writeln('Poluchennye slova: '); LexSort(a,n); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); writeln; write('Press any key to CONTINUE... '); writeln; readkey; repeat writeln; BinarSearch; LexSort(a,n); writeln('Prodolzhit? [y/n]'); ch:=readkey; ch:=upcase(ch); until ch='N'; end else begin writeln('IN: consol'); writeln('Vvodite elementy. Konec - pustaia stroka:'); Rez:=ReadFromFile(''); if Rez=False then begin readkey; halt; end; writeln('Poluchennye slova: '); LexSort(a,n); for i:=1 to n do if i=n then write(a[i],'.') else write(a[i],', '); writeln; write('Press any key to CONTINUE... '); readkey; repeat writeln; BinarSearch; writeln('Prodolzhit? [y/n]'); ch:=readkey; ch:=upcase(ch); until ch='N'; end; end; end; write('Pres any key to EXIT... '); readkey; end.
автор: delpas
Поделиться: