Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Библиотека / Разные источники / СД - Строки (метод ук-ия)

.pdf
Скачиваний:
40
Добавлен:
23.03.2015
Размер:
372 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Федеральное государственное образовательное учреждение высшего профессионального образования

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

АМЕЛИНА Н.И., РУСАНОВА Я.М.

СТРУКТУРЫ ДАННЫХ. СТРОКИ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ по «Практикуму на ЭВМ»

для студентов 1 курса дневного и вечернего отделений факультета математики, механики и компьютерных наук

Ростов-на-Дону

2007

3

Методические указания разработаны сотрудниками кафедры прикладной математики и программирования: кандидатом технических наук, доцентом Я.М. Русановой и старшим преподавателем Н.И. Амелиной.

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

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

Печатается в соответствии с решением кафедры прикладной математики и программирования факультета математики, механики и компьютерных наук ЮФУ, протокол № 9 от 31мая 2007г.

4

СОДЕРЖАНИЕ

1

Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

2

Посимвольная обработка строк . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

3

Использование стандартных процедур и функций . . . . . . . . . . .

13

4

Обработка слов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

Задачи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

Индивидуальные задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

 

Задание 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

 

Задание 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

 

Задание 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

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

35

ЛИТЕРАТУРА . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

5

1 ОСНОВНЫЕ ПОНЯТИЯ

Строка – это последовательность символов произвольной длины (от 0 до

255). Символы хранятся в памяти компьютера в виде кодов. Соответствие между символами и их кодами называется кодировкой, а таблица соответствия между символами и кодами – кодовой таблицей.

Определение строкового типа string устанавливает максимальное коли-

чество символов, которое может содержать строка. Например, string[20]

устанавливает максимальное количество символов в строке – 20, а если количество символов в квадратных скобках не указано, то оно считается равным 255:

type slovo=string[20];

var Sl : slovo;

Str : string[80];

S,S1,S2 : string;

Тип string без указания типа является базовым строковым типом и все другие производные строковые типы совместимы с ним.

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

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

определяя код нулевого символа ord(S[0]),

используя стандартную функцию length(S).

К символам строки можно обращаться по индексу: S[i] i-ый символ строки S.

6

Например, фрагмент программы, приведенный ниже, позволяет найти сум-

му всех цифр, входящих в строку S :

sum := 0;

for i:=1 to ord(S[0]) do

if S[i] in [’0’..’9’] then

sum := sum + (ord(S[i])-ord(’0’));

Для строк применимы операции конкатенации и сравнения.

Операция конкатенации (+) используется для сцепления нескольких строк в одну:

var S1,S2 : string; C : char;

. . . . . . . . .

S1:=’Строка’;

S2:=’ABC’;

C:=’ ’;

S1:=S1+C+S2;

В результате строка S1 будет содержать значение ’Строка ABC’.

Для сравнения строк применяются операции отношения:

= , < > , < , > , <= , >= .

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

7

2 ПОСИМВОЛЬНАЯ ОБРАБОТКА СТРОК

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

Задачу можно решить с помощью операции конкатенации. Очередной символ S[i] исходной строки S добавляется к результирующей строке Sr слева,

что и обеспечивает размещение символов в обратном порядке. program S_1_1;

var S,Sr: string; i: integer;

begin

writeln (Введите строку’); readln (S);

Sr := ’’;

for i := 1 to ord(S[0]) do Sr := S[i]+Sr;

writeln(Sr)

end.

Более эффективный способ решения задачи состоит в том, что результирующая строка заполняется посимвольно, как обычный массив.

program S_1_2; var S,Sr: string;

i,n: integer; begin

writeln (Введите строку’); readln (S);

n := ord(S[0]);

Sr[0]:= S[0]; {или Sr[0]:=chr(n);}

8

for i := 1 to n do

Sr[i] := S[n-i+1];

writeln(Sr)

end.

Следует обратить внимание на использование одного из операторов Sr[0]:=S[0] или Sr[0]:=chr(n). Таким образом устанавливается длина строки

Sr равной длине строки S, так как в языке Pascal информация о текущей длине строки хранится в ее символе с нулевым индексом.

Ниже приводится еще один вариант решения, в котором преобразованию подвергается исходная строка.

Решение оформлено в виде процедуры S13( S ). Строка S является и входным, и выходным параметром.

procedure S13(var S: string); var i, n: integer;

C: char; begin

n := ord(S[0]);

for i := 1 to n div 2 do begin

C := S[i];

S[i]:= S[n-i+1];

S[n-i+1]:= C

end

end;

Контрольный пример

Входные данные: S=строка для тестаВыходные данные: S=атсет ялд акортс

9

Пример 2. Дана строка, состоящая из строчных латинских букв, цифр, пробелов и знаков равенства. Для каждой цифры посчитать, сколько раз она встречается в строке.

Решение оформлено c использованием процедуры S21( S, A).

Входные параметры: строка S.

Выходные параметры: массив А для хранения числа вхождений соответст-

вующей цифры.

Параметр для количества элементов в массиве не предусмотрен, так как количество элементов массива для данной задачи фиксировано и равно количеству цифр – 10.

program S_2_1;

type mas = array[’0’..’9’] of integer;

{каждый элемент массива типа mas предназначен для хранения числа вхождений соответствующей цифры от 0 до 9} var S: string;

Res: mas; j: char;

procedure S21(var S: string; var A: mas); var n, i: integer;

j: char;

begin

n := ord(S[0]);

for j := ’0’ to ’9’ do A[j] := 0;

for i := 1 to n do

{если символ S[i] принадлежит множеству цифр} if S[i] in [’0’..’9’] then

10

A[S[i]] := A[S[i]]+1

end; begin

writeln (Введите строку’); readln (S);

S21(S, Res);

for j := ’0’ to ’9’ do

writeln(’символ ’,j,’ встречается ’,Res[j],’ раз(а)’)

end.

В случае если тип данных множество еще не известен, проверку факта, что символ является цифрой, можно произвести следующим образом:

if (S[i] >= ’0’) and (S[i] <= ’9’) then

Контрольный пример

Входные данные: S=a=1 b=27 ccc=2227Выходные данные: A=(0,1,4,0,0,0,0,2,0,0)

Результаты работы программы: символ 0 встречается 0 раз(а) символ 1 встречается 1 раз(а) символ 2 встречается 4 раз(а) символ 3 встречается 0 раз(а) символ 4 встречается 0 раз(а) символ 5 встречается 0 раз(а) символ 6 встречается 0 раз(а) символ 7 встречается 2 раз(а) символ 8 встречается 0 раз(а) символ 9 встречается 0 раз(а)

11

Упражнения

1) Измените вывод в программе S_2_1 таким образом, чтобы выводились значения только для тех цифр, которые встречаются в строке S.

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

Пример 3. Дана строка. Напечатать в алфавитном порядке все различные латинские строчные буквы этой строки.

Задача имеет красивое и короткое решение. Для его реализации в качестве основного организуется цикл по всем латинским строчным буквам, так как в таблице символов (ACSII или Unicode) они упорядочены по алфавиту.

program S_3_1;

var n, k, i: integer; S: string;

begin

writeln (Введите строку’); readln (S);

n := ord(S[0]);

for i := ’a’ to ’z’ do begin

k := 1;

while (k<=n) and (S[k]<>i) do k := k+1;

if k <= n then write(i,’ ’)

end; writeln

end.

12