Функции, работающие со строками, в качестве аргумента используют строки, результатом могут быть либо новые строки, либо некоторые числовые характеристики строки - аргумента.
Concat(S1,S2,...Sn) - объединение нескольких строк в одну. Аргументы - имена строк (любое количество), результат - сцепленная строка (при превышении 255 символов, лишние последние символы отбрасываются без сообщения об ошибке). Пример:
Copy(S,Num,Count) - вырезание подстроки из строки S начиная с символа с номером Num длиной Count символов. Если Num больше длины строки - результат
- строка нулевой длины, если заказанного количества символов в исходной строке не хватает, ошибки не возникает, а результирующая строка просто будет короче. Пример:
Copy('Гидромет',4,3) равно 'ром'.
Length(S) - нахождение текущей длины строки. Аргумент - имя строки, результат - целое число. Пример:
Length('ВТ и программирование') равно 16.
Pos(S,S0) - нахождение места, начиная с которого в строке S0 встречается строка S. Результатом будет целое число - номер позиции в строке S0. Если такого места не найдется, результат равен 0. Пример:
Pos('форма','Информатика') равняется 3.
Пример работы со строками.
Написать программу разбиения фразы на отдельные слова и распечатки массива выделенных слов с указанием, сколько раз каждое слово встречается. В качестве фразы использовать начало стихотворения «Не говорите мне – он умер – он живет. Пусть жертвенник разбит, огонь еще пылает, пусть роза сорвана, она еще цветет …».
Алгоритм программы должен учесть следующие моменты:
1) Нужно удалить все знаки препинаний (заменить их пробелами). Для этого, все символы, не попадающие в диапазоны букв, заменим пробелами.
2) Прописные буквы заменить на строчные. Для этого, все символы, попадающие в диапазон прописных букв, заменим соответствующими строчными.
3) Каждое вновь вырезанное слово сравнить с массивом ранее вырезанных слов на предмет совпадения.
В программе будем использовать следующие переменные:
S – исходная строка (150 символов)
Slovo – строка (е более 20 символов) в которую вырезается очередное слово.
Mas – массив строк длинной 20 символов каждая. Количество строк в массиве не более 30. (все выбираем с запасом!)
Kol – массив целых чисел, в котором будет хранится, сколько раз встречается соответствующее слово из массива Mas.
n – количество найденных различных слов.
i,j,m – номера символов в исходной строке (рабочие счетчики).
L – длина вырезаемого слова.
sdvig1,sdvig2 – сдвиги строчных букв от прописных для первой и второй частей алфавита (см. альтернативную кодировку ASCII в конце Практикума)
Pr – признак, что слово повторяется.
Program Dictionary;
{ VGI, MIT}
Type
Stroka = string[20];
Var
S:String[150];
Slovo : Stroka;
Mas : array[1..30] of Stroka;
Kol :array[1..30] of integer;
n,i,L,m,j,sdvig1,sdvig2: integer;
Fout:text;
Pr :boolean;
BEGIN
S:=Concat(' Не говорите мне - он умер - он живет.',
' Пусть жертвенник разбит, огонь еще пылает,',
' пусть роза сорвана, она еще цветет ...');
{ Вывод исходной строки в выводной файл }
Assign(Fout,'Diction.txt');
ReWrite(Fout);
WriteLn(Fout,'Исходная строка');
WriteLn(Fout,S);
WriteLn(Fout);
{ удаление знаков }
for i:=1 to Length(S) do
if not((S[i]>='А')and(S[i]<='п') or (S[i]>='р')and(S[i]<='я')) then
S[i]:=' '; { если не входит в диапазоны русских букв, заменяем на
пробел }
{ замена строчных на прописные}
sdvig1:= Ord('а') - Ord('А');
sdvig2:= Ord('р') - Ord('Р');
for i:=1 to Length(S) do
if (S[i]<='П') and (S[i]<>' ') then { если прописная от 'А' до 'П'}
S[i] := Chr(Ord(S[i])+sdvig1)
Else
if (S[i]<='Я') and (S[i]<>' ') then { если прописная от 'Р' до 'Я'}
S[i] := Chr(Ord(S[i])+sdvig2);
{ Контрольный вывод очищенной строки в выводной файл}
WriteLn(Fout,'Исправленная строка');
WriteLn(Fout,S);
WriteLn(Fout);
{ Основной цикл вырезания слов }
n:=0;
while Length(S)>0 do
Begin
{ поиск начала слова}
j:=1;
while S[j]=' ' do
j:=j+1;
{ поиск конца слова}
i:=j+1;
while S[i]<>' ' do
i:=i+1;
{ копирование слова из исходной строки}
Slovo:= Copy(S,j,i-j);
{ проверка, не встречалось ли слово раньше }
Pr:=FALSE;
for m:=1 to n do
if Slovo = Mas[m] then
Begin
Kol[m]:=Kol[m]+1;
Pr:=TRUE;
{ break;}
end;
if not Pr and (Slovo <> '') then { слово еще не встречалось }
Begin
n:=n+1;
Mas[n]:=Slovo; { записываем его в массив слов }
Kol[n]:=1;
end;
{ удаление символов до следующего слова или до конца строки }
while (i< Length(S)) and (S[i]=' ') do
i:=i+1;
Delete(S,1,i-1);
end; { конец основного цикла }
{ Вывод списка найденных слов }
WriteLn(Fout,'Слова':10,'количество':14);
for m:=1 to n do
WriteLn(Fout,Mas[m]:10, Kol[m]:6);
Close(Fout);
END.
Результат работы программы (файл Diction.txt)будет выглядеть так: