ОБРАБОТКА СИМВОЛЬНЫХ И СТРОКОВЫХ ВЕЛИЧИН

  • docx
  • 26.12.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л3-0025367.docx

ОБРАБОТКА СИМВОЛЬНЫХ И СТРОКОВЫХ ВЕЛИЧИН

 

Краткие теоретические сведения

 

В стандарте языка Паскаль описаны два типа переменных для литерных вели- чин. Это - 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 , третьим –  и т.д.

Две строковые величины можно объединять. Эта операция называется конкате- нацией и обозначается знаком "+".

Например,                   результатом             выполнения             следующих                                    команд: 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.     Примеры программ работы со строками.