ShowList.pas 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. uses Graph, CRT;
  2. Type
  3. ps = ^el;
  4. el = record
  5. data : integer;
  6. prev : ps;
  7. end;
  8. var
  9. taba : array [1..50] of ps;
  10. tabb : array [1..50] of ps;
  11. A,B,tm,t1,t2 : ps;
  12. Procedure PUSH(i:integer;var head:ps);
  13. var ne : ps;
  14. begin
  15. New(ne);
  16. ne^.data := i;
  17. ne^.prev := head;
  18. head := ne;
  19. end;
  20. Function POP(var head:ps):integer;
  21. var ret:integer;newhead:ps;
  22. begin
  23. if (head=nil) then
  24. begin
  25. POP:=0;
  26. exit;
  27. end;
  28. ret := head^.data;
  29. newhead := head^.prev;
  30. Dispose(head);
  31. head := newhead;
  32. POP := ret;
  33. end;
  34. Procedure Init;
  35. var
  36. grDriver, grMode : integer;
  37. Errcode : Integer;
  38. begin
  39. grDriver := Detect;
  40. InitGraph(grDriver, grMode,' ');
  41. { SetWriteMode(XORPut);}
  42. ErrCode := GraphResult;
  43. if ErrCode <> grOk then begin writeln('Нет графики!!!');Halt(2);end;
  44. SetFillStyle(XHatchFill,Green);
  45. SetColor(Blue);
  46. Bar(0,0,639,479);
  47. SetfillStyle(SolidFill,Black);
  48. Setcolor(black);
  49. Bar(20,20,620,460);
  50. end;{Init}
  51. {-----------}
  52. Procedure ShowOne(num : word;it:string;color:byte);
  53. var
  54. x, y, offs : integer;
  55. begin
  56. x:=0;y:=0;
  57. offs:=0;
  58. if (num>50) then begin y:=200; dec(num,50);offs:=-10;end;
  59. inc(y,100);
  60. x := 30+num*40;
  61. SetColor(color);
  62. rectangle(x,y,x+30,y+30);
  63. line(x,y+20+offs,x+30,y+20+offs);
  64. line(x+15,y+20+offs,x+15,y+30+(offs*3));
  65. SetTextJustify(CenterText,CenterText);
  66. outtextxy(x+15,y-offs+10,it);
  67. end;{ShowOne}
  68. {-------------------}
  69. Function GetNum(elem:ps):integer;
  70. var i:word;
  71. begin
  72. i:=1;
  73. while (taba[i+1]<>nil) and (taba[i]<>elem) do inc(i);
  74. if taba[i]<>elem then
  75. begin
  76. i:=1;
  77. while (tabb[i+1]<>nil) and (tabb[i]<>elem) do inc(i);
  78. if tabb[i]<>elem then
  79. GetNum:=0
  80. else
  81. GetNum:=i+50;
  82. end
  83. else
  84. GetNum:=i;
  85. end; {GetNum}
  86. {------------------}
  87. Procedure Link(n1,n2:word;color:byte);
  88. var
  89. offs1,offs2,x1,x2,y1,y2:integer;
  90. begin
  91. x1:=0;y1:=0;x2:=0;y2:=0;offs1:=0;offs2:=0;
  92. if (n1>50) then begin y1:=200; dec(n1,50);offs1:=-10;end;
  93. if (n2>50) then begin y2:=200; dec(n2,50);offs2:=-10;end;
  94. inc(y1,100);
  95. inc(y2,100);
  96. x1 := 30+n1*40;
  97. x2 := 30+n2*40;
  98. SetColor(color);
  99. line(x1,y1+30+2*offs1,x1+15,y1+20+2*offs1);
  100. line(x1+8,y1+25+2*offs1,x2+22,y2+25+2*offs2);
  101. end; {Link}
  102. {---------------------}
  103. Procedure ShowLists;
  104. var
  105. i : integer;
  106. itt : string;
  107. begin
  108. i:=1;
  109. while (taba[i]<>nil) do
  110. begin
  111. str(taba[i]^.data,itt);
  112. ShowOne(i,itt,Blue);
  113. inc(i);
  114. end;
  115. i :=1;
  116. while (tabb[i]<>nil) do
  117. begin
  118. str(tabb[i]^.data,itt);
  119. ShowOne(i+50,itt,Red);
  120. inc(i);
  121. end;
  122. end; {ShowList}
  123. {-----------}
  124. Var
  125. fA,fB,fO : text;
  126. item,i : integer;
  127. Begin
  128. Init;
  129. Assign(fA,'a.txt');
  130. Assign(fB,'b.txt');
  131. Assign(fO,'res.txt');
  132. Reset(fa);Reset(fB);Rewrite(fO);
  133. A:=nil;B:=nil;
  134. i:=1; fillchar(taba,50,0);
  135. while not eof(FA) do begin read(fA,item); PUSH(item,A);taba[i]:=A;inc(i)end;
  136. i:=1; fillchar(tabb,50,0);
  137. while not eof(FB) do begin read(fB,item); PUSH(item,B);tabb[i]:=B;inc(i)end;
  138. close(fA);close(fB);
  139. ShowLists;
  140. if (A^.data<B^.data) then
  141. begin tm:=A;A:=B;B:=tm;end;
  142. t1:=A;t2:=B;
  143. while (t1^.prev<>nil) do
  144. begin
  145. if (t1^.prev^.data<t2^.data) then
  146. begin
  147. tm := t1^.prev;
  148. t1^.prev:=t2;
  149. t2 := tm;
  150. end;
  151. Link(GetNum(t1),GetNum(T1^.prev),GetNum(t1));
  152. ReadKey;
  153. t1:=t1^.prev;
  154. end;
  155. t1^.prev := t2;
  156. Link(GetNum(t1),GetNum(T1^.prev),1);
  157. B:=nil;
  158. repeat
  159. item:=POP(A);
  160. if (item<>0) then PUSH(item,B);
  161. until item=0;
  162. repeat
  163. item:=POP(B);
  164. if (item<>0) then WriteLn(fO,item);
  165. until item=0;
  166. Close(fO);
  167. ReadKey;
  168. End.