Символьные и строковые переменные в Turbo Pascal Содержание: 1. Введение 2. Символьный тип CHAR 3. Управляющие символы 4. Сравнивание символов 5. Операции над символами 6. Массив символов 7. Строковый тип STRING 8. Операции над строками 9. Слияние строк 10. Хранение строк 11. Сравнение строк 12. Процедуры и функции 13. Задачи В математике под переменной обычно понимают некую величину, значения которой могут быть только числами. В языках программирования почти все данные, с которыми работают программы, хранятся в виде переменных. В частности, бывают переменные для хранения текстовых данных: предложений, слов и отдельных символов. Язык Turbo Pascal поддерживает стандартный символьный тип Char и динамические строки, описываемые типом String или String[n]. Символьный тип Язык Turbo Pascal поддерживает стандартный символьный тип Char К символьным переменным относятся: • прописные латинские буквы 'А', 'В', 'С', ..., 'Z', • строчные 'а', 'Ь', 'с', ..., 'z'. • цифры '0', 1', '2', ..., '9', • знаки препинания, всевозможные скобки, русские буквы и т. д. В программах их значения всегда заключаются в апострофы. Внутри каждого такого ряда коды символов упорядочены: ‘А' < 'В' < 'С' < ... < 'Z' 'а' < 'Ь' < 'с' < ... < 'z' '0' < 1' < '2' < ... < '9' 'А' < 'Б' < 'В' < ... < 'Я' 'а' < 'б' < 'в'< ... < 'я' Символьные переменные в памяти компьютера хранятся в виде числовых кодов. Под хранение символа выделяется 1 байт (8 бит), поэтому всего можно закодировать 2^8=256 различных символов. Кодировка символов, которая используется в Турбо-Паскале, называется ASCII (американский стандартный код для обмена информацией). Если в качестве кода используется конкретное число, а не выражение и не переменная, то можно использовать симво "#" #97 #0 #32 = Chr(97) = Chr(0) = Chr(32) = ‘a’ = =‘‘ (символ ‘а’) (нулевой символ) (пробел) Некоторые символы (с кодами, меньшими 32) являются управляющими, при выводе таких символов на экран происходит какое либо действие, например: символ с кодом 10 переносит курсор на новую строку, с кодом 7 - вызывает звуковой сигнал, с кодом 8 - сдвигает курсор на одну позицию влево. Управляющие символы могут быть представлены их “клавиатурными” обозначениями - значком “^” или служебным знаком (для диапазона 27...31): ^A ^B ... ^ ^[ ... ^_ = #1 = #2 = Chr(1) = Chr(2) = #26 = #27 = Chr(26) = Chr(27) = #31 = Chr(31) Напишем программу, которая выдаёт на экран таблицу с кодами символов: program ASCII; var ch: char; begin for ch:=#32 to #255 do write(ord(ch),'->',ch,' '); readln; end. В этой программе в качестве счётчика цикла была использована символьная переменная, это разрешается, поскольку цикл for может использовать в качестве счётчика переменные любого типа, значения которого хранятся в виде целых чисел. Для символьных данных не определены никакие арифметические операции, но они могут сравниваться по своим кодам, участвовать в чтении, печати, операторах присваивания. Таблица ASCII составлена таким образом, что коды букв (латинских и большинства русских) возрастают при движении в алфавитном порядке, а коды цифр расположены по порядку: ord('0')=48, ord('1')=49, ... ord('9')=57. Сравнения символов можно использовать везде, где требуются логические выражения: в операторе if, в циклах и т.п. Операции над символами Succ(х) (от succeedent - последующий) - она выдаёт символ со следующим кодом. Pred(х) (от predecessor - предшественник) - выдаёт символ с предыдущим кодом. Readkey - программа передает значение нажатого символа без нажатия на клавишу Enter и вывода на экран вводимого символа. Пример записи: A:=readkey Ord(x) - Определяет код символа. Например: Ord(‘A’) - 65 Chr(x) - Определяет символ по коду. Например: Chr(65) - ’A’ Приведем пример: программа читает символ и выводит его числовой код: PROGRAM prog#6; VAR c: CHAR; BEGIN write('Введите символ: '); readln(c); writeln('Код символа ', c, ' – ', ord(c)); END. Окно ввода/вывода: Введите символ: G Код символа G – 71 Как вы видите, в операторе вывода вместо переменной используется выражение (функция), возвращающее нужное для вывода значение. Последовательность символов - это строка. Строку можно представить как массив. Так как массивы символов являются обычными массивами с элементами типа CHAR, они обладают всеми свойствами массивов. Например: Из набора 10 любых символов напечатать только заглавные английские буквы и их коды. program lr2; type sl =array [1..10] of char; var s: sl; {описание массива символов} i: integer; begin writeln ('введите 10 символов'): for i:=l to 10 do readln (s[i]); {ввод массива} for i:=l to 10 do if (s[i]>='A') and (s[i]<= 'Z') then writeln ('Символ :', s[i], ' его код =', ord(s[i]); readln; end. Очень часто требуется работать не с одним символом, а с несколькими (например, ввести имена и фамилии учащихся и вывести их в алфавитном порядке). Строковый тип Последовательность символов, заключенная в апострофы, называется строкой и описывается в Турбо-Паскале типом STRING: 'ASEWQ', 'zxczxczxc', 'хи-хи' и т. д. Строки, состоящие всего из одного символа, называются символьными константами. Значениями строковых переменных могут быть последовательности различной длины (от нуля и более, длине 0 соответствует пустая строка). Объявить строковую переменную можно двумя способами: var s: string; var s: string[n]; (максимальная длина - n символов, n константа или конкретное число). Var S32: String[32]; {строчные знач., длиной не более 32} S255: String[255];{строчные знач., длиной не более 255} S: String; {без указания длины - String[255]} Операции над строками Для того чтобы положить значение в строковую переменную используются те же приёмы, что и при работе с символами. В случае присваивания конкретной строки она должна записываться в апострофах (s:='Hello, world!') Приведём пример со строками: программа спрашивает имя у пользователя, а затем приветствует его: program Hello; var s: string; begin write('Как Вас зовут: '); readln(s); write('Привет, ',s,'!'); readln; end. Слияние строк записывается в естественном виде. Если сумма получается длиннее, чем описанная длина левой части оператора присваивания, излишек отсекается. Var S1, S2, S3: String; Begin S1:= ‘Вам ‘; S2:= ‘привет’; S3:= S1 + S2; S3:= S3 + ‘ ! ‘; { S3 = ‘Вам привет’} { S3 = ‘Вам привет !’} End. К строкам можно применять операцию "+", при этом результатом будет строка, состоящая из последовательно записанных "слагаемых". Пример: после действия s:= 'abc'+'def'+'ghi'; переменная s будет содержать 'abcdefghi' Хранение строк В памяти компьютера строка хранится в виде последовательности из символьных переменных, у них нет индивидуальных имён, но есть номера, начинающиеся с 1. Для того чтобы в программе получить доступ к n-му символу строки используется запись s[n]. Сравнение строк Строки сравниваются последовательно, по символам. Сравниваются первые символы строк, если они равны то вторые, и т. д. Если на каком-то этапе появилось различие в символах, то меньшей будет та строка, в которой меньший символ. Если строки не различались, а затем одна из них закончилась, то она и считается меньшей. Примеры: 'ананас'<'кокос' 'свинья'>'свинина' 'hell'<'hello‘ ‘abcd’>‘abcD’ { ‘d’>‘D’ } ‘abcd’>‘abc’ { ‘d’>‘‘ } ‘aBcd’<‘ab’ { ‘B’<‘b’ } ‘ ‘ >‘‘ { #32>‘‘ }. Процедуры и функции для работы со строками CONCAT (STRI, STR2) - Возвращает объединение строк STRI, STR2 конкатенируемые строки COPY(STR, I, J) - Возвращает копию подстроки из J символов, которые располагаются в строке STR, начиная с позиции I LENGTH(STR) - Возвращает длину строки POS(TEXT, STR) - Возвращает номер позиции, начиная с которой располагается подстрока TEXT в строке STR DELETE (STR, I, J) - Удаляет из строки STR J символов, начиная с позиции I INSERT(TEXT,STR, I) - Вставляет подстроку TEXT в строку STR, начиная с позиции I Str ( X, St ) - Преобразует числовое значение Х в строковое St VAL (STR, X,CODE) - Преобразовывает строку STR в двоичное число X, где CODE – код неправильного символа UpCase (S) – преобразует строковый латинский символ S в прописной Рассмотрим несколько примеров C:=LENGTH(str); - переменной С будет присвоено целое значение, показывающее количество символов в строковой переменной str. str:=CONCAT(st1,st2,...,stN); str - переменная типа STRING, состоящая из строк st1, ..., stN. S3:=Concat ( S1, S2 ); {то же, что S3 := S1 + S2} S3:=Concat ( S3, S1, S2 );{то же, что S3 := S3 + S1 + S2 } P:=POS (st1, st2); Р-целое число, показывающее номер позиции, с которой начинается строка st1 в строкe st2. P:=Pos ( ‘ss’, ‘Mississippu’ ); { P = 3 } S:=‘СТРОКА’; Delete ( S, 2, 4 ) { S = ‘CA’ } S:=‘Начало-конец’; Insert ( ‘середина-’, S, 8 );{ S = ‘Начало-середина-конец’} S1:=COPY( str, I, J); Sl - символьная подстрока, выделенная из строки str с позиции I, длиной J символов. S1:= Copy(‘Информатика’,3,5); {S1 = ‘форма’ } Str ( 6.66 : 8 : 2, S ); Str ( 6.66 : -8 : 2, S ); Str ( 6.66 : 8 : 0, S ); { S =‘ 6.66’ } { S =‘6.66 ‘ } { S =‘ 7’ } VAL(‘1015’,X, C) – переменной Х будет присвоено целое значение 1015 Задача 1. Вывести в одну строку А В ВССС... ZZ... Z. Задача 2. Вывести в одну строку ZYY... А А... А.. Задача 3. Вывести треугольник А В С... Z В С... Z Решение Решение Решение Задача 5. Подсчитать количество слов во введенной с клавиатуры строке. Решение Задача 4. Дана строка символов. Удалить из нее все знаки препинания. Решение Задача 6. Дана строка символов. Заменить в ней все 'A' на 'AAA' Решение Задача 7. Присвоить переменной а значение 'G', считать значение другой переменной из окна ввода/вывода и вывести значения обеих переменных. Задача 8. Подсчитать сколько раз среди символов заданной строки встречается буква, заданная с клавиатуры. Решение Решение Решение Задача 9. Составить программу, которая печатает заданное слово задом наперед Задача 10. Найти заданный символ в заданной строке Решение Решение Задача 11. Определяющая длину строки в символах Задача 12. Дана строка символов. Заменить в ней восклицательные знаки на точки Решение Задача 13. Выводит строку, с эффектом раздвижения и звуковым сигналом Uses Crt; Решение Задача 14. Перевод числа из символьной строки {$R-} Решение Задача 15. Дана строка символов. Удалить из нее первый знак препинания. Решение Задача 16. Данная программа запрашивает ваше имя, а потом здоровается с вами Решение