Advertisement
Vernon_Roche

Лабораторная работа 2 АиСД

Mar 26th, 2024 (edited)
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 24.91 KB | None | 0 0
  1. program Lab2_AISD;
  2.  
  3. uses
  4.   System.SysUtils;
  5.  
  6. const
  7.     SegmentCount = 10;
  8.     MIN_PAGE_COUNT = 1;
  9.     MAX_PAGE_COUNT = 10000;
  10.  
  11. type
  12.     PTermListEl = ^TTermListEl;
  13.     PPage = ^TPage;
  14.     TTermListEl = record
  15.         Term: String;
  16.         SubtermList: PTermListEl;
  17.         PagesList: PPage;
  18.         NextTerm: PTermListEl;
  19.     end;
  20.     TPage = record
  21.         Page: Integer;
  22.         NextPage: PPage;
  23.     end;
  24.     TTermsArray = array of PTermListEl;
  25.  
  26. procedure AddSubterm(TermListPointer: PTermListEl; Term: String); forward;
  27. procedure ProcessSubterm(Subterm: String; SubtermListElPointer: PTermListEl); forward;
  28. procedure AddTerm(var TermArray: TTermsArray); forward;
  29.  
  30.  
  31. function makeHash(HashString: String; BacketCount: Integer): Integer;
  32. var
  33.     I, Sum: Integer;
  34. begin
  35.     Sum := 0;
  36.     for I := 1 to High(HashString) do
  37.         Sum := Sum + Ord(HashString[I]);
  38.     Result := Sum mod BacketCount;
  39. end;
  40.  
  41. procedure HashTerm(var TermArray: TTermsArray; Term: String);
  42. var
  43.     Hash: Integer;
  44.     NewTermPointer: PTermListEl;
  45. begin
  46.     Hash := makeHash(Term, Length(TermArray));
  47.     if TermArray[Hash] <> nil then
  48.     begin
  49.         NewTermPointer := TermArray[Hash];
  50.         while NewTermPointer^.NextTerm <> nil do
  51.             NewTermPointer := NewTermPointer.NextTerm;
  52.         New(NewTermPointer^.NextTerm);
  53.         NewTermPointer^.NextTerm^.Term := Term;
  54.         New(NewTermPointer^.NextTerm^.SubtermList);
  55.         NewTermPointer^.NextTerm^.SubtermList^.NextTerm := nil;
  56.         New(NewTermPointer^.NextTerm^.PagesList);
  57.         NewTermPointer^.NextTerm^.PagesList^.NextPage := nil;
  58.         NewTermPointer^.NextTerm^.NextTerm := nil;
  59.     end
  60.     else
  61.     begin
  62.         New(TermArray[Hash]);
  63.         TermArray[Hash].Term := Term;
  64.         New(TermArray[Hash].SubtermList);
  65.         TermArray[Hash].SubtermList^.NextTerm := nil;
  66.         New(TermArray[Hash].PagesList);
  67.         TermArray[Hash].PagesList^.NextPage := nil;
  68.         TermArray[Hash].NextTerm := nil;
  69.     end;
  70. end;
  71.  
  72. procedure MakeTermArray(var TermArray: TTermsArray);
  73. var
  74.     I: Integer;
  75. begin
  76.     SetLength(TermArray, SegmentCount);
  77.     for I := 0 to High(TermArray) do
  78.         TermArray[I] := nil;
  79. end;
  80.  
  81. procedure OutputMainMenu;
  82. begin
  83.     Writeln('--------------------------------------------------------');
  84.     Writeln('1. Просмотреть предметный указатель (по алфавиту)');
  85.     Writeln('2. Просмотреть предметный указатель (отсортированный по номерам страниц)');
  86.     Writeln('3. Добавить термин');
  87.     Writeln('4. Редактировать термин');
  88.     Writeln('5. Удалить термин');
  89.     Writeln('6. Поиск терминов по подтермину');
  90.     Writeln('7. Поиск подтермина по термину');
  91.     Writeln('8. Выход');
  92.     Writeln('--------------------------------------------------------');
  93.     Writeln('Выберите желаемое действие:');
  94. end;
  95.  
  96. procedure OutputEditTermMenu;
  97. begin
  98.     Writeln('--------------------------------------------------------');
  99.     Writeln('1. Добавить подтермин');
  100.     Writeln('2. Редактировать подтермин');
  101.     Writeln('3. Удалить подтермин');
  102.     Writeln('4. Добавить номер страницы');
  103.     Writeln('5. Завершить');
  104.     Writeln('--------------------------------------------------------');
  105.     Writeln('Выберите желаемое действие:');
  106. end;
  107.  
  108. function InputNum(Min, Max: Integer): Integer;
  109. var
  110.     Num: Integer;
  111.     IsCorrect: Boolean;
  112. begin
  113.     repeat
  114.         IsCorrect := True;
  115.         try
  116.             Readln(Num);
  117.         except
  118.             Writeln('Некорректный ввод! Попробуйте еще:');
  119.             IsCorrect := False;
  120.         end;
  121.         if IsCorrect and ((Num < Min) or (Num > Max)) then
  122.         begin
  123.             Writeln('Некорректный ввод! Попробуйте еще:');
  124.             IsCorrect := False;
  125.         end;
  126.     until IsCorrect;
  127.     InputNum := Num;
  128. end;
  129.  
  130. {Олег
  131.     Никита
  132.         Рустам
  133. Блять
  134.     Рустам}
  135.  
  136. procedure InsertElementInAlphabet(Header: PTermListEl; NewTermin : String; NewSubTermInList : PTermListEl; NewPageList : PPage);
  137. var
  138.     Curr, Temp: PTermListEl;
  139. begin
  140.     Curr := Header;
  141.     while (Curr^.NextTerm <> nil) and (Curr^.NextTerm^.Term <= NewTermin) do
  142.         Curr := Curr^.NextTerm;
  143.  
  144.     New(Temp);
  145.     Temp^.NextTerm := Curr^.NextTerm;
  146.     Curr^.NextTerm := Temp;
  147.     Temp^.Term := NewTermin;
  148.     Temp^.SubTermList := NewSubTermInList;
  149.     Temp^.PagesList := NewPageList;
  150. end;
  151.  
  152. function InitializeList(): PTermListEl;
  153. var
  154.     Header: PTermListEl;
  155. begin
  156.     New(Header);
  157.     Header^.NextTerm := nil;
  158.     InitializeList := Header;
  159. end;
  160.  
  161. function TurnArrayToSortedAlpabetList(TermArray : TTermsArray) : PTermListEl;
  162. Var
  163.     I : Integer;
  164.     SortedList : PTermListEl;
  165.     TempArray : TTermsArray;
  166. Begin
  167.     SortedList := InitializeList();
  168.     TempArray := Copy(TermArray);
  169.     for I := 0 to High(TempArray) do
  170.         if TempArray[I] <> nil then
  171.         Repeat
  172.             InsertElementInAlphabet(SortedList, TempArray[I]^.Term, TempArray[I]^.SubTermList,TempArray[I]^.PagesList);
  173.             TempArray[I] := TempArray[I].NextTerm;
  174.         Until TempArray[I] = Nil;
  175.     Result := SortedList;
  176. End;
  177.  
  178. procedure OutputSubterm(Subterm: PTermListEl; Padding: String);
  179. var
  180.     PageList: PPage;
  181.     Temp: PTermListEl;
  182. begin
  183.     if Subterm = nil then
  184.         Exit
  185.     else
  186.     begin
  187.         Write(Padding + Subterm^.Term + '| ');
  188.         PageList := Subterm^.PagesList^.NextPage;
  189.         while PageList <> nil do
  190.         begin
  191.             Write(PageList^.Page, ' ');
  192.             PageList := PageList^.NextPage;
  193.         end;
  194.         Writeln;
  195.         Temp := Subterm^.SubTermList;
  196.         while Temp^.NextTerm <> nil do
  197.         begin
  198.             OutputSubterm(Temp^.NextTerm, Padding + '    ');
  199.             Temp := Temp^.NextTerm;
  200.         end;
  201.     end;
  202. end;
  203.  
  204. procedure OutputList(Header: PTermListEl);
  205. var
  206.     Term, Subterm: PTermListEl;
  207.     PageList: PPage;
  208. begin
  209.     if Header^.NextTerm = nil then
  210.         Writeln('Предметный указатель не заполнен!')
  211.     else
  212.     begin
  213.         Writeln('ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ');
  214.         Term := Header^.NextTerm;
  215.         repeat
  216.             Writeln('----------------------------');
  217.             Write(Term^.Term + '| ');
  218.             PageList := Term^.PagesList^.NextPage;
  219.             while PageList <> nil do
  220.             begin
  221.                 Write(PageList^.Page, ' ');
  222.                 PageList := PageList^.NextPage;
  223.             end;
  224.             if (Term^.SubtermList^.NextTerm <> nil) then
  225.             begin
  226.                 Writeln;
  227.                 Subterm := Term^.SubtermList^.NextTerm;
  228.                 while Subterm <> nil do
  229.                 begin
  230.                     OutputSubterm(Subterm, '    ');
  231.                     Subterm := Subterm^.NextTerm;
  232.                 end;
  233.             end
  234.             else
  235.                 Writeln;
  236.             Writeln('----------------------------');
  237.             Term := Term^.NextTerm;
  238.         until Term = nil;
  239.     end;
  240. end;
  241.  
  242. procedure OutputListInAlphabet(TermArray : TTermsArray);
  243. Var
  244.     SortedList : PTermListEl;
  245. Begin
  246.     SortedList := TurnArrayToSortedAlpabetList(TermArray);
  247.     OutputList(SortedList);
  248. End;
  249.  
  250. function IsInTermsArray(var TermArray: TTermsArray; CheckedTerm: String): Boolean;
  251. var
  252.     IsInArray: Boolean;
  253.     I: Integer;
  254.     CheckedTermPointer: PTermListEl;
  255. begin
  256.     I := 0;
  257.     IsInArray := False;
  258.     while not IsInArray and (I <= High(TermArray)) do
  259.     begin
  260.         CheckedTermPointer := TermArray[makeHash(CheckedTerm, Length(TermArray))];
  261.         while not IsInArray and (CheckedTermPointer <> nil) do
  262.         begin
  263.             IsInArray := CheckedTerm = CheckedTermPointer.Term;
  264.             CheckedTermPointer := CheckedTermPointer.NextTerm;
  265.         end;
  266.         Inc(I);
  267.     end;
  268.     Result := IsInArray;
  269. end;
  270.  
  271. procedure InsertElementByPage(Header: PTermListEl; NewTermin : String; NewSubTermInList : PTermListEl; NewPageList : PPage);
  272. var
  273.     Curr, Temp: PTermListEl;
  274. begin
  275.     Curr := Header;
  276.     while (Curr^.NextTerm <> nil) and (Curr^.NextTerm^.PagesList^.NextPage^.Page <= NewPageList^.NextPage^.Page) do
  277.         Curr := Curr^.NextTerm;
  278.  
  279.     New(Temp);
  280.     Temp^.NextTerm := Curr^.NextTerm;
  281.     Curr^.NextTerm := Temp;
  282.     Temp^.Term := NewTermin;
  283.     Temp^.SubTermList := NewSubTermInList;
  284.     Temp^.PagesList := NewPageList;
  285. end;
  286.  
  287. function TurnArrayToSorteByPageList(TermArray : TTermsArray) : PTermListEl;
  288. Var
  289.     I : Integer;
  290.     SortedList : PTermListEl;
  291.     TempArray : TTermsArray;
  292. Begin
  293.     SortedList := InitializeList();
  294.     TempArray := Copy(TermArray);
  295.     for I := 0 to High(TempArray) do
  296.         if TempArray[I] <> nil then
  297.             Repeat
  298.                 InsertElementByPage(SortedList, TempArray[I]^.Term, TempArray[I]^.SubTermList, TempArray[I]^.PagesList);
  299.                 TempArray[I] := TempArray[I]^.NextTerm;
  300.             Until TempArray[I] = Nil ;
  301.     Result := SortedList;
  302. End;
  303.  
  304. procedure OutputListByPages(TermArray : TTermsArray);
  305. Var
  306.     SortedList : PTermListEl;
  307. Begin
  308.     SortedList := TurnArrayToSorteByPageList(TermArray);
  309.     OutputList(SortedList);
  310. End;
  311.  
  312. {procedure AddSubterm(var TermListElPointer: PTermListEl);
  313. var
  314.     Term: PTermListEl;
  315. begin
  316.     Writeln('Введите подтермин: ');
  317.     Readln(Term);
  318. end;}
  319.  
  320. procedure SearchTermBySubTerm(TermArray : TTermsArray; SubTermin : String);
  321. Var
  322.     I, Count : Integer;
  323.     TempArray : TTermsArray;
  324.     Curr : PTermListEL;
  325.     CurrSub : PTermListEl;
  326. Begin
  327.     Count := 0;
  328.     Writeln('Термины, связанные с данным подтермином :');
  329.     TempArray := Copy(TermArray);
  330.     for I := 0 to High(TempArray) do
  331.         if TempArray[I] <> Nil then
  332.             Repeat
  333.                 Curr := TempArray[I]^.SubtermList;
  334.                 while Curr^.NextTerm <> Nil do
  335.                 Begin
  336.                     If Curr^.NextTerm^.Term = SubTermin then
  337.                     Begin
  338.                         Inc(Count);
  339.                         Writeln(TempArray[I]^.Term);
  340.                         Break;
  341.                     End;
  342.                     CurrSub := Curr^.NextTerm^.SubtermList;
  343.                     while CurrSub^.NextTerm <> Nil do
  344.                     Begin
  345.                         if CurrSub^.NextTerm^.Term = SubTermin then
  346.                         Begin
  347.                             Inc(Count);
  348.                             Writeln(TempArray[I]^.Term);
  349.                             break;
  350.                         End;
  351.                         CurrSub := CurrSub^.NextTerm;
  352.                     End;
  353.                     Curr := Curr^.NextTerm;
  354.                 End;
  355.                 TempArray[I] := TempArray[I]^.NextTerm;
  356.             Until TempArray[I] = Nil;
  357.         if Count = 0 then
  358.             Writeln('Нет терминов, связанных с даннымм подтермином!');
  359. End;
  360.  
  361. procedure SearhSubTermByTerm(TermArray : TTermsArray; Termin : String);
  362. Var
  363.     Hash : Integer;
  364.     TempArray : TTermsArray;
  365.     Curr, CurrSub : PTermListEl;
  366. Begin
  367.     Hash := MakeHash(Termin, Length(TermArray));
  368.     TempArray := Copy(TermArray);
  369.     if TempArray[Hash] = Nil then
  370.         Writeln('Данного термина не существует')
  371.     Else
  372.     Begin
  373.         Writeln('Подтермины ', Termin,':');
  374.         Repeat
  375.             Curr := TempArray[Hash]^.SubtermList;
  376.             if Curr^.NextTerm = Nil then
  377.             Begin
  378.                 Writeln('У термина нет подтерминов');
  379.                 break;
  380.             End;
  381.             while (Curr^.NextTerm <> Nil) do
  382.             Begin
  383.                 Writeln('  ' + Curr^.NextTerm^.Term);
  384.                 CurrSub := Curr^.NextTerm^.SubtermList;
  385.                 while (CurrSub^.NextTerm <> Nil)  do
  386.                 Begin
  387.                     Writeln('    ' + CurrSub^.NextTerm^.Term);
  388.                     CurrSub := CurrSub^.NextTerm;
  389.                 End;
  390.                 Curr := Curr^.NextTerm;
  391.             End;
  392.             TempArray[Hash] := TempArray[Hash]^.NextTerm;
  393.         Until TempArray[Hash] = Nil ;
  394.     End;
  395. End;
  396.  
  397. function FindPointerToTerm(TermArray : TTermsArray; Term : String) : PTermListEl;
  398. Var
  399.     Hash : Integer;
  400.     TempArray : TTermsArray;
  401.     IsFinded : Boolean;
  402.     Res : PTermListEl;
  403. Begin
  404.     IsFinded := False;
  405.     Res := Nil;
  406.     TempArray := Copy(TermArray);
  407.     Hash := MakeHash(Term, Length(TempArray));
  408.     if TempArray[Hash] = nil then
  409.     Begin
  410.         Writeln('Данного термина не существует');
  411.         FindPointerToTerm := Res;
  412.         Exit;
  413.     End;
  414.     Repeat
  415.         if TempArray[Hash]^.Term = Term then
  416.             Begin
  417.                 Res := TempArray[Hash];
  418.                 IsFinded := True;
  419.             End;
  420.         TempArray[Hash] := TempArray[Hash]^.NextTerm;
  421.     Until (TempArray[Hash] = Nil) And (IsFinded);
  422.     if Res = Nil then
  423.         Writeln('Данного термина не существует');
  424.     FindPointerToTerm := Res;
  425. End;
  426.  
  427. function FindPointerToSubTerm(SubTermList : PTermListEl; Subterm : String) : PTermListEl;
  428. Var
  429.     Curr, Res : PTermListEl;
  430.     IsFinded : Boolean;
  431. Begin
  432.     Curr := SubTermList;
  433.     IsFinded := False;
  434.     Res := Nil;
  435.     while (Curr^.NextTerm <> Nil) And (Not IsFinded) do
  436.     Begin
  437.         if Curr^.NextTerm^.Term = Subterm then
  438.         Begin
  439.             IsFinded := True;
  440.             Res := Curr^.NextTerm;
  441.         End;
  442.         Curr := Curr^.NextTerm;
  443.     End;
  444.     if Not IsFinded then
  445.     Begin
  446.         Writeln('Данного подтермина не существует');
  447.         Res := Nil;
  448.     End;
  449.     FindPointerToSubTerm := Res;
  450. End;
  451.  
  452. procedure AddInPageList(var PagesList: PPage; NewPage: Integer);
  453. var
  454.     Temp, LnkablePointer: PPage;
  455. begin
  456.     if PagesList <> nil then
  457.     begin
  458.         Temp := PagesList;
  459.         while (Temp^.NextPage <> nil) and (Temp^.NextPage^.Page < NewPage) do
  460.             Temp := Temp^.NextPage;
  461.         LnkablePointer := Temp^.NextPage;
  462.         New(Temp^.NextPage);
  463.         Temp := Temp^.NextPage;
  464.         Temp^.Page := NewPage;
  465.         Temp^.NextPage := LnkablePointer;
  466.     end
  467.     else
  468.     begin
  469.         New(PagesList);
  470.         PagesList^.Page := NewPage;
  471.         PagesList^.NextPage := nil;
  472.     end;
  473. end;
  474.  
  475. function IsPageInList(PagesList: PPage; CheckedPage: Integer): Boolean;
  476. var
  477.     IsInList: Boolean;
  478. begin
  479.     IsInList := False;
  480.     PagesList := PagesList^.NextPage;
  481.     while PagesList <> nil do
  482.     begin
  483.         IsInList := PagesList^.Page = CheckedPage;
  484.         PagesList := PagesList^.NextPage;
  485.     end;
  486.     Result := IsInList;
  487. end;
  488.  
  489. procedure AddPage(var TermArray: TTermsArray; Term: String);
  490. var
  491.     Temp: PTermListEl;
  492.     NewPage: Integer;
  493. begin
  494.     Writeln('Введите страницу: ');
  495.     NewPage := InputNum(MIN_PAGE_COUNT, MAX_PAGE_COUNT);
  496.     Temp := TermArray[makeHash(Term, Length(TermArray))];
  497.     while Temp^.Term <> Term do
  498.         Temp := Temp^.NextTerm;
  499.     if not IsPageInList(Temp^.PagesList, NewPage) then
  500.         AddInPageList(Temp^.PagesList, NewPage)
  501.     else
  502.         Writeln('Страница уже есть в списке, добавление невозможно.');
  503. end;
  504.  
  505. function IsPage(TermArray: TTermsArray; Term: String): Boolean;
  506. var
  507.     IsPageInTerm: Boolean;
  508.     Temp: PTermListEl;
  509. begin
  510.     Temp := TermArray[makeHash(Term, Length(TermArray))];
  511.     while Temp^.Term <> Term do
  512.         Temp := Temp^.NextTerm;
  513.     IsPageInTerm := not (Temp^.PagesList^.NextPage = nil);
  514.     IsPage := IsPageInTerm;
  515. end;
  516.  
  517. function IsInSubtermList(TermListPointer : PTermListEl; Subterm : String) : Boolean;
  518. Var
  519.     Verdict : Boolean;
  520.     Temp: PTermListEl;
  521. Begin
  522.     Verdict := False;
  523.     Temp := TermListPointer^.SubtermList;
  524.     While ((Temp^.NextTerm <> Nil) And (Not Verdict)) do
  525.     Begin
  526.         if (Temp^.NextTerm^.Term = Subterm) then
  527.             Verdict := True;
  528.         Temp := Temp^.NextTerm;
  529.     End;
  530.     IsInSubtermList := Verdict;
  531. End;
  532.  
  533. procedure AddSubtermPage(PagesListPointer: PPage);
  534. var
  535.     NewPage: Integer;
  536. begin
  537.     Writeln('Введите страницу: ');
  538.     NewPage := InputNum(MIN_PAGE_COUNT, MAX_PAGE_COUNT);
  539.     if not IsPageInList(PagesListPointer, NewPage) then
  540.         AddInPageList(PagesListPointer, NewPage)
  541.     else
  542.         Writeln('Страница уже есть в списке, добавление невозможно.');
  543. end;
  544.  
  545. function IsSubtermPage(PagesListPointer: PPage; Term: String): Boolean;
  546. var
  547.     IsPageInTerm: Boolean;
  548. begin
  549.     IsPageInTerm := not (PagesListPointer^.NextPage = nil);
  550.     IsSubtermPage := IsPageInTerm;
  551. end;
  552.  
  553. function AddInList(TermListPointer : PTermListEl; Subterm : String) : PTermListEl;
  554. Var
  555.     Curr, Temp: PTermListEl;
  556. Begin
  557.     Curr := TermListPointer^.SubtermList;
  558.     while (Curr^.NextTerm <> Nil) And (Curr^.NextTerm^.Term <= Subterm) do
  559.         Curr := Curr^.NextTerm;
  560.     New(Temp);
  561.     Temp^.NextTerm := Curr^.NextTerm;
  562.     Curr^.NextTerm := Temp;
  563.     Temp^.Term := Subterm;
  564.     New(Temp^.SubtermList);
  565.     Temp^.SubtermList^.NextTerm := nil;
  566.     New(Temp^.PagesList);
  567.     Temp^.PagesList^.NextPage := nil;
  568.     AddInList := Temp;
  569.  
  570. End;
  571.  
  572. procedure AddSubterm(TermListPointer: PTermListEl; Term: String);
  573. var
  574.     Subterm: String;
  575.     Choice: Integer;
  576.     NewListElPointer: PTermListel;
  577.     IsPageBeenAdded : Boolean;
  578. begin
  579.     while TermListPointer^.Term <> Term do
  580.         TermListPointer := TermListPointer^.NextTerm;
  581.     Writeln('Введите подтермин: ');
  582.     Readln(Subterm);
  583.     if not IsInSubtermList(TermListPointer, Term) then
  584.     begin
  585.         NewListElPointer := AddInList(TermListPointer, Subterm);
  586.         ProcessSubterm(Subterm, NewListElPointer);
  587.     end
  588.     else
  589.         Writeln ('Ошибка добавления! Такой термин уже есть в алфавитном указателе.')
  590. end;
  591.  
  592. procedure EditSubterm(SubTermPointer: PTermListEl; Subterm: String);
  593. var
  594.     TermPointer: PTermListEl;
  595. begin
  596.     Writeln('Введите подтермин, который хотите изменить:');
  597.     Readln(Subterm);
  598.     TermPointer := FindPointerToSubTerm(SubTermPointer, Subterm);
  599.     if TermPointer <> nil then
  600.         ProcessSubterm(Subterm, SubTermPointer);
  601. end;
  602.  
  603. procedure DelSubterm(SubtermList: PTermListEl; Subterm: String);
  604. var
  605.     Temp, Temp2: PTermListEl;
  606. begin
  607.     Temp := FindpointerToSubterm(SubtermList, Subterm);
  608.     if Temp <> nil then
  609.     begin
  610.         Temp2 := SubtermList;
  611.         while Temp2^.NextTerm <> Temp do
  612.             Temp2 := Temp2^.NextTerm;
  613.         Temp2^.NextTerm := Temp2^.NextTerm^.NextTerm;
  614.         Dispose(Temp);
  615.     end
  616. end;
  617.  
  618. procedure DeleteSubterm(SubtermList: PTermListEl);
  619. var
  620.     Subterm: String;
  621. begin
  622.     Writeln('Введите термин, который хотите удалить:');
  623.     Readln(Subterm);
  624.     if FindPointerToSubterm(SubtermList, Subterm) <> nil then
  625.         DelSubterm(SubtermList, Subterm);
  626. end;
  627.  
  628. procedure ProcessSubterm(Subterm: String; SubtermListElPointer: PTermListEl);
  629. var
  630.     Choice: Integer;
  631.     IsPageBeenAdded: Boolean;
  632. begin
  633.     repeat
  634.         Writeln('--------------------------------------------------------');
  635.         Writeln('РЕДАКТОР ПОДТЕРМИНА ' + Subterm);
  636.         OutputEditTermMenu;
  637.         Choice := InputNum(1, 5);
  638.         case Choice of
  639.             1: AddSubterm(SubtermListElPointer, Subterm);
  640.             2: EditSubterm(SubtermListElPointer^.NextTerm^.SubtermList, Subterm);
  641.             3: DeleteSubterm(SubtermListElPointer^.NextTerm^.SubtermList);
  642.             4: AddSubtermPage(SubtermListElPointer^.PagesList);
  643.             5:;
  644.         end;
  645.         IsPageBeenAdded := IsSubtermPage(SubtermListElPointer^.PagesList, Subterm);
  646.         if (not IsPageBeenAdded) And (Choice = 5) then
  647.                 Writeln('Ошибка! Подтермин не может быть добавлен без страниц.');
  648.     until (Choice = 5);
  649. end;
  650.  
  651. procedure ProcessTerm(Term: String; TermArray: TTermsArray);
  652. var
  653.     Choice: Integer;
  654. begin
  655.     repeat
  656.         Writeln('--------------------------------------------------------');
  657.         Writeln('РЕДАКТОР ТЕРМИНА ' + Term);
  658.         OutputEditTermMenu;
  659.         Choice := InputNum(1, 5);
  660.         case Choice of
  661.             1: AddSubterm(TermArray[MakeHash(Term, Length(TermArray))], Term);
  662.             2: EditSubterm(TermArray[MakeHash(Term, Length(TermArray))]^.SubtermList, Term);
  663.             3: DeleteSubterm(TermArray[MakeHash(Term, Length(TermArray))]^.SubtermList);
  664.             4: AddPage(TermArray, Term);
  665.             5:;
  666.         end;
  667.     until (Choice = 5);
  668. end;
  669.  
  670. procedure AddTerm(var TermArray: TTermsArray);
  671. var
  672.     Term: String;
  673.     IsPageBeenAdded : Boolean;
  674.     NewTerm : PTermListEl;
  675.     Choice: Integer;
  676. begin
  677.     IsPageBeenAdded := False;
  678.     Writeln('Введите термин: ');
  679.     Readln(Term);
  680.     if not IsInTermsArray(TermArray, Term) then
  681.     begin
  682.         HashTerm(TermArray, Term);
  683.         repeat
  684.             Writeln('--------------------------------------------------------');
  685.             Writeln('РЕДАКТОР ТЕРМИНА ' + Term);
  686.             OutputEditTermMenu;
  687.             Choice := InputNum(1, 6);
  688.             case Choice of
  689.                 1: AddSubterm(TermArray[MakeHash(Term, Length(TermArray))], Term);
  690.                 2: EditSubterm(TermArray[MakeHash(Term, Length(TermArray))]^.SubtermList, Term);
  691.                 3: DeleteSubterm(TermArray[MakeHash(Term, Length(TermArray))]^.SubtermList);
  692.                 4: AddPage(TermArray, Term);
  693.                 5:;
  694.             end;
  695.             IsPageBeenAdded := IsPage(TermArray, Term);
  696.             if (not IsPageBeenAdded) And (Choice = 5) then
  697.                 Writeln('Ошибка! Термин не может быть добавлен без страниц.');
  698.         until (IsPageBeenAdded) And (Choice = 5);
  699.     end
  700.     else
  701.         Writeln ('Ошибка добавления! Такой термин уже есть в алфавитном указателе.')
  702. end;
  703.  
  704. procedure DeleteTerm(TermArray: TTermsArray; Term: String);
  705. var
  706.     Temp, Temp2: PTermListEl;
  707.     Hash: Integer;
  708. begin
  709.     Temp := FindpointerToTerm(TermArray, Term);
  710.     if Temp <> nil then
  711.     begin
  712.         Hash := makeHash(Term, Length(TermArray));
  713.         if TermArray[Hash]^.Term = Term then
  714.         begin
  715.             Temp := TermArray[Hash];
  716.             TermArray[Hash] := TermArray[Hash]^.NextTerm;
  717.             Dispose(Temp);
  718.         end
  719.         else
  720.         begin
  721.             Temp := TermArray[Hash];
  722.             while Temp^.NextTerm^.Term <> Term do
  723.                 Temp := Temp^.NextTerm;
  724.             Temp2 := Temp^.NextTerm^.NextTerm;
  725.             Dispose(Temp^.NextTerm);
  726.             Temp^.NextTerm := Temp2;
  727.         end;
  728.     end
  729. end;
  730.  
  731. procedure EditTerm(TermArray: TTermsArray);
  732. var
  733.     Term: String;
  734.     TermPointer: PTermListEl;
  735. begin
  736.     Writeln('Введите термин, который хотите изменить:');
  737.     Readln(Term);
  738.     TermPointer := FindpointerToTerm(TermArray, Term);
  739.     if TermPointer <> nil then
  740.         ProcessTerm(Term, TermArray);
  741. end;
  742.  
  743. procedure SearchByTerm(TermArray: TTermsArray);
  744. var
  745.     Term: String;
  746. begin
  747.     Writeln('Введите подтермин, по которому хотите производить поиск:');
  748.     Readln(Term);
  749.     SearchTermBySubTerm(TermArray, Term);
  750. end;
  751.  
  752. procedure SearchBySuberm(TermArray: TTermsArray);
  753. var
  754.     Subterm: String;
  755. begin
  756.     Writeln('Введите термин, по которому хотите производить поиск:');
  757.     Readln(Subterm);
  758.     SearhSubTermByTerm(TermArray, Subterm);
  759. end;
  760.  
  761. procedure DeleteTermAction(TermArray: TTermsArray);
  762. var
  763.     Term: String;
  764.     TermPointer: PTermListEl;
  765. begin
  766.     Writeln('Введите термин, который хотите удалить:');
  767.     Readln(Term);
  768.     TermPointer := FindPointerToTerm(TermArray, Term);
  769.     if TermPointer <> nil then
  770.         DeleteTerm(TermArray, Term);
  771. end;
  772.  
  773. var
  774.     TermArray: TTermsArray;
  775.     I, Choice: Integer;
  776.     TermName: String;
  777. begin
  778.     MakeTermArray(TermArray);
  779.     Writeln('Данная программа - предметный указатель');
  780.     repeat
  781.         OutputMainMenu;
  782.         Choice := InputNum(1, 8);
  783.         case Choice of
  784.             1: OutputListInAlphabet(TermArray);
  785.             2: OutputListByPages(TermArray);
  786.             3: AddTerm(TermArray);
  787.             4: EditTerm(TermArray);
  788.             5: DeleteTermAction(TermArray);
  789.             6: SearchByTerm(TermArray);
  790.             7: SearchBySuberm(TermArray);
  791.             8:;
  792.         end;
  793.     until Choice = 8;
  794. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement