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