Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания.pdf
Скачиваний:
81
Добавлен:
13.02.2015
Размер:
1.2 Mб
Скачать

write(‘Введите строку’); readln(st1); write(‘Введите символ’); readln(ch);

st1:=del_char(st1,ch); writeln(st1);

end.

В данном примере использовалась дополнительная временная строка strTmp, которая постепенно заполнялась символами из оригинальной строки s. Такой подход можно использовать для решения большого класса различных задач, связанных с преобразованием строк.

Рассмотрим вариант решения этой же задачи без использования дополнительной строки:

Листинг 13.2

Function del_char(s:string; ch:char):string; Begin

while pos(ch,s)>0 do delete(s,pos(ch,s),1); del_char:= s;

End;

Здесь условие pos(ch,s)>0 проверяет имеются ли в строке еще символы совпадающие с ch, если да, то они удаляются delete(s,pos(ch,s),1).

Последнюю функцию легко преобразовать для удаления группы символов, для этого изменить тип передаваемого в функцию параметра и в процедуре delete укажем, что удалять нужно не один символ, а length(symbols):

Листинг 13.3

Function del_char(s:string; symbols: string):string; Begin

while pos(symbols,s)>0 do delete(s,pos(symbols,s),length(symbols));

del_char:= s; End;

Все предыдущие функции удаляли символы с учетом регистра, изменим функцию из листинга 13.3 так, чтобы она не обращала внимания на реестр, для этого в условии сравнения нужно предусмотреть приведение символов к одному регистру. В Delphi это можно сделать, например, так AnsiUpperCase(s):

Листинг 13.4 (Delphi)

Function del_char(s:string; symbols: string):string; Begin

while pos(AnsiUpperCase(symbols), AnsiUpperCase(s))>0 do delete(s,pos(symbols,s),length(symbols));

del_char:= s; End;

Пример 13.3 Удалить из строки лишних пробелов (пробелы в начале и в конце строки, между словами также должен быть один пробел).

94

Алгоритм здесь следующий:

1)удаляем пробелы в начале и в конце строки (в Delphi функция trim(s))

2)переписываем строку во временную, при переписывании пробела проверяем, что последний символ временной строки strTmp[length(strTmp)] не пробел.

Листинг 13.5 (Delphi)

function del_(s:string):string; Var i:byte; strTmp:string; Begin

s:=trim(s);

strTmp:='';

for i:=1 to length(s) do

if s[i]<>' 'then strTmp:=strTmp+s[i] else if strTmp[length(strTmp)]<>' '

then strTmp:=strTmp+s[i]; del_char:= strTmp;

End;

Пример 13.4 Определить количество слов в заданном тексте.

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

Таблица 13.2 Система тестов

Вариант

Данные

Результат

один пробел

"Кот на крыше"

N=3

несколько пробелов

"Кот на крыше"

N=3

Вариант 1. Слова в тексте разделены

Вариант 2. Слова в тексте разделены

одним пробелом.

произвольным количеством пробелов

Листинг 11.6

Листинг 11.7

Write('Введите текст :');

WriteLn('Введите текст :');

ReadLn(Text);

ReadLn(Text);

Number:=1;

Number := 0; Flag := TRUE;

For i:=1 to Length(Text) do

For i := 1 to Length(Text) do

begin

begin

Letter:=Text[i];

Letter := Text[i];

If (Letter=' ') then

If (Letter <> ' ') and Flag

Number:=Number+1;

then Number := Number+1;

end;

Flag := (Letter=' ')

WriteLn(Number);

end;

 

WriteLn(Number);

Пример 13.5 Ввести с клавиатуры в одной строке ряд слов (каждое не

95

//Объявление динамического массива
//Ввод строки символов
//Изменение размерности массива

длиннее 10 символов), разделенных пробелами и вывести их по одному в строке, удалив пробелы.

Листинг 13.8 (Delphi)

var s:string; i, j:byte; mas_str:array of string[10]; begin

read(s); j := 1;

setlength(mas_str,j);

for i := 1 to length(s) do begin

if s[i] <> ' '

then mas_str[j-1] := mas_str[j-1] + s[i] else

if length(mas_str[j-1]) > 0 then begin

j:=j+1; //Увеличение счетчика количества элементов массива setlength(mas_str,j); //Изменение размерности массива

end;

end;

j:=0;

while (j<length(mas_str))and(length(mas_str[j])>0) do begin

writeln(mas_str[j]); //вывод элементов массива на экран inc(j);

end;

end.

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

13.2Задания к лабораторной работе №11

1.Дана строка, заканчивающаяся точкой. Подсчитать, сколько слов в

строке.

2.Дана строка, содержащая английский текст. Найти количество слов, начинающихся с буквы b.

3.Дана строка. Подсчитать, сколько в ней букв r, k, t.

4.Дана строка. Определить, сколько в ней символов , ;, :.

5.Дана строка, содержащая текст. Найти длину самого короткого слова

исамого длинного слова.

96

6.Дана строка символов, среди которых есть двоеточие (:). Определить, сколько символов ему предшествует.

7.Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран слова, содержащие три буквы.

8. Дана строка. Преобразовать ее, удалив каждый символ и повторив каждый символ, отличный от .

9.Дана строка. Определить, сколько раз входит в нее группа букв abc.

10.Дана строка. Подсчитать количество букв k в последнем ее слове.

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

12.Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а.

13.Дана строка символов, среди которых есть одна открывающаяся и одна закрывающаяся скобка. Вывести на экран все символы, расположенные внутри этих скобок.

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

15.Дан набор слов, разделенных точкой с запятой (;). Набор заканчивается двоеточием (:). Определить, сколько в нем слов, заканчивающихся буквой а.

16.В строке указать те слова, которые содержат хотя бы одну букву k.

17.Дана строка. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой.

18.В строке заменить все двоеточия (:) точкой с запятой (;). Подсчитать количество замен.

19.В строке удалить символ «двоеточие» (:) и подсчитать количество удаленных символов.

20.В строке между словами вставить вместо пробела запятую и пробел.

21.Удалить часть символьной строки, заключенной в скобки (вместе со скобками).

22.Определить, сколько раз в строке встречается заданное слово.

23.В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после нее.

24.Дана строка. Преобразовать ее, заменив точками все двоеточия (:), встречающиеся среди первых n/2 символов, и заменив точками все восклицательные знаки, встречающиеся среди символов, стоящих после n/2 символов.

25.Строка содержит одно слово. Проверить, будет ли оно читаться одинаково справа налево и слева направо (т.е. является ли оно палиндромом).

26.В записке слова зашифрованы — каждое из них записано наоборот. Расшифровать сообщение.

97

27.Проверить, одинаковое ли число открывающихся и закрывающихся скобок в данной строке.

28.Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться в грамматически правильной форме, например а — 25 раз, к — 3 раза и т.д.

29.Упорядочить данный массив английских слов по алфавиту.

30.Даны две строки А и В. Составьте программу, проверяющую, можно ли из букв, входящих в А, составить В (буквы можно использовать не более одного раза и можно переставлять).

Например, А: ИНТЕГРАЛ; В: АГЕНТ — составить можно; В: ГРАФ — составить нельзя.

98