USES CRT; TYPE ND=^NODE; Node=record INF1:integer; INF2:string[5]; LEFT:ND; RIGHT:ND; end; MasNode=record INF1:integer; INF2:string[5]; end; mas=array[1..100] of MasNode; tmas=^mas; VAR ROOT,P,Q:ND; otvet:string; ch:char; F:integer; Z:tmas; tree_file: file of MasNode; procedure KTO; Begin writeln('**************************'); writeln('* Лабораторная работа *'); writeln('* по работе с деревьями *'); writeln('* *'); writeln('**************************'); writeln('* Разработчкик: *'); writeln('* Группа : *'); writeln('* *'); writeln('* *'); writeln('* *'); writeln('* *'); writeln('**************************'); readkey; End; function DaNet:char; var push,otvet:char; begin otvet:='n'; write(otvet); repeat push:=readkey; gotoxy(wherex-1,wherey); IF push in ['Y','y','n','N'] then otvet:=push; write(otvet); until ord(push)=13; writeln; danet:=otvet; end; Procedure Create_el(VAR P:ND); Begin NEW(P); writeln('введите табельный номер:'); readln(P^.INF1); writeln('введите фамилию:'); readln(P^.INF2); P^.RIGHT:=NIL; P^.LEFT:=NIL; End; Procedure Insert_el(VAR ROOT:ND); VAR Q,T:ND; Begin Create_el(P); IF ROOT=NIL then ROOT:=P ELSE begin T:=ROOT; Q:=ROOT; While T<>NIL do begin IF P^.INF1 < T^.INF1 then begin Q:=T; T:=T^.LEFT; end ELSE IF P^.INF1 > T^.INF1 then begin Q:=T; T:=T^.RIGHT; end ELSE begin writeln('Найден дубль включаемого элемента'); readkey; exit; end; end; IF P^.INF1 < Q^.INF1 then Q^.LEFT:=P ELSE Q^.RIGHT:=P; end; End; procedure Shapka; Begin clrscr; writeln('------------------------------------------------------------'); writeln('№':3,' * Табельный номер * Фамилия'); writeln('------------------------------------------------------------'); end; procedure node_count(P:ND; VAR n_count:Integer); Begin IF P<>NIL then begin IF (P^.LEFT<>NIL) or (P^.RIGHT<>NIL) then inc(n_count); IF (P^.LEFT=NIL) and (P^.RIGHT=NIL) then inc(n_count); node_count(P^.LEFT,n_count); node_count(P^.RIGHT,n_count); end; End; function nd_count:integer; VAR n_count:integer; Begin n_count:=0; node_count(ROOT,n_count); nd_count:=n_count; End; {==================Vivod obichnii============} procedure show(P:ND;VAR i:integer); Begin IF P<>NIL then begin show(P^.LEFT,i); IF P^.LEFT=NIL then inc(i); writeln(i:3,' * ',p^.INF1:10,' * ',p^.INF2:30); IF P^.RIGHT=NIL then inc(i); show(P^.RIGHT,i); end; End; procedure vivod(P:ND); VAR i:integer; Begin IF P=NIL then begin writeln('Дерево пусто'); readkey; exit; end; i:=0; Shapka; show(ROOT,i); readkey; End; {======================Vivod s prokrytkoi===============} procedure MasCreate(P:ND;i:integer); Begin IF P<> NIL then begin MasCreate(P^.LEFT,i); IF P^.LEFT=NIL then inc(i); Z^[i].INF1:=p^.INF1; Z^[i].INF2:=p^.INF2; IF P^.RIGHT=NIL then inc(i); MasCreate(P^.RIGHT,i); end; End; procedure vivodmassiva; VAR i,k:integer; Begin getmem(Z,nd_count*sizeof(MasNode)); i:=0; MasCreate(ROOT,i); FOR k:=1 to nd_count do writeln(' * ',Z^[k].INF1:10,' * ',Z^[k].INF2:30); readkey; freemem(Z,nd_count*sizeof(MasNode)); End; procedure vivod_procrytka; VAR curr_poss,i,n,k:integer; refresh:boolean; Begin getmem(Z,nd_count*sizeof(MasNode)); curr_poss:=0; refresh:=true; i:=0; MasCreate(ROOT,i); readkey; clrscr; repeat if refresh then begin Shapka; i:=1; repeat write(curr_poss+i:3); writeln(' * ',Z^[curr_poss+i].INF1:10,' * ',Z^[curr_poss+i].INF2:30); inc(i); until (i > 10) or (curr_poss+i-1 >= nd_count); refresh:=false; end; case ord(readkey) of 80: if curr_poss+10 < nd_count then begin inc(curr_poss,10); refresh:=true; end; 72: if curr_poss-10 >=0 then begin dec(curr_poss,10); refresh:=true; end; 13: break; end; until false; freemem(Z,nd_count*sizeof(MasNode)); End; {======================================================} procedure p4; Begin clrscr; writeln('Вы уверены что хотите выйти? (Y/N)'); otvet:='n'; write (otvet); repeat ch:=readkey; gotoxy(wherex-1,wherey); if ch in ['Y','y','N','n'] then otvet:=ch; write (otvet); until ord(ch)=13; end; procedure menu; begin repeat F:=0; clrscr; writeln('Работа сдеревьями:'); writeln; writeln('1 -> Вставка нового элемента'); writeln('2 -> Вывод на экран'); writeln('3 -> Вывод числа узлов'); writeln('4 -> Выход'); repeat ch:=readkey; IF not(ch in ['1'..'4']) then begin writeln('неверная клавиша!'); F:=F+1; if F=4 then begin writeln('программа завершена из-за неправильного ввода данных'); writeln('нажмите любую кнопку для выхода'); readkey; end else if F=3 then begin writeln('у вас ещё ', 4-F,' попытка'); writeln('выберите существующий пункт подменю'); end else begin writeln('у вас ещё ', 4-F,' попытки'); writeln('выберите существующий пункт подменю'); end; end; until (ch in ['1'..'4']) or (F=4); case ch of '1': Insert_el(ROOT); '2': vivod_procrytka; '3': begin writeln(nd_count); readkey; end; '4': p4; end; until ((otvet='Y') or (otvet='y')) or (F=4); end; Begin clrscr; KTO; menu; End.