Пример 1. В строке задан текст. Слова текста разделены между собой одним или несколькими пробелами. В начале и в конце строки также могут быть пробелы. Сжать текст, оставив между словами лишь один пробел. Удалить также пробелы в начале и в конце строки.
Удаление из строки пробелов аналогично удалению нулей из одномерного массива (см. раздел "Удаление элементов из массива"). При этом сдвиг символов строки влево и уменьшение ее текущей длины выполняет процедура Delete.
Program TextDel;
Var i : byte;
S : string;
Begin
Read(S); Writeln('S= ',S);
For i:=length(S) downto 2 do
If (S[I]=’ ‘) and (S[I-1]=’ ‘) then
Delete(S,i,1);
IfS[1]=’ ‘ then
Delete(S,1,1);
If S[length(S)]=’ ‘ then
Delete(S,length(S),1);
Writeln('S ',S);
End.
Пример 2. В строке задан текст. Слова текста разделены между собой одним или несколькими пробелами. В начале и в конце строки также могут быть пробелы. Определить количество слов в тексте и среднее количество букв в слове.
Предположим, что строка S имеет следующий вид (символ "-" использован здесь для обозначения пробела):
---abcde----fghijklmn----n-opq--xy—
Признаком начала слова является символ, отличный от пробела (непробел), признаком окончания слова - ближайший к нему пробел. Будем присваивать номера позиций, определяющих положение слова в строке, переменным k1 и k2:
---abcde----fghijklmn----n-opq--xy--
k1 k2 k1 k2 ...
Следовательно, при анализе строки в программе требуется многократно определять местоположения слов или, другими словами, позицию ближайшего пробела или непробела, начиная с заданной позиции k. Для выполнения такой работы целесообразно написать отдельные подпрограммы, оформив их в виде функции, поскольку выходом подпрограммы является одно значение - позиция пробела или непробела.
Поиск ближайшего пробела:
Function Space(S:string; k:byte):byte;
Var i : byte;
Begin
Space:=0;
For i:=k tolength(S) do
IfS[i]=' ' then
Begin
Space:=i; Exit
End;
End{ Space };
Если в строке S, начиная с позиции k, пробела не обнаружено, то выходное значение Space = 0.
Поиск ближайшего непробела:
Function NotSpace(S:string; k:byte):byte;
Var i : byte;
Begin
NotSpace:=0;
For i:=k tolength(S) do
If S[i]<>' ' then
Begin
NotSpace:=i; Exit
End;
End{ NotSpace };
Будем считать, что в программе Slovo, реализующей решение поставленной задачи, после раздела Var записаны функции Space и NotSpace.
ProgramSlovo;
VarS : string; { анализируемый текст }
NumWords, { количество слов }
NumLetters, { количество букв }
k1,k2, { левая и правая границы слова }
l : byte; { длина слова }
MiddleLet : real; { среднее количество букв в слове }
В программе производится последовательное выделение слов текста путем определения границ слова k1 и k2. Стартовое значение k2 принимается равным нулю. Цикл поиска слов продолжается до тех пор, пока истинно значение переменной Cond.
В каждом цикле поиска определяются значения k1 и k2. Значение k1 - это позиция ближайшего непробела, начиная с позиции k2+1 (в первом цикле k2+1 = 1 ). Если при обращении к функции NotSpace получено k1=0, то это означает, что до конца строки больше слов не обнаружено. Тогда переменной Cond присваивается значение false, что ведет к прекращению работы цикла While.
Если k1>0, определяется значение k2, т.е. номер позиции ближайшего пробела, начиная с k1+1. Если при обращении к функции Space получено k2=0, то это означает, что до конца строки нет больше пробелов. Тогда правой границей слова является байт length(S)+1, т.е. номер байта, расположенного после последней буквы слова. Одновременно значение k2=0 указывает, что в тексте найдено последнее слово. Тогда переменной Cond присваивается значение false, что ведет в дальнейшем к прекращению цикла поиска.
Пример 3. В строке содержатся слова, состоящие из русских букв, и целые десятичные числа. Перед числом может стоять знак "+" или "-". В качестве разделителей слов и чисел в тексте используются пробел, запятая, точка, точка с запятой и двоеточие. Определить:
- количество чисел в тексте;
- сумму десятичных цифр, содержащихся в этих числах.
Поиск конца числа в тексте в основном аналогичен поиску конца слова в предыдущем примере но искомым признаком является ближайший разделитель, что реализовано в функции SignEnd. Признаком начала числа является цифра или символы "+","-". Поэтому вместо функции NotSpace для поиска начала числа будем использовать функцию Number.
Выделяемый из состава числа элемент S[i] является символом, а не цифрой. Поэтому для преобразования его в численное значение в программе используется процедура Val.
Пример 4. В массиве строк содержатся фамилии студентов. Сгруппировать массив по алфавиту.
В таблице ASCII русские буквы записаны по алфавиту. Пробел имеет порядковый номер 32, значительно меньший порядкового номера любой буквы. Поэтому программа группировки текстовых строк по алфавиту отличается от программы группировки одномерного массива по возрастанию лишь тем, что здесь вместо сравнения и обмена местами элементов числового массива сравниваются и обмениваются местами элементы массива строк.