
AlgStr / Библиотека / Разные источники / СД - Строки (метод ук-ия)
.pdfФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Федеральное государственное образовательное учреждение высшего профессионального образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
АМЕЛИНА Н.И., РУСАНОВА Я.М.
СТРУКТУРЫ ДАННЫХ. СТРОКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ по «Практикуму на ЭВМ»
для студентов 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