У меня вот такая проблема: есть задача, она вроде как решена. Однако преподу не понравились мои методы. А на финальной проверке он мне вообще сказать содрать код с дот нэта ( что-то связанное с классом хэштаблиц), и просто адаптировать этот код под Дэлфи. Вот у меня и вопрос: правильно ли теперь сделан класс( или может кто-то даст мне ссылку на дот нэтовсткие хэштаблицы)?
В работе необходимо создать класс, описанный в задании. Требуется обратить особое внимание на состав членов класса, а также на внутренний формат представления данных. Необходимо предусмотреть возможность тестирования класса. Класс для представления таблицы, элементы которой представляет собой пару «ключ-значение ключа». «Ключ» - строка, «значение ключа» - целое число. Реализовать поиска значения по ключу, подтверждение наличия ключа или значения в таблице, сортировку таблицы по ключу.
type dl=string[30]; TPair=record key:string[30]; value:integer; end; TTable=array of TPair; TDO = class(TObject) private FArray:TTable; Function PodK(n:word;ku:dl):dl; Function PodZ(n:word;zn:integer):dl; public procedure Enter(a:TTable); function QuickSortR(n:word):TTable; function PoiskK(n:integer;k:dl):dl; function PoiskZ(n,za:integer):dl; property masK[n:word;ku:dl]:dl read PodK; property masZ[n:word;zn:integer]:dl read PodZ; end;
Var i,j:integer;n:word;
implementation
Procedure TDo.Enter; begin FArray:=a; end;
Function TDO.QuickSortR; Procedure sort(L,R: word); Var i,j:Word;w:TPair; x:dl; begin i:=L; j:=R; x:=FArray[(L+R) div 2].key; Repeat While FArray[i].key<x do i:=i+1; While FArray[j].key>x do j:=j-1; if i<=j then begin w:=FArray[i]; FArray[i]:=FArray[j]; FArray[j]:=w; i:=i+1; j:=j-1; end; until i>j; if L<j then sort(L,j); if i<R then sort(i,R); end; //sort begin
sort(0,n-1); QuickSortR:=FArray; end;
function TDo.PoiskK; var i:integer;l:dl; begin PoiskK:='net takogo klucha'; for i:=0 to n-1 do if FArray[i].key=k then begin str(FArray[i].value,l); PoiskK:=l; end; end;
function TDo.PoiskZ; var i:integer;l:dl; begin
PoiskZ:='net takoi zapisi'; for i:=0 to n-1 do if FArray[i].value=za then PoiskZ:=FArray[i].key; end;
Function TDo.podK; var i:integer; begin
PodK:='net takogo klucha!'; for i:= 0 to n-1 do if FArray[i].key=ku then PodK:='est kluch!'; end;
Function TDo.podZ; var i:integer; begin
PodZ:='net takogo znachenia!'; for i:= 0 to n-1 do if FArray[i].value=zn then PodZ:='est znachenie!'; end;
end.
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils, Unit2 in 'Unit2.pas';
var a:TTable;n,i:integer;d:TDo;
procedure zadanie(n:integer); Var b:TTable;s,kl,k,pz,pk,ku:Dl;z,za,zn,i:integer; begin writeln('esli vi hotite: - otsortirovat massiv, nazhmite 1'); writeln(' - sovershit poisk po kluchu, nazhmite 2'); writeln(' - sovershit poisk po znacheniu, nazhmite 3'); writeln(' - podtverdit nalichie klucha, nazhmite 4'); writeln(' - podtverdit nalichie znachenia, nazhmite 5'); writeln(' - viiti iz programmi, nazhmite 6'); readln(z); if z=1 then begin setlength(b,n); b:=d.QuickSortR(n); for i:= 0 to n-1 do begin write(b[i].value,' '); writeln(b[i].key); end; b:=nil; zadanie(n); end else if z=2 then begin writeln('vvedite znachenie klucha:'); readln(k); s:=d.PoiskK(n,k); writeln('vvedennomu kluchu sootvetstvuet znachenie: ',s);zadanie(n); end else if z=3 then begin writeln('vvedite znachenie znachenia:'); readln(za); kl:=d.PoiskZ(n,za); writeln('znacheniu sootvetstvuet kluch: ',kl);zadanie(n); end else if z=4 then begin writeln('vvedite znachenie klucha:'); readln(ku); pk:=d.masK[n,ku]; writeln(pk); zadanie(n); end else if z=5 then begin writeln('vvedite znachenie znachenia:'); readln(zn); pz:=d.masZ[n,zn]; writeln(pz); zadanie(n); end else if z=6 then begin d.free; a:=nil; exit; end else begin writeln('net takoi opcii! povtorite popitku!'); zadanie(n); end; end;
begin { TODO -oUser -cConsole Main : Insert code here } writeln('Vvedite kol-vo elementov par zapis-kluch:'); Write('n='); readln(n); setlength(a,n); for i:= 0 to n-1 do begin write('vvedite kluch(stroka):'); readln(a[i].key); write('vvedite znachenie(chislo):'); readln(a[i].value); end; d:=TDo.create; d.Enter(a); zadanie(n); end.