Advertisement
Cinder1986

Untitled

Apr 12th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. program Lab21;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8. System.SysUtils;
  9. Type
  10. PStack = ^Element;
  11. Element = Record
  12. Data: Char;
  13. Next: PStack;
  14. End;
  15. Function Pop(Var Stack: PStack): Char;
  16. Var
  17. El: Char;
  18. Top: PStack;
  19. Begin
  20. Top := Stack;
  21. El := Stack.Data;
  22. Top := Stack.Next;
  23. Stack := Top;
  24. Pop := El;
  25. End;
  26. Procedure Push(Var Stack: PStack;El: Char);
  27. Var
  28. Top: PStack;
  29. Begin
  30. New(Top);
  31. Top.Data := El;
  32. Top.Next := Stack;
  33. Stack := Top;
  34. Top := Nil;
  35. End;
  36. Function CheckLine(Line: String): Boolean;
  37. Const
  38. AllowedSymbols = ['+','-','*','/','^','(',')','A'..'Z','a'..'z','0'..'9'];
  39. Var
  40. IsCorrect: Boolean;
  41. I: Integer;
  42. Begin
  43. IsCorrect := True;
  44. I := 1;
  45. While IsCorrect and (I <= Length(Line)) do
  46. begin
  47. if Not (Line[I] in AllowedSymbols) then
  48. IsCorrect := False;
  49. Inc(I);
  50. end;
  51. CheckLine := IsCorrect;
  52. End;
  53. Function TakeLine(): String;
  54. Var
  55. IsCorrect: Boolean;
  56. Line: String;
  57. Begin
  58. repeat
  59. IsCorrect := True;
  60. ReadLn(Line);
  61. if (Length(Line) < 1) or (Length(Line) > 1024) then
  62. begin
  63. WriteLn('Недопустимая длина строки!');
  64. IsCorrect := False;
  65. end;
  66. if IsCorrect and Not CheckLine(Line) then
  67. begin
  68. WriteLn('Строка содержит недопустимые символы!');
  69. IsCorrect := false;
  70. end;
  71. until IsCorrect;
  72. TakeLine := Line;
  73. End;
  74. Function MakePostfix(Infix: String): String;
  75. Const
  76. Symbols = ['A'..'Z','a'..'z','0'..'9'];
  77. Plus = ['+','-'];
  78. Mult = ['*','/'];
  79. Var
  80. I: Integer;
  81. Stack: PStack;
  82. Postfix: String;
  83. IsOpen: Boolean;
  84. Begin
  85. Postfix := '';
  86. New(Stack);
  87. Stack.Data := '$';
  88. Stack.Next := Nil;
  89. IsOpen := False;
  90. For I := 1 to High(Infix) do
  91. begin
  92. if Infix[I] in Symbols then
  93. Postfix := Postfix + Infix[I]
  94. else if (Infix[I] in Plus) and Not(Stack.Data in Mult) and Not(Stack.Data in Plus) and (Stack.Data <> '^') then
  95. Push(Stack, Infix[I])
  96. else if (Infix[I] in Plus) and (Stack.Data in Plus) then
  97. begin
  98. Postfix := Postfix + Pop(Stack);
  99. Push(Stack, Infix[I]);
  100. end
  101. else if (Infix[I] in Plus) and ((Stack.Data in Mult) or (Stack.Data = '^')) then
  102. begin
  103. while (Stack.Data <> '$') and (Stack.Data <> '(') do
  104. Postfix := Postfix + Pop(Stack);
  105. Push(Stack, Infix[I]);
  106. end
  107. else if (Infix[I] in Mult) and Not (Stack.Data in Mult) and (Stack.Data <> '^') then
  108. Push(Stack, Infix[I])
  109. else if (Infix[I] in Mult) and (Stack.Data in Mult) then
  110. begin
  111. Postfix := Postfix + Pop(Stack);
  112. Push(Stack, Infix[I]);
  113. end
  114. else if (Infix[I] in Mult) and (Stack.Data = '^') then
  115. begin
  116. while (Stack.Data <> '$') and (Stack.Data <> '(') do
  117. Postfix := Postfix + Pop(Stack);
  118. Push(Stack, Infix[I]);
  119. end
  120. else if Infix[I] = '^' then
  121. Push(Stack, Infix[I])
  122. else if Infix[I] = '(' then
  123. Push(Stack, Infix[I])
  124. else if Infix[I] = ')' then
  125. begin
  126. while (Stack.Data <> '(') and (Stack.Data <> '$') do
  127. Postfix := Postfix + Pop(Stack);
  128. Pop(Stack);
  129. end;
  130. end;
  131. while Stack.Data <> '$' do
  132. begin
  133. Postfix := Postfix + Pop(Stack);
  134. end;
  135. MakePostfix := Postfix;
  136. End;
  137. Procedure ShowRank(Postfix: String);
  138. Const
  139. Symbols = ['A'..'Z','a'..'z','0'..'9'];
  140. Var
  141. RankS, RankO, I: Integer;
  142. Begin
  143. RankS := 0;
  144. RankO := 0;
  145. For I := 1 to High(Postfix) do
  146. begin
  147. if Postfix[I] in Symbols then
  148. Inc(RankS)
  149. else
  150. Dec(RankO);
  151. end;
  152. WriteLn(RankS,' - ',Abs(RankO),' = ',RankS + RankO);
  153. if RankS + RankO = 1 then
  154. WriteLn('Выражение верное!')
  155. else
  156. WriteLn('Выражение неверное!');
  157. End;
  158. Procedure Main();
  159. Var
  160. Infix, Postfix: String;
  161. Begin
  162. WriteLn('Введите выражение в инфиксной записи.');
  163. Infix := TakeLine();
  164. Postfix := MakePostfix(Infix);
  165. WriteLn(Postfix);
  166. ShowRank(Postfix);
  167. End;
  168. Begin
  169. Main();
  170. WriteLn('Нажмите Enter, чтобы продолжить.');
  171. ReadLn;
  172. End.
  173. //Преобразовать выражение в обратную польскую запсиь используя стек со скобками и двойными степенями и !!!!считаем ранг!!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement