Advertisement
LilAsian

lab1.2

Feb 12th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.44 KB | None | 0 0
  1. uses
  2.   Windows,
  3.   Unit2 in 'Unit2.pas';
  4.  
  5. Var
  6. S, S1, S2: ANSIString;
  7. Nom: Byte;
  8. Begin
  9.  
  10. // сменим кодовые страницы для консольного ввода и вывода
  11. setConsoleCP(1251); // для ввода
  12. setConsoleOutputCP(1251); // для вывода
  13.  
  14. Writeln('Введите строку (смените шрифт на Lucida Console)');
  15. readln(S); // ввод
  16.  
  17. S1:=Copy(S, 1, Length(S)); S2:=Copy(S, 1, Length(S)); // создание копий дин.строки
  18.  
  19. // без своей таблицы символов (со сложным условием обмена)
  20. Writeln(#13#10, 'Строка до сортировки'#13#10, '"', S1, '"');
  21. Nom:= Prov1(s1); // проверка
  22. Case Nom of
  23. 1: writeln('Пустая строка');
  24. 2: writeln('Некорректные символы');
  25. else
  26. begin // сортировка
  27. Sort1(s1);
  28. Writeln('Отсортированная строка 1'#13#10, '"', S1, '"'); // вывод строки S1
  29. end; {else}
  30. End; {case}
  31.  
  32. // со своей таблицей символов
  33. Writeln(#13#10'Строка до сортировки'#13#10, '"', S2, '"');
  34. Nom:= Prov2(s2); // проверка
  35. Case Nom of
  36. 1: writeln('Пустая строка');
  37. 2: writeln('Некорректные символы');
  38. else
  39. begin // сортировка
  40. Sort2(s2);
  41. Writeln('Отсортированная строка 2'#13#10, '"', S2, '"'); // вывод строки S2
  42. end; {else}
  43. End; {case}
  44.  
  45. writeln(#13#10'Press ENTER to exit');
  46. readln
  47. End.
  48.  
  49.  
  50. Unit Unit2; // имя модуля – меняется при сохранении File ? Save As…
  51. Interface // раздел описания межмодульного интерфейса
  52.  
  53. Uses
  54. SysUtils;
  55.  
  56. Const
  57. SymbTable = 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯяAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz ';
  58.  
  59. Const
  60. BukvLat: set of char = ['A'.. 'Z', 'a'..'z'];
  61. BukvKirPr: set of char = ['а' .. 'я', 'ё'];
  62. BukvKirZag: set of char = ['А' .. 'Я', 'Ё'];
  63. BukvDoEPr: set of char = ['а'..'е'];
  64. BukvPosleEPr: set of char = ['ж'..'я'];
  65. BukvDoEZag: set of char = ['А'..'Е'];
  66. BukvPosleEZag: set of char = ['Ж'..'Я'];
  67.  
  68. Function Prov1(const s: ANSIString): Byte; // проверка без SymbTable
  69. Function Prov2(const s: ANSIString): Byte; // проверка с SymbTable
  70. Procedure Sort1(var s: ANSIString); // сортировка без SymbTable
  71. Procedure Sort2(var s: ANSIString); // сортировка с SymbTable
  72.  
  73. Implementation // раздел реализации и описания закрытых процедур
  74.  
  75. Function Prov1; // проверка без SymbTable
  76. Var
  77. Nom: byte; // номер аномалии
  78. i,Len: word; // текущий символ и длина строки
  79. Begin
  80. Nom:=0; len:= Length(S);
  81. If Len=0 then Nom:=1
  82. Else
  83. Begin
  84. i:=1;
  85. while (i<=Len) and (Nom=0) do
  86. begin
  87. if Not ((S[i] in BukvLat) or (S[i] in BukvKirPr) or (S[i] in BukvKirZag) or (s[i]=' ')) then Nom:=2;
  88. i:=i+1;
  89. end;
  90. End;
  91. Prov1:=Nom;
  92. End;
  93.  
  94. Function Prov2; // проверка с SymbTable
  95. Var
  96. Nom: byte; // номер аномалии
  97. i,Len: word; // текущий символ и длина строки
  98. Begin
  99. Nom:=0; len:= Length(S);
  100. If Len=0 then Nom:=1
  101. Else
  102. Begin
  103. i:=1;
  104. while (i<=Len) and (Nom=0) do
  105. begin
  106. if Not (Pos(S[i], SymbTable)>0) then Nom:=2;
  107. i:=i+1;
  108. end;
  109. End;
  110. Prov2:=Nom;
  111. End;
  112.  
  113. Procedure Sort1; // сортировка без SymbTable
  114. Var
  115. i, z, len: Word; // номер текущего символа, номер итерации (шага), длина строки {(s[i] in BukvLatZag) and (s[i+1]in BukvLatPr) and}
  116. flag: Boolean; // упорядочено? (нет обменов?)
  117. ch: char; // для обмена
  118. Begin
  119. Z:=1; len:=length(s);
  120. Repeat // пузырёк
  121. flag:=true;
  122. for i:=1 to len-z do
  123. if (s[i]=' ') and ((s[i+1] in BukvLat) or (s[i+1] in BukvKirPr)  or (s[i+1] in BukvKirZag)) or
  124. (s[i] in BukvLat) and ((s[i+1] in BukvKirZag) or (s[i+1] in BukvKirPr)) or
  125. (s[i] in BukvDoEZag) and (s[i+1] in BukvDoEZag) and (s[i]>s[i+1]) or
  126. (s[i] in BukvPosleEZag) and (s[i+1] in BukvPosleEZag) and (s[i]>s[i+1]) or
  127. (s[i] in BukvDoEPr) and (s[i+1] in BukvDoEPr) and (s[i]>s[i+1]) or
  128. (s[i] in BukvPosleEPr) and (s[i+1] in BukvPosleEPr) and (s[i]>s[i+1]) or
  129. (s[i] in BukvPosleEPr) and (s[i+1]='ё') or
  130. (s[i] in BukvPosleEZag) and (s[i+1]='Ё') or
  131. (s[i] in BukvKirZag) and (s[i+1] in BukvKirPr) and ((ord(s[i])+32)>=ord(s[i+1]))or
  132. (s[i] in BukvKirPr) and (s[i+1] in BukvKirZag) and (ord(s[i])>=(ord(s[i+1])+32))
  133. then
  134.  
  135. begin // обмен
  136. ch:=s[i]; s[i]:=s[i+1]; s[i+1]:=ch; flag:= false;
  137. end;
  138. z:=z+1;
  139. Until flag or (z=len);
  140. End;
  141.  
  142. Procedure Sort2; // сортировка с SymbTable
  143. Var
  144. i, z, len: Word; // номер текущего символа, номер итерации (шага), длина строки
  145. flag: Boolean; // упорядочено? (нет обменов?)
  146. ch: char; // для обмена
  147. Begin
  148. z:=1; len:=length(s);
  149. Repeat // пузырёк
  150. flag:=true;
  151. for i:=1 to len-z do
  152. if (Pos(s[i], SymbTable) > Pos(s[i+1], SymbTable)) // неправильный порядок по своей «таблице»
  153. and not ( (s[i] in BukvLat) and (s[i+1] in BukvLat)) // но латинницу не упорядочивать
  154. then
  155. begin // обмен
  156. ch:=s[i]; s[i]:=s[i+1]; s[i+1]:=ch; flag:= false;
  157. end;
  158. z:=z+1;
  159. Until flag or (z=len);
  160. End;
  161.  
  162. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement