Символы и строки

advertisement
Давыдова Е.В., школа № 444
Уроки 10 (1 часа) – 11 (2 часа)
Тема урока. Обработка символов и строк
Цель урока. Познакомить учащихся с основными приемами работы с
символьными и строковыми переменными.
План урока.
1. Представление символьных и строковых переменных и констант.
2. Использование в процедурах и функциях параметров-массивов и
параметров-строк.
3. Операции над строками: присваивание, слияние, сравнение, стандартные
процедуры и функции для строковых типов.
4. Пример программы, использующей процедуры и функции операций над
строками.
5. Решение задач.
Обработка символов и строк
Язык Turbo Pascal поддерживает стандартный символьный тип Char и
динамические строки, описываемые типом String или String[n].
Символьный тип (Char)
1. Непустой символ из алфавита ПЭВМ, заключенный в одинарные кавычки:
‘A’
‘a’
‘8’
‘%’
‘&’
2. Представление символа его кодом ASCII:
#97
#0
#32
= Chr(97)
= Chr(0)
= Chr(32)
= ‘a’
=
=‘‘
(символ ‘а’)
(нулевой символ)
(пробел)
3. Управляющие символы, имеющие коды от 1 до 31, могут быть представлены
их “клавиатурными” обозначениями - значком “^” или служебным знаком (для
диапазона 27...31):
^A
^B
...
^
^[
...
^_
= #1
= #2
= Chr(1)
= Chr(2)
= #26 = Chr(26)
= #27 = Chr(27)
= #31 = Chr(31)
Давыдова Е.В., школа № 444
Строковый тип
Максимальная длина строки 255 символов.
Строки называются динамическими, т.к. могут иметь различные длины в
пределах объявленных границ.
Var
S32 : String[32];
S255 : String[255];
S
: String;
{ строчные значения, длиной не более 32}
{ строчные значения, длиной не более 255}
{ без указания длины - String[255]}
Значением строки может быть любая последовательность символов,
заключенная в одинарные кавычки:
‘abcde - абвгд’
‘123 ? 321’
‘‘
‘‘‘‘
Если включаются в строку управляющие коды, то строка состоит из как бы
склеенных кусков, при этом в такой записи не должно быть пробелов вне
кавычек.
^G’После сигнала нажмите ‘^J’ клавишу пробел ‘^M^J
‘Номер п/п’#179’ Ф И О ‘#179’ Класс ‘#179
#7#32#179#32#32#179
^G
^J
^M
(то же, что ^G’ | | ‘)
– звуковой сигнал (код 7)
– LF перевод строки (код 10)
– CR возврат каретки (код 13)
Давыдова Е.В., школа № 444
Использование в процедурах и функциях параметров-массивов и
параметров-строк.
Основное правило:
Типом любого параметра в списке формальных параметров может быть только
стандартный или ранее объявленный тип.
При описании параметров производным строковым типом нельзя
конструировать типы в описании функций:
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;
ST
:= ‘Hello’;
CH
:= ST[ 1 ];
Begin
ST[ 2 ] := ‘E’;
End.
CH
:= ‘X’;
ST
:= CH;
{ CH = ‘H’ }
{ ST = ‘HЕllo’ }
{ ST = ‘X’ }
Давыдова Е.В., школа № 444
Символ 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’
‘abcd’ <>‘abcde’
‘abcd’ <>‘ abcd’
-->
-->
-->
True
True
True
‘abcd’ >‘abcD’
‘abcd’ >‘abc’
‘aBcd’ <‘ab’
‘ ‘
>‘‘
{ ‘d’
{ ‘d’
{ ‘B’
{ #32
>
>
<
>
‘D’ }
‘‘ }
‘b’ }
‘‘ }
Давыдова Е.В., школа № 444
3. Стандартные процедуры и функции для строковых типов
Процедуры и функции
Пример
Length ( St) : Byte
Выдает текущую длину строки
Concat ( St1, St2,...,Stn ) : String
S3:=Concat ( S1, S2 );
{то же, что S3 := S1 + S2}
Возвращает слияние строк St1, St2,..., Stn
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
Insert ( St1, St2, Poz )
Вставляет строку St1 в строку St2, начиная
с позиции Poz
Pos ( St1, St2 ) : Byte
Ищет первое вхождение подстроки St1 в
строке St2 и возвращает номер той
позиции, где находится первый символ
подстроки St1, если такой строки нет, то
вернет 0
Str ( X [ : Width [: Dec ], St )
Преобразует числовое значение Х в
строковое St, где Width - ширина поля для
числа, а Dec - число знаков после
десятичной точки (для вещественных
чисел).
Val ( St, X, ErrCode )
Преобразует строковое значение St (строку
цифр) в значение числовой переменной Х.
Если во время выполнения операции
преобразования ошибка не обнаружена, то
значение ErrCode равно 0, в противном
случае ErrCode будет содержать номер
позиции первого ошибочного символа.
S:=
‘СТРОКА’;
Delete ( S, 2, 4 )
{ S = ‘CA’ }
S:=‘Начало-конец’;
Insert ( ‘середина-’, S, 8 );
{ S = ‘Начало-середина-конец’}
P:=Pos ( ‘ss’, ‘Mississippu’ );
{P=3}
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’ }
Давыдова Е.В., школа № 444
Пример программы, использующей процедуры и функции операций над
строками
Пример 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] );
Давыдова Е.В., школа № 444
Задание
1. Написать программу перевода строки в число с плавающей точкой.
2. Дана последовательность, содержащая от 1 до 30 слов, в каждом из
которых от 1 до 10 латинских букв; между соседними словами – не менее
одного пробела, за последним словом – точка.
Напечатать:
эту последовательность в обратном порядке слов;
эту же последовательность слов, но удалив из нее повторное вхождение
слов;
все различные слова, указав для каждого из них число их вхождений в
последовательность;
заменить все вхождения "abc" на "DEF";
заменить во всех словах первую букву с заглавную.
3. Составить программу шифрования текстовых сообщений.
Шифровальщик задает ключ шифрования – целое число, которое
определяет величину смещения букв русского алфавита, например: ключ
равен 3, тогда в тексте буква "а" заменяется на букву "г" и т.д. Исходный
текст содержит только буквы русского алфавита.
4. Составить программу "бегущая строка". На экране в текстовом режиме
справа налево перемещается ИМЯ, а слева направо – ФАМИЛИЯ (в той
же строке). На середине экрана эти два слова встречаются и ФАМИЛИЯ
"заползает" за ИМЯ. Перемещение слов продолжается до границ экрана.
5. Дана последовательность, содержащая от 1 до 30 слов, между соседними
словами – не менее одного пробела, за последним словом – точка.
Составить программу проверки правильности написания сочетаний
«жи – ши», «ча - ща», «чу – щу». Исправить ошибки.
Download