ОБРАБОТКА СИМВОЛЬНЫХ И СТРОКОВЫХ ВЕЛИЧИН
Краткие теоретические сведения
В стандарте языка Паскаль описаны два типа переменных для литерных вели- чин. Это - String и Char. Переменная типа Char может содержать в себе только один единственный символ, тип String предназначен для хранения строковых величин до 255 символов длиною.
При описании переменной этого типа можно указать максимальное число сим- волов, которое можно занести в нее (это число не должно превышать 255). Например:
Var S : String[30]; {максимальная длина строки S – 30 символов}
St: String; ]; {максимальная длина строки St – 255 символов}
При использовании строковой переменной, к каждому ее символу можно обра- титься отдельно, указав его порядковый номер.
Пример 1.
Вывести посимвольно строку 'primer' Program pr1;
Var st: string[6]; i: integer; BEGIN
st:='primer';
for i:=1 to 6 do write(st[i], ' ');
END.
В результате работы данной программы на экран будут распечатаны следующие
значения: p r i m e r
Таким образом, первым символом st[1] в переменной st является буква p, вто- рым символом st[2] является r , третьим – i и т.д.
Две строковые величины можно объединять. Эта операция называется конкате- нацией и обозначается знаком "+".
Например, результатом выполнения следующих команд: R:='kadabra';
H:='abra'; S:=H+R;
в переменной S будет значение 'abrakadabra'.
Для конкатенации результат зависит от порядка операндов (в отличие от опера- ции сложения). Следует помнить о том, какой максимальной длины может быть ре- зультирующая переменная, так как в случае превышения значением выражения числа, указанного после String в описании переменной, "лишние" символы в переменную не попадут.
Строковые величины можно сравнивать между собой. Сравнение строк проис- ходит посимвольно. Большим из двух символов считается тот, код которого больше. Если равны первые символы, то сравнивается следующая пара до тех пор, пока не бу- дет найдено различие. Если начало строк совпадает, а одна из них кончается раньше, то вторая автоматически называется большей.
Код символа в Паскале можно определить при помощи функции Ord(C), где С - либо непосредственно указанный символ, либо переменная символьного типа, либо один символ строковой переменной.
Есть и обратная функция, которая возвращает символ по известному коду. Это функция Chr(N), где N - выражение, приводящее к целому числу в интервале от 0 до
255 (возможные значения кода символа). Очевидно, что Chr(Ord(C))=C, Ord(Chr(N))=N.
Пример 2.
Вывести на экран кодовую таблицу:
Program Pr2; Var I : Byte; BEGIN
For I:=32 to 255 do Write(I:4, '-',Chr(I))
END.
Цикл в программе начинается с 32 потому, что символы с кодами от 0 до 31 яв-
ляются управляющими и не имеют соответствующего графического представления.
В Паскале используются следующие процедуры и функции для обработки стро- ковых величин:
Функция Concat(S1[,S2,…,SN]): string – сцепляет (объединяет) строки S1, S2,…, SN. Параметры, указанные в квадратных скобках, не являются обязательными.
Функция Copy(S: string; Index, Count: integer): string – копирует из строки S
количество Count символов, начиная с символа с номером Index.
Функция Length(S: string):byte – определяет длину строки S.
Функция Pos(SubS, S: string):byte – отыскивает в строке S первое вхождение подстроки SubS и определяет номер позиции, с которой она начинается. Если подстро- ка не найдена, то выдается 0.
Функция UpCase(C: char):char – преобразует строчную латинскую букву в прописную. Любые другие символы возвращаются без преобразования.
Процедура Delete(var S: string; Index, Count: integer) – удаляет количество
Count символов из строки S, начиная с символа с номером Index.
Процедура Insert(SubS: string; var S: string; Index: integer) – вставляет под- строку SubS в строку S, начиная с символа с номером Index.
Процедура Str(X [:Width [:Decimals]]; Var S: string) – преобразует число Х в строку символов S. Параметры Width и Decimals задают формат преобразования (об- щую ширину поля и количество символов в дробной части соответственно).
Процедура Val(S: String; var X; var Code: integer) – преобразует строковое значение S в его численное представление X типа Real или Integer. Параметр Code со- держит признак ошибки преобразования (0 – нет ошибки),
Пример 3.
Определить длину введенной пользователем строковой величины.
Program Pr3; Var S : String; BEGIN
Writeln('Введите последовательность символов'); Readln(S); Writeln('Вы ввели строку из ',Length(S), ' символов')
END.
Пример 4.
Задан список из 6 слов. Определить, сколько слов списка начинается на букву «п». Program Pr4;
Var s: string[20]; i,k:integer; BEGIN
k:=0; for i:=1 to 6 do begin
writeln('Введите слово'); readln(s); if s[1]='п' then k:=k+1;
end; writeln(k);
END.
Пример 5.
Определить, является ли введенная строка "перевертышем".
Перевертышем называется такая строка, которая одинаково читается с начала и с конца. Например, "казак" и "потоп" - перевертыши, "канат" - не перевертыш".
Поступим следующим образом: из введенной строки сформируем другую строку из символов первой, записанных в обратном порядке, затем сравним первую строку со второй; если они окажутся равны, то ответ положительный, иначе - отрицательный. Естественно, предложенный способ решения не является единственно возможным.
Program Pr5; Var
S,B : String; I : Byte; BEGIN
Writeln('Введите строку'); Readln(S);
B:=''; {Переменной B присваиваем значение "пустая строка"}
For I:=1 to Length(S) do {перебираем символы строки}
B:=S[I]+B; {Символы строки S присоединяются к переменной B слева}
If B=S Then Writeln('Перевертыш') Else Writeln('Не перевертыш') END.
Пример 6.
Найти сумму цифр введенного натурального числа.
Program Pr6;
Var S : String; I,X,A,C : Integer; BEGIN
Writeln('Введите натуральное число');
Readln(S); {Число вводится в строковую переменную}
A:=0;
For I:=1 To Length(S) Do Begin
Val(S[I],X,C); {Цифра преобразуется в число}
A:=A+X {Числа суммируются}
End;
Writeln('Сумма цифр равна ',A) END.
Пример 7.
Во введенной строке заменить все вхождения подстроки 'ABC' на ‘KLMNO’.
Program Pr7;
Var S : String; A : Byte; BEGIN
Writeln('Введите строку'); Readln(S);
While Pos('ABC',S)<>0 Do {пока подстрока 'ABC' содержится в строке S }
Begin
A:= Pos('ABC',S); {определяем позицию вхождения подстроки 'ABC' в строку S}
Delete(S,A,3); {удаляем из строки S 3 символа, начиная с позиции А }
Insert('KLMNO',S,A) {вставляем в строку S на это место подстроку 'KLMNO'}
End; Writeln(S) END.
Пример 8.
Во введенной строке подсчитать процент вхождения символа ‘o’ и символа ‘e’ (создать функцию для определения процентного содержания заданного символа в строке)
Program Pr8;
{функция, определяющая процент вхождения символа с в строку st}
Function proc_char(st:string;c:char):real;
Var k, n, I:integer; {k –количество заданных символов, n – длина строки, I - номер очередного символа строки}
Begin
n:=length(st); {вычисляем длину строки}
k:=0; for I:=1 to n do {перебираем символы строки}
if st[I]=c then k:=k+1; {если очередной символ строки равен заданному
символу, то увеличиваем счетчик k}
proc_char:=k/n*100; {определяем процент заданных символов}
End;
Var st: string; p1,p2: real;
BEGIN {основная программа}
write('st=');readln(st); {вводим строку}
p1:=proc_char(st,'o'); {определяем процентное содержание символа ‘o’} p2:=proc_char(st,'e'); { определяем процентное содержание символа ‘e’} writeln('o-', p1:2:1,'%'); {вывод результата}
writeln('e-', p2:2:1,'%'); END.
Пример 9.
Задан список из 8 слов. Найти самое короткое слово в списке. Если таких слов несколько, то распечатать их в один столбец.
Решение поставленной задачи сводится к нескольким этапам: ввести список слов в виде массива строковых переменных; подсчитать длину каждой строки; опре- делить наименьшую из длин; распечатать те строки массива, длина которых совпада- ет с наименьшей.
Program Pr9;
Var s: array[1..8] of string[20]; n: array[1..8] of integer;
i, min: integer; BEGIN
for i:=1 to 8 do begin
writeln('Введите слово'); readln(s[i]); n[i]:=length(s[i]);
END.
end;
min:=n[1]; for i:=2 to 8 do if min>n[i] then min:=n[i]; for i:=1 to 8 do if n[i]=min then writeln(s[i]);
В данной программе для обозначения слов используется массив строковых пе- ременных s, для обозначений соответствующих им длин слов – целочисленный массив
n. Наименьший элемент массива n хранится в виде переменной min.
Пример 10.
Задана строка из двух слов, разделенных пробелом. Поменять в данной строке слова местами.
Program Pr10; Var s: string[40];
s1,s2: string[20]; i,n: integer;
BEGIN
writeln('Введите строку'); readln(s);
n:=length(s); i:=pos(' ', s);
s1:=copy(s, 1, i); s2:=copy(s, i+1, n-i); s:=s2 + ' ' + s1; writeln(s);
END.
В данной программе переменная s служит для обозначения строки из двух слов,
переменные s1 и s2 – для обозначения первого и второго слова строки соответствен- но. Алгоритм решения заключается в том, что сначала с помощью функции Pos выяс- няется, каким по счету символом в строке s находится пробел. Далее в строке выделя- ются две подстроки: одна включает все символы левее пробела (первое слово), другая
– правее пробела (второе слово). В конце программы слова сцепляются в обратном по- рядке с использованием разделяющего их пробела.
Контрольные вопросы
1. Понятие строки. Описание строкового типа данных.
2. Представление строки в Паскале. Обращение к символу строки. Длина строки.
3. Стандартные строковые процедуры и функции в языке Паскаль.
4. Понятие строковых выражений.
5. Операции со строковыми данными.
6. Примеры программ работы со строками.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.