Уроки 10 (1 часа) – 11 (2 часа)

Тема урока. Обработка символов и строк

Цель урока. Познакомить учащихся с основными приемами работы с символьными и строковыми переменными.

План урока.

1.  Представление символьных и строковых переменных и констант.

2.  Использование в процедурах и функциях параметров-массивов и параметров-строк.

3.  Операции над строками: присваивание, слияние, сравнение, стандартные процедуры и функции для строковых типов.

4.  Пример программы, использующей процедуры и функции операций над строками.

5.  Решение задач.

Обработка символов и строк

Язык Turbo Pascal поддерживает стандартный символьный тип Char и динамические строки, описываемые типом String или String[n].

Символьный тип (Char)

1. Непустой символ из алфавита ПЭВМ, заключенный в одинарные кавычки:

‘A’ ‘a’ ‘8’ ‘%’ ‘&’

2. Представление символа его кодом ASCII:

#97 = Chr(97) = ‘a’ (символ ‘а’)

#0 = Chr(0) = (нулевой символ)

#32 = Chr(32) = ‘ ‘ (пробел)

3. Управляющие символы, имеющие коды от 1 до 31, могут быть представлены их “клавиатурными” обозначениями - значком “^” или служебным знаком (для диапазона 27...31):

^A = #1 = Chr(1)

^B = #2 = Chr(2)

. . .

^ = #26 = Chr(26)

^[ = #27 = Chr(27)

. . .

^_ = #31 = Chr(31)

Строковый тип

Максимальная длина строки 255 символов.

Строки называются динамическими, т. к. могут иметь различные длины в пределах объявленных границ.

Var

S32 : String[32]; { строчные значения, длиной не более 32}

S255 : String[255]; { строчные значения, длиной не более 255}

НЕ нашли? Не то? Что вы ищете?

S : String; { без указания длины - String[255]}

Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки:

‘abcde - абвгд’

‘123 ? 321’

‘ ‘

‘‘‘‘

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

^G’После сигнала нажмите ‘^J’ клавишу пробел ‘^M^J

‘Номер п/п’#179’ Ф И О ‘#179’ Класс ‘#179

#7#32#179#32#32#179 (то же, что ^G’ | | ‘)

^G – звуковой сигнал (код 7)

^J – LF перевод строки (код 10)

^M – CR возврат каретки (код 13)

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

Основное правило:

Типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип.

При описании параметров производным строковым типом нельзя конструировать типы в описании функций:

Function XSTR ( S : String[ 32 ] ) : String[ 6 ];

Корректно это выглядит таким образом:

Type STRING32 = String[ 32 ];

STRING6 = String[ 6 ];

. . .

Function XSTR ( S : STRING32 ) : STRING6;

В Turbo Pascal строки можно рассматривать как массивы, и любой символ в строке можно изъять по его номеру. Отдельный символ совместим по типу со значением Char.

Var

CH : Char;

ST : String;

Begin

ST := ‘Hello’;

CH := ST[ 1 ]; { CH = ‘H’ }

ST[ 2 ] := ‘E’; { ST = ‘HЕllo’ }

CH := ‘X’;

ST := CH; { ST = ‘X’ }

End.

Символ ST[ 0 ] содержит код, равный числу символов в значении ST, т. е. длина строки ST всегда равна Ord( ST[ 0 ]).

Пример записи в строку 80 пробелов:

Var ST : String;

. . .

FillChar ( ST [ 1 ], 80, #32 ); {встроенная процедура заполняет с первого элемента 80 пробелами или ‘ ‘, или #32 }

ST [ 0 ] := Chr( 80 );

Операции над строками

1. Присваивание, слияние

Слияние строк записывается в естественном виде. Если сумма получается длиннее, чем описанная длина левой части оператора присваивания, излишек отсекается.

Var

S1, S2, S3 : String;

Begin

S1 := ‘Вам ‘;

S2 := ‘привет’;

S3 := S1 + S2; { S3 = ‘Вам привет’}

S3 := S3 + ‘ ! ‘; { S3 = ‘Вам привет!’}

End.

2. Сравнение

Сравнение строк происходит посимвольно, начиная от первого символа в строке.

‘abcd’ = ‘abcd’ --> True

‘abcd’ <>‘abcde’ --> True

‘abcd’ <>‘ abcd’ --> True

‘abcd’ >‘abcD’ { ‘d’ > ‘D’ }

‘abcd’ >‘abc’ { ‘d’ > ‘‘ }

‘aBcd’ <‘ab’ { ‘B’ < ‘b’ }

‘ ‘ >‘‘ { #32 > ‘‘ }

3. Стандартные процедуры и функции для строковых типов

Процедуры и функции

Пример

Length ( St) : Byte

Выдает текущую длину строки

Concat ( St1, St2,...,Stn ) : String

Возвращает слияние строк St1, St2,..., Stn

S3:=Concat ( S1, S2 );

{то же, что S3 := S1 + S2}

S3:=Concat ( S3, S1, S2 );

{то же, что S3 := S3 + S1 + S2 }

Copy ( St, Poz, Len) : String

Возвращает подстроку длиной Len, начинающуюся с позиции Poz строки St

Scopy:=Copy(‘ABC***123’, 4, 3 );

{ Scopy = ‘***’}

Scopy:=Copy ( ‘ABC’, 4, 3 );

{ Scopy = ‘‘ }

Scopy:=Copy ( ‘ABC***123’, 4, 11 );

{ Scopy = ‘***123’ }

Delete (St, Poz, Len)

Удаляет из St подстроку длиной Len, начинающуюся с позиции Poz строки St

S:= ‘СТРОКА’;

Delete ( S, 2, 4 ) { S = ‘CA’ }

Insert ( St1, St2, Poz )

Вставляет строку St1 в строку St2, начиная с позиции Poz

S:=‘Начало-конец’;

Insert ( ‘середина-’, S, 8 );

{ S = ‘Начало-середина-конец’}

Pos ( St1, St2 ) : Byte

Ищет первое вхождение подстроки St1 в строке St2 и возвращает номер той позиции, где находится первый символ подстроки St1, если такой строки нет, то вернет 0

P:=Pos ( ‘ss’, ‘Mississippu’ );

{ P = 3 }

Str ( X [ : Width [: Dec ], St )

Преобразует числовое значение Х в строковое St, где Width - ширина поля для числа, а Dec - число знаков после десятичной точки (для вещественных чисел).

Str ( 6.66 : 8 : 2, S ); { S =‘ 6.66’ }

Str ( 6.66 : -8 : 2, S ); { S =‘6.66 ‘ }

Str ( 6.66 : 8 : 0, S ); { S =‘ 7’ }

Val ( St, X, ErrCode )

Преобразует строковое значение St (строку цифр) в значение числовой переменной Х. Если во время выполнения операции преобразования ошибка не обнаружена, то значение ErrCode равно 0, в противном случае ErrCode будет содержать номер позиции первого ошибочного символа.

Пример программы, использующей процедуры и функции операций над строками

Пример 1

Выводит строку, с эффектом раздвижения и звуковым сигналом

Uses Crt;

{ Процедура ExplodeString выводит строку S в позиции (X, Y), с эффектом раздвижения и звуковым сигналом }

Procedure ExplodeString ( X, Y : Byte; S : String; C : Word );

Var

I, L2 : Byte;

Begin

L2 := (Length ( S ) div 2 ) + 1; { середина строки }

If X < 12 then X := L2;

For I := 0 to L2-1 do

Begin

GotoXY ( X-I, Y );

{ Вывод расширяющейся центральной части строки}

Write (Copy ( S, L2-I, 2*I+1) );

Sound ( I*50 );

Delay (C);

NoSound

End

End;

Begin

ClrScr;

ExplodeString ( 40, 12, ‘12345678900987654321’, 100);

Repeat until Keypressed

End.

Пример 2

Перевод числа из символьной строки

{$R-}

Var LongV : LongInt;

WordV : Word;

. . .

WordV := 0;

Val ( S, LongV, ErrCode );

If ErrCode = 0 then

Begin

If ( LongV >= 0 ) and ( LongV <= 65535 )

then WordV:= LongV

else

WriteLn(‘Ошибка диапазона при преобразовании ‘, LongV)

End

else Writeln ( ‘Ошибка в строке ‘, S, ‘ в символе ‘, S[ErrCode] );

Задание

1.  Написать программу перевода строки в число с плавающей точкой.

2.  Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 10 латинских букв; между соседними словами – не менее одного пробела, за последним словом – точка.
Напечатать:
эту последовательность в обратном порядке слов;
эту же последовательность слов, но удалив из нее повторное вхождение слов;
все различные слова, указав для каждого из них число их вхождений в последовательность;
заменить все вхождения "abc" на "DEF";
заменить во всех словах первую букву с заглавную.

3.  Составить программу шифрования текстовых сообщений. Шифровальщик задает ключ шифрования – целое число, которое определяет величину смещения букв русского алфавита, например: ключ равен 3, тогда в тексте буква "а" заменяется на букву "г" и т. д. Исходный текст содержит только буквы русского алфавита.

4.  Составить программу "бегущая строка". На экране в текстовом режиме справа налево перемещается ИМЯ, а слева направо – ФАМИЛИЯ (в той же строке). На середине экрана эти два слова встречаются и ФАМИЛИЯ "заползает" за ИМЯ. Перемещение слов продолжается до границ экрана.

5.  Дана последовательность, содержащая от 1 до 30 слов, между соседними словами – не менее одного пробела, за последним словом – точка. Составить программу проверки правильности написания сочетаний
«жи – ши», «ча - ща», «чу – щу». Исправить ошибки.