Advertisement
LilAsian

lab1sem2

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