Advertisement
THOMAS_SHELBY_18

Untitled

Mar 26th, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.88 KB | None | 0 0
  1. program Lab2;
  2.  
  3. uses
  4. System.SysUtils;
  5.  
  6. const
  7. SegmentCount = 10;
  8.  
  9. type
  10. PPages = ^PagesListElem;
  11. PagesListElem = record
  12. PageValue: Word;
  13. NextPage: PPages;
  14. end;
  15.  
  16. PTerm = ^TermListElem;
  17. TermListElem = record
  18. TermValue: String;
  19. Subterm: PTerm;
  20. Pages: PPages;
  21. NextTerm: PTerm;
  22. end;
  23.  
  24. PHeader = ^PSegmentListHeader;
  25. PSegmentListHeader = record
  26. FirstTerm: PTerm;
  27. end;
  28.  
  29. THashTable = array [0..SegmentCount-1] of PHeader;
  30.  
  31. var
  32. Choice: Integer;
  33. NewTerm: PTerm;
  34. //Header: PHeader;
  35. TermName: String;
  36. HashTable: THashTable;
  37.  
  38.  
  39.  
  40. procedure OutputMainMenu;
  41. begin
  42. Writeln('--------------------------------------------------------');
  43. Writeln('1. Просмотреть предметный указатель');
  44. Writeln('2. Добавить термин');
  45. Writeln('3. Редактировать термин');
  46. Writeln('4. Удалить термин');
  47. Writeln('5. Поиск терминов по подтермину');
  48. Writeln('6. Поиск подтермина по термину');
  49. Writeln('7. Отсортировать термины по алфавиту');
  50. Writeln('8. Отсортировать термины по номерам страниц');
  51. Writeln('9. Выход');
  52. Writeln('--------------------------------------------------------');
  53. Writeln('Выберите желаемое действие:');
  54. end;
  55.  
  56. procedure OutputEditTermMenu;
  57. begin
  58. Writeln('--------------------------------------------------------');
  59. Writeln('1. Добавить подтермин');
  60. Writeln('2. Редактировать подтермин');
  61. Writeln('3. Удалить подтермин');
  62. Writeln('4. Добавить номер страницы');
  63. Writeln('5. Удалить номер страницы');
  64. Writeln('6. Завершить');
  65. Writeln('--------------------------------------------------------');
  66. Writeln('Выберите желаемое действие:');
  67. end;
  68.  
  69. function InputChoice(Min, Max: Integer): Integer;
  70. var
  71. Num: Integer;
  72. IsCorrect: Boolean;
  73. begin
  74. repeat
  75. IsCorrect := True;
  76. try
  77. Readln(Num);
  78. except
  79. Writeln('Некорректный ввод! Попробуйте еще:');
  80. IsCorrect := False;
  81. end;
  82. if IsCorrect and ((Num < Min) or (Num > Max)) then
  83. begin
  84. Writeln('Некорректный ввод! Попробуйте еще:');
  85. IsCorrect := False;
  86. end;
  87. until IsCorrect;
  88. InputChoice := Num;
  89. end;
  90.  
  91. function HasTermListThisTerm (Header: PHeader; NewTermValue: String): Boolean;
  92. var
  93. HasThisTerm: Boolean;
  94. Head: PTerm;
  95. begin
  96. HasThisTerm := False;
  97. if Header^.FirstTerm <> nil then
  98. begin
  99. Head := Header^.FirstTerm;
  100. repeat
  101. if Head^.TermValue = NewTermValue then
  102. begin
  103. HasThisTerm := True;
  104. Break;
  105. end;
  106. Head := Head^.NextTerm;
  107. until Head = nil;
  108.  
  109. if HasThisTerm then
  110. Writeln('Такой термин уже существует');
  111. end;
  112.  
  113. HasTermListThisTerm := HasThisTerm;
  114. end;
  115.  
  116. function HasThisTerm(HashTable: THashTable; NewTermValue: String);
  117. var
  118. HasTerm: Boolean;
  119. I: Integer;
  120. begin
  121. HasTerm := False;
  122. I := 0;
  123. repeat
  124. HasTerm := HasTermListThisTerm (HashTable[I], NewTermValue);
  125. Inc(I);
  126. until HasTerm and (I = SegmentCount);
  127. HasThisTerm := HasTerm;
  128. end;
  129.  
  130. procedure AddTerm(Header: PHeader; Term: PTerm);
  131. var
  132. Head: PTerm;
  133. begin
  134. if Header^.FirstTerm <> nil then
  135. begin
  136. Head := Header^.FirstTerm;
  137. while Head^.NextTerm <> nil do
  138. Head := Head^.NextTerm;
  139. Head^.NextTerm := Term;
  140. end
  141. else
  142. Header^.FirstTerm := Term;
  143.  
  144. Writeln('Термин добавлен успешно!');
  145. end;
  146.  
  147. function HasSubtermListThisSubterm(Term: PTerm; NewSubtermValue: String): Boolean;
  148. var
  149. Curr: PTerm;
  150. HasThisSubterm: Boolean;
  151. begin
  152. HasThisSubterm := False;
  153. Curr := Term^.Subterm;
  154. if Curr <> nil then
  155. begin
  156. repeat
  157. if Curr^.TermValue = NewSubtermValue then
  158. begin
  159. HasThisSubterm := True;
  160. Break;
  161. end;
  162. Curr := Curr^.NextTerm;
  163. until Curr = nil;
  164. end;
  165.  
  166. HasSubtermListThisSubterm := HasThisSubterm;
  167. end;
  168.  
  169. function CreateSubterm(Value: String): PTerm;
  170. var
  171. NewSubterm: PTerm;
  172. begin
  173. New(NewSubterm);
  174. NewSubterm^.TermValue := Value;
  175. NewSubterm^.Subterm := nil;
  176. NewSubterm^.Pages := nil;
  177. NewSubterm^.NextTerm := nil;
  178.  
  179. CreateSubterm := NewSubterm;
  180. end;
  181.  
  182. function CreatePage(PageValue: Word): PPages;
  183. var
  184. Page: PPages;
  185. begin
  186. New(Page);
  187. Page^.PageValue := PageValue;
  188. Page^.NextPage := nil;
  189.  
  190. CreatePage := Page;
  191. end;
  192.  
  193. procedure AddPage(NewTerm: PTerm);
  194. var
  195. Page: Word;
  196. Curr, Temp: PPages;
  197. begin
  198. Writeln('Введите страницу с термином:');
  199. Page := InputChoice(0, 65000);
  200.  
  201. if NewTerm^.Pages = nil then
  202. begin
  203. NewTerm^.Pages := CreatePage(Page);
  204. Writeln('Страница добавлена успешно!');
  205. end
  206. else
  207. begin
  208. Curr := NewTerm^.Pages;
  209. if Page <= Curr^.PageValue then
  210. begin
  211. if Curr^.PageValue = Page then
  212. begin
  213. Writeln('Такая страница уже указана!');
  214. Exit;
  215. end
  216. else
  217. begin
  218. NewTerm^.Pages^.NextPage := CreatePage(NewTerm^.Pages^.PageValue);
  219. NewTerm^.Pages^.PageValue := Page;
  220. end;
  221. end
  222. else
  223. begin
  224. while (Curr^.NextPage <> nil) and (Curr^.NextPage^.PageValue < Page) do
  225. begin
  226. if Curr^.NextPage^.PageValue = Page then
  227. begin
  228. Writeln('Такая страница уже указана!');
  229. Exit;
  230. end;
  231. Curr := Curr^.NextPage;
  232. end;
  233.  
  234. if Curr^.NextPage = nil then
  235. Curr^.NextPage := CreatePage(Page)
  236. else
  237. begin
  238. Temp := CreatePage(Page);
  239. Temp^.NextPage := Curr^.NextPage;
  240. Curr^.NextPage := Temp;
  241. end;
  242. end;
  243. Writeln('Страница добавлена успешно!');
  244. end;
  245. end;
  246.  
  247. procedure DeletePage(NewTerm: PTerm);
  248. var
  249. Page: Word;
  250. Curr, Temp: PPages;
  251. begin
  252. Writeln('Введите страницу с термином:');
  253. Page := InputChoice(0, 65000);
  254.  
  255. if NewTerm^.Pages = nil then
  256. begin
  257. Writeln('Термин не указан ни на одной из страниц!');
  258. Exit;
  259. end
  260. else
  261. begin
  262. Curr := NewTerm^.Pages;
  263. if Curr^.PageValue = Page then
  264. begin
  265. NewTerm^.Pages := Curr^.NextPage;
  266. Dispose(Curr);
  267. Writeln('Удаление страницы успешно!');
  268. end
  269. else
  270. begin
  271. while (Curr^.NextPage <> nil) and (Curr^.NextPage^.PageValue <> Page) do
  272. Curr := Curr^.NextPage;
  273.  
  274. if (Curr^.NextPage <> nil) and (Curr^.NextPage^.PageValue = Page) then
  275. begin
  276. Temp := Curr^.NextPage;
  277. Curr^.NextPage := Temp^.NextPage;
  278. Dispose(Temp);
  279. Writeln('Удаление страницы успешно!');
  280. end
  281. else
  282. begin
  283. Writeln('Термин не найден на данной странице!');
  284. end;
  285. end;
  286. end;
  287. end;
  288.  
  289. function CreateNewTerm(Value: String): PTerm;
  290. var
  291. NewTerm: PTerm;
  292. begin
  293. New(NewTerm);
  294. NewTerm^.TermValue := Value;
  295. NewTerm^.Subterm := nil;
  296. NewTerm^.Pages := nil;
  297. NewTerm^.NextTerm := nil;
  298.  
  299. CreateNewTerm := NewTerm;
  300. end;
  301.  
  302. procedure OutputSubterm(Subterm: PTerm; Padding: String);
  303. var
  304. Page: PPages;
  305. begin
  306. if Subterm = nil then
  307. Exit
  308. else
  309. begin
  310. Write(Padding + Subterm^.TermValue + '| ');
  311. Page := Subterm^.Pages;
  312. while Page <> nil do
  313. begin
  314. Write(Page^.PageValue, ' ');
  315. Page := Page^.NextPage;
  316. end;
  317. Writeln;
  318. OutputSubterm(Subterm^.Subterm, Padding + ' ');
  319. end;
  320. end;
  321.  
  322. procedure OutputSegmentList(Header: PHeader);
  323. var
  324. Term, Subterm: PTerm;
  325. Page: PPages;
  326. begin
  327. if Header^.FirstTerm = nil then
  328. Writeln('Предметный указатель не заполнен!')
  329. else
  330. begin
  331. Writeln('ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ');
  332. Term := Header^.FirstTerm;
  333. repeat
  334. Writeln('----------------------------');
  335. Write(Term^.TermValue + '| ');
  336. Page := Term^.Pages;
  337. while Page <> nil do
  338. begin
  339. Write(Page^.PageValue, ' ');
  340. Page := Page^.NextPage;
  341. end;
  342. if (Term^.Subterm <> nil) then
  343. begin
  344. Writeln;
  345. Subterm := Term^.Subterm;
  346. repeat
  347. OutputSubterm(Subterm, ' ');
  348. Subterm := Subterm^.NextTerm;
  349. until Subterm = nil;
  350. end
  351. else
  352. Writeln;
  353. Writeln('----------------------------');
  354. Term := Term^.NextTerm;
  355. until Term = nil;
  356. end;
  357. end;
  358.  
  359. procedure DeleteSubterm(NewTerm: PTerm);
  360. var
  361. Curr, Temp: PTerm;
  362. DelSubtermValue: String;
  363. begin
  364. Writeln('Введите подтермин: ');
  365. Readln(DelSubtermValue);
  366. if HasSubtermListThisSubterm(NewTerm, DelSubtermValue) then
  367. begin
  368. Curr := NewTerm^.Subterm;
  369. if Curr^.TermValue = DelSubtermValue then
  370. begin
  371. Temp := Curr;
  372. NewTerm^.Subterm := Curr^.NextTerm;
  373. Dispose(Temp);
  374. end
  375. else
  376. begin
  377. Temp := Curr^.NextTerm;
  378. while Temp^.TermValue <> DelSubtermValue do
  379. begin
  380. Curr := Temp;
  381. Temp := Temp^.NextTerm;
  382. end;
  383.  
  384. Curr^.NextTerm := Temp^.NextTerm;
  385. Dispose(Temp);
  386. end;
  387. Writeln('Подтермин удален успешно!')
  388. end
  389. else
  390. Writeln('Подтермин не найден!');
  391. end;
  392.  
  393. procedure AddSubterm(NewTerm: PTerm);forward;
  394.  
  395. procedure EditSubterm(NewTerm: PTerm);
  396. var
  397. SubtermValue: String;
  398. NowSubterm: PTerm;
  399. Choice:Integer;
  400. begin
  401. if NewTerm^.Subterm = nil then
  402. begin
  403. Writeln('У данного термина еще нет подтерминов!');
  404. Exit;
  405. end
  406. else
  407. begin
  408. Writeln('Введите поддтермин');
  409. Readln(SubtermValue);
  410. if HasSubtermListThisSubterm(NewTerm, SubtermValue) then
  411. begin
  412. if (NewTerm^.Subterm^.TermValue = SubtermValue) then
  413. begin
  414. NowSubterm := NewTerm^.Subterm;
  415. end
  416. else
  417. begin
  418. NowSubterm := NewTerm^.Subterm;
  419. while (NowSubterm^.NextTerm <> nil) and (NowSubterm^.NextTerm^.TermValue <> SubtermValue) do
  420. NowSubterm := NowSubterm^.NextTerm;
  421.  
  422. NowSubterm := NowSubterm^.NextTerm;
  423. end;
  424.  
  425. repeat
  426. Writeln('--------------------------------------------------------');
  427. Writeln('РЕДАКТОР ПОДТЕРМИНА ' + SubtermValue);
  428. OutputEditTermMenu;
  429. Choice := InputChoice(1,6);
  430. case Choice of
  431. 1: AddSubterm(NowSubterm);
  432. 2: EditSubterm(NowSubterm);
  433. 3: DeleteSubterm(NowSubterm);
  434. 4: AddPage(NowSubterm);
  435. 5: DeletePage(NowSubterm);
  436. 6:
  437. end;
  438. until Choice = 6;
  439. end
  440. else
  441. Writeln('Подтермин не найден!');
  442. end;
  443. end;
  444.  
  445. procedure AddSubterm(NewTerm: PTerm);
  446. var
  447. Curr, NewSubterm: PTerm;
  448. NewSubtermValue: String;
  449. Choice:Integer;
  450. begin
  451. Writeln('Введите подтермин: ');
  452. Readln(NewSubtermValue);
  453. if HasSubtermListThisSubterm(NewTerm, NewSubtermValue) then
  454. Writeln('Такой подтермин уже существует')
  455. else
  456. begin
  457. NewSubterm := CreateNewTerm(NewSubtermValue);
  458. repeat
  459. Writeln('--------------------------------------------------------');
  460. Writeln('РЕДАКТОР ПОДТЕРМИНА ' + NewSubtermValue);
  461. OutputEditTermMenu;
  462. Choice := InputChoice(1,6);
  463. case Choice of
  464. 1: AddSubterm(NewSubterm);
  465. 2: EditSubterm(NewSubterm);
  466. 3: DeleteSubterm(NewSubterm);
  467. 4: AddPage(NewSubterm);
  468. 5: DeletePage(NewSubterm);
  469. 6:
  470. end;
  471. until Choice = 6;
  472.  
  473. Curr := NewTerm^.Subterm;
  474. if Curr <> nil then
  475. begin
  476. while Curr^.NextTerm <> nil do
  477. Curr := Curr^.NextTerm;
  478. Curr^.NextTerm := NewSubterm;
  479. end
  480. else
  481. NewTerm^.Subterm := NewSubterm;
  482.  
  483. Writeln('Подтермин добавлен успешно!');
  484. end;
  485. end;
  486.  
  487. function CreateSubjectIndex: PHeader;
  488. var
  489. Header: PHeader;
  490. begin
  491. New(Header);
  492. Header^.FirstTerm := nil;
  493.  
  494. CreateSubjectIndex := Header;
  495. end;
  496.  
  497. procedure CreateHashTable(var HashTable: THashTable);
  498. var
  499. I: Integer;
  500. begin
  501. for I := Low(HashTable) to High(HashTable) do
  502. begin
  503. New(HashTable[I]);
  504. HashTable[I]^.FirstTerm := nil;
  505. end;
  506. end;
  507.  
  508. procedure OutputSubjectIndex(HashTable: THashTable);
  509. var
  510. I: Integer;
  511. begin
  512. for I := Low(HashTable) to High(HashTable) do
  513. begin
  514. OutputSegmentList(HashTable[I]);
  515. end;
  516. end;
  517.  
  518. begin
  519. Writeln('Данная программа - предметный указатель');
  520. CreateHashTable(HashTable);
  521. repeat
  522. OutputMainMenu;
  523. Choice := InputChoice(1, 9);
  524. case Choice of
  525. 1: OutputSubjectIndex(HashTable);
  526. 2:
  527. begin
  528. Writeln('Введите термин: ');
  529. Readln(TermName);
  530. if not HasTermListThisTerm(Header, TermName) then
  531. begin
  532. NewTerm := CreateNewTerm(TermName);
  533. repeat
  534. Writeln('--------------------------------------------------------');
  535. Writeln('РЕДАКТОР ТЕРМИНА ' + TermName);
  536. OutputEditTermMenu;
  537. Choice := InputChoice(1,6);
  538. case Choice of
  539. 1: AddSubterm(NewTerm);
  540. 2: EditSubterm(NewTerm);
  541. 3: DeleteSubterm(NewTerm);
  542. 4: AddPage(NewTerm);
  543. 5: DeletePage(NewTerm);
  544. 6: AddTerm(Header, NewTerm);
  545. end;
  546. until Choice = 6;
  547. end;
  548. end;
  549. 3:;
  550. 4:;
  551. 5:;
  552. 6:;
  553. 7:;
  554. 8:;
  555. end;
  556. until Choice = 9;
  557. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement