Образцы решения типовых задач

Тема: Работа со строковыми переменными.

Цель: Развить навыки обработки строковых данных. Уметь использовать различные методы обработки строк. Получить навыки в организации работы со строковыми переменными: удалением, вставкой, копированием, заменой одной строки на другую и т.д.

Оборудование и материалы: Методическое пособие, ПЭВМ, ручка, карандаш, линейка, ластик, шаблон А4.

Ход работы

Методические рекомендации.

Необходимая информация содержится в лекциях № 19-22.

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

Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.

Для работы с символьной информацией используют новый тип данных - строковый, именуемый ключевым словом string (или просто строка). Этот тип данных во многом похож на одномерный массив символов (Array[0..N] of char), но длина строки (максимальное количество символов N ограничивается числом 255). Значение N определяется при объявлении типа string (N) и может быть любой константой порядкового типа, но не больше 255. Значение N при объявлении типа string можно не указывать: в этом случае длина строки принимается равной 255 символам.

Строка трактуется как цепочка символов и к любому символу в строке можно обратиться по адресу (индексу), подобно одномерным массивам типа Array[0..N] of char. Самый первый байт в строке, имеющий адрес 0 (ноль), содержит код, равный числу символов в строке (длине строки).

Например, дана строка, имеющая следующее описание:

Var St: string;

Тогда длину строки St можно определить как значение функции

Ord (St[0]).

Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки (апострофы). Можно присваивать строке пустое значение, обозначаемое как '' (две одинарные кавычки подряд). При попытке записать в переменную строку длиннее, чем задано в описании, "лишняя" часть будет отсечена.

Строки можно присваивать, сливать и сравнивать.

Например:

Var st1,st2,st3,sts: string;

Begin

...

{ Операции присваивания}

st1:='Фамилия';

st2:='Имя';

st3:='Отчество';

{ Операция слияния}

sto:=st1+' '+st2+' '+st3;

{ В результате в строке sto будет 'Фамилия Имя Отчество'}

End;...

Сравнение строк основывается на порядке расположения символов в таблице ASCII. Например:

'abcd' = 'abcd' - результат сравнения True (истина);

'abc'<'bcd' так как код символа 'a' меньше кода символа 'b' и т.п.

Для работе со строками в ТР разработан ряд стандартных процедур и функций.

Первоначально любая описанная в разделе Var строка содержит "мусор" и рекомендуется инициализировать (заполнять) строки пустыми значениями или чем-либо другим. Для заполнения достаточно длинных строк одинаковыми символами используется встроенная процедура FillChar, например:

Var S:string[80];

Begin...

FillChar (S[1],80,' '); {Заполнение строки пробелами}

или

FillChar (S,Sizeof(S),' '); {Заполнение строки пробелами}

S[0]:=Chr(80); {Занесение кода длины строки}

...

End;

Длину строки можно определить также, используя встроенную функцию Length (S), где S - строка типа string.

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

1) Str (X,S) - преобразует числовое значение X в строковое S.

Возможно задание формата для Х в виде: X:F:n (для вещественных чисел, где F - общее число позиций выделяемых под число, включая десятичную точку, а n - число знаков в дробной части) или X:F (для целых чисел). Эта функция чаще всего используется при работе с процедурами модуля GRAPH.

Например:

Str (55,s); - строковая переменная s принимает значение, равное '55'.

2) Val (S,Х,ErrCode) - преобразует строку S в числовое значение, если это возможно. Параметр ErrCode содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке S, где обнаружен ошибочный символ.

Например:

Val ('125',K,kod) - в результате выполнения этой процедуры переменная К получает целое значение, равное 125, параметр kod=0;

Val (' 1.05',M,code) - M=1.05, code=0;

Val ('100, ',N,code) - это ошибочный вызов, т.к. в исходной строке на 4-й позиции располагается недопустимый для числа символ ',' и поэтому параметр code=4, а переменная N остается без изменения.

Кроме перечисленных имеется еще 5 функций и процедур:

1) Concat (S1,S2,…,Sn) -функция, результат которой равен слиянию строк S1,S2,…,Sn. Например: Ssum:= Concat (s1,s2,s3).

2) Copy ( S,Start,L) - функция, результатом которой является подстрока длиной L, начинающаяся с позиции Start строки S.

Например:

Stcop:= Copy ('TTTx1+++',4,2) - результатом является подстрока Stcop='x1'.

3) Delete (S,Start,L) - процедура, которая удаляет из S подстроку длиной L, начиная с позиции Start в строке S.

4) Insert (S,Subs,Start) - процедура, которая вставляет подстроку Subs в строку S начиная с позиции Start строки S. Например:

S:='Фамилия Адрес';

Insert (S,' Имя Отчество',9);

В результате строка S будет иметь вид: 'Фамилия Имя Отчество Адрес';

5) Pos (Subs,S) - функция поиска вхождения подстроки Subs в строку S; результатом поиска будет номер (адрес) первого символа подстроки Subs в S, если заданная подстрока найдена, или 0, если подстроки в строке нет.

6) Move (var x, y; count: word) - эта функция копирует заданное количество COUNT последовательных байт из источника X в приемник Y.

7) FillChar (var x; count: word; value) - эта функция заполняет заданное количество COUNT последовательных байт переменной X указанным значением VALUE.

Образцы решения типовых задач.

Пример1. Определить, сколько раз в данной строке встречается символ «а».

Решение. Опишем функцию, которой будем передавать строку. Результат выполнения – целое число.

Function Q_Ch (st: String): Byte;

Var i, k: Byte;

Begin

k: =0; {просматриваем все символы строки, их число равно

длине строки, если очередной символ равен «а», увеличиваем

счетчик}

For i: = 1 To Length (st) Do If st [i] = «a» Then Inc (k);

Q_Ch: =k;

End;

Пример. Если длина строки нечетное число, то удалить среднюю букву.

Решение. Пусть k – это длина строки, если оно нечетное, то надо удалить средний символ, а его номер равен k Div 2+1.

Procedure Del (Var st: String);

Var k: Byte;

Begin

k: =Length (st);

If k Mod 2=1 Then Delete (st, k Div 2+1, 1);

End;

Пример 2. Заменить все вхождения подстроки «del» на «Insert».

Решение. Пока такая подстрока встречается, необходимо находить номер первого символа первой встречи, удалять в этом месте «del» и сюда вставлять «Insert».

Procedure Ins (Var st: String);

Var k: Byte;

Begin

While P o s (‘del’,st)<>0 Do

Begin

K:=pos (‘del’,st);

Delete (st, k, Length (‘del’));

Insert (‘Insert’,st,k);

End;

End;

Пример 3. Дана строка, состоящая из нескольких слов, между словами стоит один пробел, в конце предложения – точка. Подсчитать число слов и вывести на экран только те из них, которые начинаются с буквы «а» (слов не больше 30).

Решение. Разобьем предложение на отдельные слова и каждое будем хранить как элемент массива.

Program Example_48;

Const n=30;

Type myarray_Str= Array [1..n] of String;

Var A: Myrray_ Str;

Str:String [255];

K: Byte;

Procedure Init (Var b: Myarray_Str);

Var i: Integer;

Begin

k: =1; {пока не встретится пробел, формируем очередное слово

k, прибавляя по одной букве}

For i: =1 To Length (str) -1 Do

If str [i]<>’’ Then b [k]: =b [k] + str [i]

Else

{если это не последний символ, то увеличиваем счетчик слов

и начинаем формировать соответствующий элемент массива}

If I <> Length (str) -1 Then

Begin Inc (k); b [k]:= ‘’ End;

End;

Begin

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

Readln (str);

Init (A);

Writeln (‘Всего слов: ',k); {просматриваем все слова, если первый

символ очередного слова есть 'a', то выводим его}

For I:=1 To k Do If A [i] = ‘a’ Then Write (A [i], ‘’);

Readln;

End.

Вариант № задач Вариант № задач Вариант № задач
  1, 17, 39   11, 27, 48   5, 37, 45
  2, 18, 40   12, 28, 49   6, 38, 46
  3, 19, 41   13, 29, 50   7, 17, 47
  4, 20, 42   14, 30, 51   8, 18, 48
  5, 21, 43   15, 31, 39   9, 19, 49
  6, 22, 44   16, 32, 40   10, 20, 50
  7, 23, 38   1, 33, 41   11, 21, 51
  8, 24, 45   2, 34, 42   12, 22, 45
  9, 25, 46   3, 35, 43   13, 23, 39
  10, 26, 47   4, 36, 44   14, 24, 40

1. Дана строка. Вывести новую строку, которая состоит из чередующихся символов С1 и С2, начиная с С1.

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

З. Дана строка. Вывести код ее первого и последнего символов.

4. Дана строка. Подсчитать количество содержащихся в ней цифр.

5. Дана строка. Преобразовать все строчные латинские буквы в прописные.

6. Дано целое число. Вывести набор символов, содержащий цифры этого числа в обратном порядке.

7. Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (N> О). Вывести набор символов, изображающих первые N цифр дробной части этого вещественного числа (без округления).

8. Дана строка, изображающая целое число. Вывести сумму цифр этого числа.

9. Дана строка, состоящая из нескольких слов, между словами стоит один пробел, в конце предложения – точка. Подсчитать число слов и вывести на экран только те из них, которые начинаются с буквы «а» (слов не больше 30).

10. Даны два числа N1 и N2 и две строки S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.

11. Даны две строки S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0.

12 Даны две строки S1 и S2. Определить количество вхождений строки S2в строку S1.

13. Дана строка S и символ С. Удвоить каждое вхождение символа С в строку S.

14. Даны строки S1, S2 и символ С. После каждого вхождения символа С в строку S1 вставить строку S2.

15. Даны две строки S1 и S2. Удалить из строки S1 первую подстроку, совпадающую с S2. Если таких подстрок нет, то вывести S1 без изменений.

16. Даны три строки S1, S2, S3. Заменить в строке S1 последнее вхождение строки S2 на S3.

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

18. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат ровно три буквы «А».

19. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого слова.

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

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

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

23. Дана строка-предложение на русском языке. Подсчитать количество содержащихся в строке знаков препинания.

24. Дана строка-предложение на русском языке. Вывести самое длинное слово в предложении (если таких слов несколько, то вывести первое из них).

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

26. Дана строка, содержащая полное имя файла. Выделить из строки название последнего каталога (без символов «\»). Если файл содержится в корневом каталоге, то вывести символ «\».

27. Дана строка-предложение на русском языке. Зашифровать ее, выполняя циклическую замену каждой буквы на следующую за ней в алфавите и сохраняя при этом регистр букв («А» перейдет в «Б», «а» — в «б», «Б» — в «В», «б» в, «я» - в «а», и т.д.). Букву «ё» в алфавите не учитывать («е» должна переходить в «ж». Знаки препинания и пробелы не изменять.

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

29. Дана строка символов. Подсчитать сколько среди символов данной строки встречается

буква x.

30. Дана строка символов. Подсчитать:

a) сколько раз в данной строке встречается символ + и сколько раз символ *;

b) общее число вхождений символов +, -, * в строку.

31. Дана строка символов. Преобразовать данную строку, заменив в ней:

a) все восклицательные знаки точками;

b) каждую точку многоточием.

32. Дана строка символов S. Выяснить имеются ли в данной строке такие символы si, si+1, что si - это запятая, а si+1 - это тире.

33. Даны две строки символов S1 и S2. Выяснить, верно ли, что среди символов строки S1

имеются все буквы строки S2.

34. Дана строка символов. Удалить из данной строки все группы букв вида asdf.

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

каждый символ, отличный от *.

36. Дана строка символов. Заменить в данной строке каждую группу букв child группой букв children.

37. Дана строка символов. Исключить из строки группы символов, расположенные между

парами скобок (,), {, }. Сами скобки тоже должны быть исключены. Предполагается, что

внутри каждой пары скобок нет других скобок.

38. Дана строка символов. Словом будем называть группы символов, разделенных пробелами (одним или несколькими). Подсчитать количество слов в данной строке.

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

40. Дан текстовый файл, в котором записано одно из стихотворений А.С. Пушкина. Сколько раз в каждой строке встречаются гласные буквы?

41. Из строки удалить среднюю букву, если длина строки нечетная, если четная - удалить две средние буквы. Заменить все вхождения в текст некоторые буквы на другую букву (их значения вводить с клавиатуры).

42. Заменить все вхождения подстроки Str 1 на подстроку Str 2 (подстроки вводятся с клавиатуры)

43. Даны две строки. Если они начинаются с одинаковых символах, то напечатать «Да», в противном случае - «Нет»

44. Дана последовательность слов. Напечатать все слова, отличные от слова «hello».

45. Дана последовательность слов. Напечатать все слова в алфавитном порядке.

46. Дана последовательность слов. Напечатать все слова последовательности, которые встречаются в ней по одному разу.

47. Дано предложение. Напечатать все различные слова.

48. Дана последовательность слов. Напечатать все слова, предварительно преобразовав каждое из них по следующему правилу:

а) удалить из слова все предыдущие вхождения последней буквы;

49. Составить программу вывода самой большой цифры в записи заданного числа.

50. Дана последовательность слов. Напечатать те слова последовательности, которые отличны от последнего слова удовлетворяют следующему свойству:

а) в слове нет повторяющих букв;

б) буквы слова упорядочены по алфавиту;

в) слово совпадает с начальным отрезком латинского алфавита (a, ab, abc, abcd, …);

г) слово симметрично.

51. Найти сумму всех чисел строки.

Контрольные вопросы

1. Дайте определение строковой переменной.

2. Какие типы данных используются в качестве базовых в строковых данных?

3. Каким образом распределяется память под строковые переменные?

4. Какие операции выполняются над строковыми переменными?

5. В чем состоит сходство и различие строковых переменных и символьных массивов?

6. Возможно ли преобразование строковых переменных?

7. Назовите основные функции над строковыми переменными и их назначение.

8. Каково назначение процедур DELETE, INSERT.

9. Как реализуется ввод и вывод строковых переменных.

10. Предложите схему преобразования действительных чисел в стринги.

11. Что такое литерный ряд?

12. В чем состоит отличие стринга от литерного ряда?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: