Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Символы / Strokatext.doc
Скачиваний:
5
Добавлен:
10.02.2015
Размер:
158.21 Кб
Скачать
  1. program strokapr1;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. type Mas=array[1..128] of ShortString;

  6. Mn=set of Char;

  7. const Prep=[' ', '.', ',', '?', '!', ':', ';', '-'];//множество

  8. //символов-разделителей

  9. Var s,St:ShortString;

  10. A:Mas;

  11. Pr:Boolean;

  12. I,N1,N2,K:Integer;

  13. function Rus(S:String):String;

  14. var I:Byte;

  15. begin

  16. Result:='';

  17. for I:=1 to Length(S) do

  18. case S[I] of

  19. 'А'..'п': Result:=Result+Chr(Ord(S[I])-64);

  20. 'р'..'я': Result:=Result+Chr(Ord(S[I])-16);

  21. 'Ё': Result:=Result+Chr(240);

  22. 'ё': Result:=Result+Chr(241);

  23. else

  24. Result:=Result+S[I];

  25. end;

  26. end;

  27. //функция перекодировки строки при вводе

  28. function RusIn(S:String):String;

  29. var I:Integer;

  30. begin

  31. Result:='';

  32. for I:=1 to Length(S) do

  33. case Ord(S[I]) of

  34. 128..175: Result:=Result+Chr(Ord(S[I])+64);

  35. 224..239: Result:=Result+Chr(Ord(S[I])+16);

  36. 240: Result:=Result+Chr(168);

  37. 241: Result:=Result+Chr(184);

  38. else

  39. Result:=Result+S[I];

  40. end;

  41. end;

  42. //функция проверки слова на симметричность

  43. function Simmetr(S:ShortString):Boolean;

  44. var I,N,M:integer;

  45. begin

  46. M:=Length(S);

  47. N:=Mdiv2; //количество пар сравниваемых символов

  48. I:=1;

  49. Result:=true;//слово симметрично

  50. while(I<=N)andResultdo//пока не просмотрены все пары

  51. //и пока сохраняется симметричность слова

  52. if S[I]<>S[M-I+1] then Result:=false

  53. else I:=I+1;

  54. end;

  55. //процедура сортировки массива строк по алфавиту методом пузырь-

  56. //ка

  57. procedure Sort(Var A:Mas;N:Integer);

  58. var I,L:integer;

  59. Pr:boolean;

  60. B:ShortString;

  61. begin

  62. l:=0;

  63. repeat

  64. L:=L+1;

  65. Pr:=true;

  66. for I:=1 to N-L do

  67. if A[I]>A[I+1] then

  68. begin

  69. B:=A[I];

  70. A[I]:=A[I+1];

  71. A[I+1]:=B;

  72. Pr:=false;

  73. end;

  74. until Pr;

  75. end;

  76. begin

  77. Writeln(Rus('Введите строку символов'));

  78. Readln(S);

  79. S:=RusIn(s);

  80. Writeln(Rus(S));

  81. K:=0;

  82. Pr:=false;

  83. for I:=1 to Length(S) do

  84. begin

  85. //слово еще не началось, очередной символ не является раздели-

  86. // телем – найдено начало очередного слова

  87. If not Pr and not (s[I] in Prep) then

  88. begin

  89. N1:=I; //начало слова

  90. Pr:=true; //слово началось

  91. end

  92. else

  93. //слово началось, но очередной символ является разделителем

  94. //или последним в строке – найден конец слова

  95. if Pr and ((S[I] in Prep)or(I=Length(S))) then

  96. begin

  97. ifS[I]inPrepthenN2:=I-1 //очередной символ является

  98. //разделителем – слово оканчивается в предыдущей позиции

  99. else if I=Length(S) then//символ – последний в строке,

  100. N2:=I; //слово оканчивается в текущей позиции

  101. Pr:=false;

  102. St:=Copy(S,N1,N2-N1+1);//копирование очередного слова в

  103. //служебную строку

  104. Writeln(Rus(St)); //вывод найденного слова

  105. IfSimmetr(St)then//проверка очередного слова на симмет-

  106. //ричность

  107. begin

  108. Writeln(Rus(St)); //вывод симметричного слова

  109. K:=K+1; //запоминание очередного симметричного

  110. A[K]:=St; //слова в массиве

  111. end;

  112. end;

  113. end;

  114. if k=0 then Writeln(Rus('Симметричных слов в строке нет'))

  115. else

  116. begin

  117. Sort(A,K);

  118. writeln(Rus('Симметричные слова'));

  119. for I:=1 to K do

  120. Writeln(Rus(A[I]));

  121. end;

  122. Readln;

  123. end.

При реализации второго подхода для определения позиций, в которых начинается и оканчивается очередное слово, предлагается использовать стандартные подпрограммы работы со строками.

Пример 2 обработки символьной строки.Найти в строке все слова, которые начинаются согласной буквой и количество согласных в слове превышает количество гласных. Найденные слова отсортировать в алфавитном порядке методом нахождения минимального. Строчные и заглавные символы не различать. Латинские и русские буквы также не различать.

Во-первых, следует удалить все конечные символы-разделители. Если после их удаления строка окажется не пустой, то в цикле реализуется выделения всех слов строки.

Во-вторых, для определения позиции начала слова удаляются все начальные разделители. В результате первое слово будет начинаться в первой позиции строки.

В-третьих, для определения позиции окончания первого слова следует найти первое вхождение символов-разделителей в строку с помощью функции Posи определить минимальное значение из них. Если минимальное значение окажется отличным от нуля, то первое слово оканчивается в позиции, номер которой на единицу меньше найденного минимума. Если вычисленное значение минимума равно нулю (нет в строке разделителей), то слово является последним в строке, и оно оканчивается в последней позиции строки.

Далее найденное слово для удобства последующей обработки следует скопировать во временную строку и удалить его из исходной строки. (Если исходную строку требуется сохранить, то ее необходимо скопировать в другую переменную).

Таким образом, в результате проводимых операций очередное слово всегда будет начинаться в первой позиций строки и требуется определить только позицию, в которой оно оканчивается.

Соседние файлы в папке Символы