Уроки 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 слов, между соседними словами – не менее одного пробела, за последним словом – точка. Составить программу проверки правильности написания сочетаний
«жи – ши», «ча - ща», «чу – щу». Исправить ошибки.


