Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№1.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
180.74 Кб
Скачать

Программы обработки строк символов (текстов)

Тексты (символьная информация) – это анкеты, справочники, библиотеки и т.д. К задачам их обработки относятся задачи редактирования, разработки трансляторов с языков программирования и др.

Они сводятся к поиску некоторых символов или строк в соответствующих текстах, подсчету количества их вхождений и корректировке некоторых мест текста.

Для работы с символьной информацией в стандартном Паскале используются уже известные нам данные символьного типа: CHAR. Причем одна переменная такого типа представляет собой всего один символ.

В Турбо Паскале есть данные строкового типа (String).

Символы в ЭВМ представляются двоичными кодами длиной 1 байт. Поэтому отношение вида SIM1 < SIM2 имеет смысл. Причем, оно эквивалентно отношению: ORD(SIM1) < ORD(SIM2).

1. Простейшие алгоритмы и программы обработки строк

В Турбо Паскале, как отмечалось выше, используются данные строкового типа - string. В дальнейшем мы будем предполагать, что алгоритмы и программы написаны для Турбо Паскаля.

Пример определения переменных строкового типа:

VAR

str: string;

line: string[80];

После слова string может указываться длина строки (максимальная). Если длина не указана, то считается, что она переменная и определяется числом символов, записанных на место переменной типа String при вводе или присваивании. Это число хранится в нулевом байте соответствующей переменной.

Наиболее распространенные операции и функции обработки строк в Турбо Паскале приведены ниже.

1. Объединение строк – операция, изображаемая символом + .

Пример.

Пусть переменные s1, s2 и s3 имеют тип string. Тогда в результате выполнения операции:

s3 := s1 + s2;

получим строку s3, являющуюся объединением строк s1 и s2.

Если, например, s1 имела значение 'СамГТУ,', а s2 – значение 'ФАИТ', то s3 получит значение 'СамГТУ, ФАИТ'.

2. Функция Copy (исходная_строка, нач_индекс, длина) – выделение подстроки заданной "длины" из "исходной строки", начиная с символа, определенного "начальным индексом".

Если параметр "длина" больше остатка строки, то выделяется остаток , если параметр "нач_индекс" превышает длину строки, то - пустая строка.

Пример.

. . . . . .

s1:= 'СамГТУ';

s2:= Copy(s1,4,3); {Результат: s2 получит значение 'ГТУ'}

3. Процедура Delete(исх_строка, номер, длина) – удаляет подстроку заданной "длины" из "исходной строки", начиная с заданного "номера":

Пример.

. . . . .

S:= 'СамГТУ, ФАИТ';

Delete(S,4,5); {Результат: S получит новое значение 'СамФАИТ'}

. . . . .

4. Функция Length(строка) – возвращает длину строки (количество символов в ней).

5. Функция POS(подстрока, строка) – возвращает номер символа, начиная с которого "подстрока" встречается в "строке" (если не встречается, то функция возвращает ноль).

Пример.

. . . .

N := Pos('ра', 'Абракадабра'); {N получит значение 3}

M := Pos('Ра', 'Абракадабра'); {M получит значение 0}

Пример1.

Ввести в ЭВМ предложение длиной не более 80 символов и подсчитать количество слов в нем и количество букв "A".

Aлгоритм

1. Количество слов =0; кол.а=0.

2.1. Ввести предложение.

2.2. n=Длина предложения.

2.3. Для номера символа (i) от 1 до n

2.3.1. Если символ =' ', то

кол.сл. =кол.сл.+1

Иначе

Если символ ='а', то

кол.a= кол.а +1

3. Вывести кол.сл. и кол.а.

4. Закончить.

Программа для этого алгоритма будет иметь вид:

ROGRAM Predl;

VAR

Pr String;

i,n,ks,kA:INTEGER;

BEGIN

KS:=0; {п.1}

KA:=0;

{ п.2.1 }

Write('Введите предложение');

Readln(Pr);

{ п.2.2 }

n:=Length(Pr); {Длина предложения}

{ п.2.3 }

For i:=1 to n do

IF Pr[i]=' ' THEN

KS:= KS +1

ELSE

IF Pr[i]='a' THEN

ka:= ka +1;

ks:=ks+1; {если в предложении нет пробела}

{ п.3 }

WRITELN('Количество слов в предложении равно ',KS,

'количество букв а - ',ka);

End.

Пример 2.

Ввести в ЭВМ строку символов. Количество символов в строке (n <40). Отпечатать, какие символы в ней встречаются (каждый по одному разу) и сколько их.

Пример.

ABBCA -> ABC

Решение ее сводится к следующему. Каждый элемент последовательности сравнивается со всеми остальными, находящимися после него. Если данный элемент имеет номер i, то следующий – i+1 и до конца. При этом i изменяется от 1 до n-1. В процессе сравнений ищется уникальный элемент:

Если i-й элемент не равен ни одному из последующих, то он уникальный и его нужно отпечатать.

Для примера:

АВВСА Þ ВСА

Алгоритм

1. Вввести строку символов.

2. Положить кол. символов=0

3. Для i от 1 до n-1

Найти и отпечатать символы.

4. Вывести кол. символов.

5. Закончить.

Уточняем

1. Вввести строку символов.

2. Положить кол. символов=0

3. Для i от 1 до n-1

3.1. Положить количество совпадений (k)=0

3.2. Для j от i+1 до n

Если сим.i=сим.j, то

k=k+1

3.3. Если k=0, то

кол.сим.=кол.сим.+1 и

печать симi.

4. Отпечатать кол. символов.

5. Закончить.

Следует отметить, что алгоритм применим не только к строкам (массивам символов), но и к данным любого типа (например, массивам чисел).

Программа для этого алгоритма будет иметь вид:

Program Unicum;

var

s:string;

n,i,j,k,kols:integer;

begin

{п.1}

writeln('Введите строку');

readln(s);

n:=length(s);

{п.2}

kols:=0;

{п.3}

writeln('Символы строки без повтров ');

for i:=1 to n-1 do

begin

{п.3.1}

k:=0;

{п.3.2}

for j:=i+1 to n do

if s[i]=s[j] then k:=k+1;

{п.3.3}

if k=0 then

begin

kols:=kols+1;

write(s[i]:2);

end;

end;

{п.4}

writeln('Количество различных символов в строке - ',kols);

readln;

end.

Пример 3.

Сформировать массив из символов, встречающихся в тексте (вариант задачи примера 2).

Алгоритм

1. Ввести исходную строку.

2. Кол.символов в новой последовательности =0.

3. Для номера символов в исходной последовательности(i) от 1 до n

Проверить, есть ли этот символ в новой последовательности и,

если его нет, то – записать нее.

4. Вывести новую последовательность.

5. Закончить.

Уточнение п.3

3.1. Признак (колич. совпадений)=0

3.2. Для номера нового символа(j) от 1 до кол.нов.сим.

Если нов.сим.[j]=ст.сим.[i], то признак =j

3.3. Eсли признак = 0, то кол.нов.сим.=кол.нов.сим.+1

нов.cим.[кол.нов.сим.] = ст.сим.[i]

Обозначим:

старый сим. => S

кол.ст.сим. => N

Признак => JN

новый сим. => NS

кол.нов.сим. => KS

Программа для этого алгоритма будет иметь вид:

program PSK;

Const

n=20;

Var

S:String;

NS:String;

I,J,KS,JN:Integer;

Begin

{п.1 }

writeln('Введите строку');

readln(s);

n:=length(s);

{п.2}

Ks:=0;

{п.3}

For I:= 1 to n do

Begin

{п.3.1}

JN:=0;

{п.3.2}

for J:=1 to KS do

If Ns[j]=s[i] then

Jn:=J;

{п.3.3}

If Jn=0 then

Begin

Ks:=Ks+1;

Ns[ks]:=s[i];

end;

end;

{п.4}

Writeln('Результат');

For i:= 1 to Ks do

Write(NS[i]);

End.

Пример 4.

(продолжение примера 3).

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

В алгоритм Примера 3 вместо п.5 (Закончить) добавляем:

5. Подсчет количества вхождений каждого символа в исходный массив.

Уточняем

5.1. Для j от 1 до kols

5.2. Кол.=0

5.3. Для i от 1 до n

Если нов.сим.[j]=ст.сим.[i], то

кол.=кол+1

5.4. Вывести кол.

Фрагмент программы после ввода исходного массива:

{Ввод S}

ks := 0; {п.2}

{п.3}

For j := 1 to n do

Begin

jn := 0; {п.3.1}

{п.3.2}

For j := 1 to ks do

If Ns[j] = S[i] then

jn := j;

{п.3.4}

If jn = 0 then

begin

ks := ks + 1;

ns[ks] := s[i];

end;

end;

{п. 4}

writeln('Символы строки без повторов ');

For i := 1 to ks do

write(ns[i]);

{Подсчет количества вхождений символов п. 5.1}

For j := 1 to ks do

begin

kol := 0; {п. 5.2}

{п. 5.3}

For i := 1 to n do

If ns[j] = s[i] then

kol := kol + 1;

{п. 5.4}

writeln('Количество букв : ',ns[j],' равно ',kol);

end;

Пример 5.

Дана последовательность из n символов латинского алфавита n<30. Расположить их по алфавиту.

Воспользуемся тем, что символы 'A' – 'Z' имеют коды, значения которых возрастают от 'А' до 'Z'. При этом для решения задачи можно применять алгоритм сортировки "пузырьком".

Program Sorts;

var

s:string;

sr:char;

n,i,k:integer;

BEGIN

writeln('введите строку');

readln(s);

n:=length(s);

for k:=1 to n-1 do

for i:=1 to n-k do

if s[i]>s[i+1]then

begin

sr:=s[i];

s[i]:=s[i+1];

s[i+1]:=sr;

end;

writeln('результат');

writeln(s);

END.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]