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

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

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

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

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

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

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

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

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

для студентов 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