Практикум. Обработка и поиск символьной информации

В основе обработки символьной информации, как правило, лежит разбиение текста на слова и выполнение некоторых операций со словами.

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

Слова разделены одним пробелом.

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

Program strokal;

Var st: string;

p, spos: integer;

Begin

WriteLn(‘Beedume строку ’);

ReadLn(st); {вводим строку} р:=0; {обнуляем счетчик слов }

if st[Length(st)J ’ ‘ then st:~st+ ’ V {если в конце нет пробела,

то добавим его}

while Length(st)0 do begin

spos:= Pos(‘ \ st);

if spos>5 then p:—p+l; {определяем длину слова} Delete(st, l.spos); {удаляем слово}

end;

WriteLn(‘B строке \ p, ‘ слов(а), длина которых больше четырех. ’);

End.

Пример 4.17. Разработать программу, меняющую в строке одно сочетание букв на другое.

С использованием строковых функций задача решается просто. Вводим строку и оба сочетания букв. Затем определяем вхождения заменяемого сочетания, удаляем его и вставляем на это место заменяющее сочетание.

Program Stroka;

Var n:byte; s, si, s2:string;

Begin

WriteLn('Beedume исходную строку);

ReadLn(s);

WriteLn('Введите заменяемое слово: );

ReadLn(sl);

WriteLn(‘Beedume заменяющее слово: );

ReadLn(s2);

n:=Pos(sl,s); {определяем вхождение заменяемого сочетания} while п > 0 do begin

Delete(s,n,Length(sl)); {удаляем заменяемое сочетание} Insert(s2,s,n); {вставляем заменяющее сочетание}

n:=Pos(sl,s); {определяем следующее вхождение} end;

WriteLn( ‘Резулынап;; \s);

ReadLn;

End.

Пример 4.18. Разработать программу, меняющую в строке местами слова с указанными номерами. Запретить ввод номеров, которые превышают количество слов в строке или равны между собой.

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

В конце строки пробела может не быть. Следовательно, завершение последнего слова необходимо проверять отдельно, к тому же учитывая, что если после последнего слова нет пробела, то его длина получается на единицу меньше, что тоже необходимо скорректировать.

После того, как местоположение слов определено, необходимо осуществить их перемещение. При этом необходимо учесть, что как только мы удалим первое слово, начало второго слова сместится. Следовательно, вначале необходимо удалить второе слово и вставить первое, а затем уже удалить первое слово и вставить второе. Чтобы не анализировать, какое из слов первое, а какое второе, лучше всего сортировать введенные номера слов по возрастанию.

Program Strokal;

Var nsl, ns2, ks, nl, n2, dll, dl2,ns ,dls, i, w.byte; s, sl, s2:string;

Begin

WriteLn(‘Beedume исходную строку ’); Readln(s); ks:-0; {обнуляем счетчик слов} for /:= 1 to Length (s) do

if (s[i]= ’ ) or (i=length(s)) then {если конец очередного слова } ks:=ks+l; { увеличиваем счетчик слов}

WriteLn('Beedume номера слов для обмена’);

ReadLn(nl,n2); {вводим номера}

while (nl>ks) or(n2>ks) or(nl=n2) do {пока номера не допустимы} begin

WгiteLnCКоличество слов в строке \ks:5,

\ Одинаковые номера не допустимы.

Повторите ввод номеров. ’);

ReadLn(nl,n2); {вводим номера} end;

if nl>n2 then {сортируем номера по возрастанию}

begin w:-nl; nl:=n2; n2:=w; end;

ns:=l; {начало первого слова равно 1} dls:=0; {длина первого слова равна 0} ks:=0; {номер слова пока равен 0}

for i:=l to Length(s) do {по всей строке} begin

if (s[i]= ’ ) or (i=Length(s)) then {если слово завершено} begin

if (i=Lengtli(s)) and (s[ij > ‘) then {если в конце

строки нет пробела}

dls:=dls+l; {корректируем длину слова} ks:=ks+l;

if ks=nl then {если это первое слово}

begin {то запоминаем начало и длину} ns 1: =ns; dl 1: =dls; end;

if ks—n2 then {если это второе слово}

begin {то запоминаем начало и длину} ns 2: =ns; dl2:-dls; end;

dls:=0; {обнуляем длину текущего слова} ns:=i+l; {запоминаем начало текущего слова} end

else dls:=dls+l; {считаем длину очередного слова} end;

sl:=Copy(s, nsl, dll); {копируем значение первого слова} s2:=Copy(s, ns2, dl2); {копируем значение второго слова}

Delete(s, ns2, dl2); {удаляем дальнее слово}

Insert(s 1, s, ns2); {вместо него вставляем ближнее}

Delete(s, nsl, dll); {удаляем ближнее слово}

Insert(s2,s,nsl); {вставляем дальнее}

WriteLn(‘Результат : \ s);

End.

Вариант 2. Вначале разобьем текст на слова и поместим каждое слово в элемент вспомогательного массива строк. Затем выполним перестановку элементов. И, наконец, вновь объединим слова в строку.

Это решение имеет два существенных недостатка. Во-первых, оно требует дополнительной памяти для размещения вспомогательного массива. Во- вторых - выполняться такая программа будет несколько дольше, так как исходная строка будет просматриваться несколько раз. Однако этот вариант решения несколько проще, и в тех случаях, когда отсутствуют строгие ограничения на объем используемой памяти и время выполнения, он может оказаться предпочтительным.

Program Stroka3;

Var ks, nl, n2, i, k.byte; s, si .string;

MasStr:arrayfl..lOOJ of string[20J; {рабочий массив}

Begin

WriteLnCВведите исходную строку ’); Readln(s); ks:=0; {обнуляем счетчик слов}

if s[length(s)] ’ ' then s;=s+' {если в конце строки нет пробела,

то дописываем его}

{разбор строки}

while s ” do {пока в строке остались слова} begin

ks:=ks+l; {увеличиваем счетчик слов} k:=Pos(‘ \s); {определяем конец слова} masStr[ksJ: =Copy(s, l,k); {копируем слово в массив}

Deleters,!,к); {удаляем слово из строки}

end;

{обмен слов}

WriteLnC Введите номера слов для обмена );

ReadLn(nl,п2); {вводим номера}

while (nl>ks) or(n2>ks) or(nl=n2) do {пока номера не допустимы} begin

WriteLn(‘Ko.nuчество слов в строке \ks:5,

'. Одинаковые номера не допустимы.Повторите ввод номеров. ’); ReadLn(nl,n2); {вводим номера} end;

sl:=MasStr[nlJ; {меняем слова местами}

MasStr[nl]: =MasStr[n2];

MasStr[n2J: =sl;

{объединение слов в строку}

for i:=I to ks do s:=s+MasStr[iJ; {объединяем слова в строку} Delete(s,Length(s), 1); {удаляем пробел после последнего слова} WriteLnC Результат : \ s); {выводим результат}

End.

Пример 4.19. Разработать программу, которая осуществляет поиск заданной строки в отсортированном в соответствии с латинским алфавитом массиве строк MasStr[n], п

<< | >>
Источник: Иванова Г.С. Основы программирования. 2002

Еще по теме Практикум. Обработка и поиск символьной информации:

  1. ИНФОРМАЦИЯ: ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНАЯ (
  2. ИНФОРМАЦИЯ: ОБРАБОТКА ПАРАЛЛЕЛЬНАЯ
  3. ГЛАВА ДЕВЯТАЯ ОБРАБОТКА ИНФОРМАЦИИ В УМЕ
  4. 9. Усвоение и обработка информации
  5. 9. Усвоение и обработка информации
  6. Структура массово-информационной деятельности: сбор, обработка, компоновка, передача, восприятие, трансформация, хранение и использование массовой информации. Потенциальная, принятая и реальная информация. Семантический, синтаксический и прагматический аспекты массово-информационных текстов.
  7. 2.2.1. Область поиска, получения и потребления информации
  8. 3.3.1. Поиск информации
  9. В ПОИСКАХ ТЕМЫ И ИНФОРМАЦИИ
  10. ГЛАВА 6 ПРАВО НА ПОИСК, ПОЛУЧЕНИЕ И ИСПОЛЬЗОВАНИЕ ИНФОРМАЦИИ