Символы и строки (PascalABC.NET)
Pascal ABC.NET выбор школьника - Часть 3
Символы (char)
Данные символьного типа имеют тип char и занимают в памяти два байта. Используется кодировка стандарта Unicode. В тексте программы символьная константа (так называемый литерал) всегда заключается в одинарные кавычки.
1 var c1, p135, rz: char; // три переменные
2 var Символ1: char; // одна переменная
3 var s: sequence of char; // последовательность символов;
4 var ca: array[1..35] of char; // статический массив символов
5 var ar: array of char; // динамический массив символов
6 var m: array[,] of char; // матрица символов
7
8 var a: char := 'a'; // тип указан явно
9 var b:= 'b'; // автовыведение типа
10 var kt:= ('A', 'B', 'C'); // кортеж из трех символов
Перевод символа в его код и обратно
Символ в код
- Ord(c) – код символа c в Unicode (тип word длиной 2 байта);
- char.Code – то же, точечная нотация;
Код в символ
- Chr(код) – символ с указанным кодом Unicode;
- #код – символ с указанным кодом Unicode; принимает только
литерал;
Принадлежность символа к группе
Является ли символ буквой?
c.IsLetter
Расширение c.IsLetter возвращает True, если символ c принадлежит к группе букв и False в противном случае.
Является ли символ цифрой?
c.IsDigit
Расширение c.IsDigit возвращает True, если символ c принадлежит к группе цифр и False в противном случае.
Является ли символ пробельным?
Пробельные символы – термин, пришедший из типографской практики. Пробел – это пустое место, интервал между символами. Пробельными в типографском и издательском деле называют непечатаемые (и неотображаемые) символы. Символы с десятичными кодами 9..13 относятся к так называемым управляющим символам – раньше они управляли внешними устройствами, такими как механический принтер. Символ с кодом 32 – это пробел.
char.IsWhiteSpace(c)
Статический метод char.IsWhiteSpace(c) возвращает True, если символ c принадлежит к группе пробельных символов и False в противном случае.
Является ли символ знаком препинания?
char.IsPunctuation(c)
Статический метод char.IsPunctuation(c) возвращает True, если символ c принадлежит к группе знаков пунктуации (разделителям) и False в противном случае.
Принадлежит ли буква к верхнему регистру?
c.IsUpper
Расширение c.IsUpper возвращает True, если символ c принадлежит к буквенным символам верхнего регистра (прописным) и False в противном случае. Если символ не является буквой, всегда возвращается False.
Принадлежит ли буква к нижнему регистру?
c.IsLower
Расширение c.IsLower возвращает True, если символ c принадлежит к буквенным символам нижнего регистра (строчным) и False в противном случае. Если символ не является буквой, всегда возвращается False.
Принадлежит ли символ интервалу?
c in c1..c2
Конструкция c in c1..c2 вернет True, если символ c принадлежит группе символов от с1 до с2 включительно и False в противном случае.
Операции преобразования символов
Смена регистра буквенного символа
- c.ToUpper – расширение возвращает буквенный символ c, приведенный к верхнему регистру, если он принадлежит к нижнему регистру. В противном случае символ возвращается без изменения;
- UpCase(c) – функция, делающая то же самое;
- c.ToLower – расширение возвращает буквенный символ c, приведенный к нижнему регистру, если он принадлежит к верхнему регистру. В противном случае символ возвращается без изменения;
- LowCase(c) – функция, делающая то же самое
Преобразование цифрового символа в число
c.ToDigit
Расширение c.ToDigit возвращает буквенный символ c, преобразованный к изображаемому им целому неотрицательному однозначному числу типа integer. Если символ не является цифрой при выполнении программы будет выдано сообщение «Ошибка времени выполнения: not a Digit» и программа завершится аварийно.
Получение символа, соседнего с указанным
- c.Pred – расширение возвращает буквенный символ, код которого в кодовой таблице предшествует коду символа c;
- Pred(c) – функция, делающая то же самое;
- c.Succ – расширение возвращает буквенный символ, код которого следует за кодом символа c;
- Succ(c) – функция, делающая то же самое.
Смещение по символам кодовой таблицы
- Dec(c) – процедура, заменяющая значение переменной, содержащей символ c на символ, предшествующий ему. Ведь это обычная
операция декремента, только для символа;
- Dec(c, n) – процедура, заменяющая значение переменной c, содержащей символ c на символ, находящийся в кодовой таблице на n
позиций раньше. Тоже декремент;
- Inc(c) – процедура, заменяющая значение переменной, содержащей символ c на символ, следующий за ним. Это инкремент.
- Inc(c, n) – процедура, заменяющая значение переменной, содержащей символ c на символ, находящийся в кодовой таблице на n
позиций дальше. И это инкремент.
Ввод символов
Функции, осуществляющие ввод символьных данных с приглашением:
1 var c1 := ReadlnChar('ТекстПриглашения'); // ввод одного символа
2 var c2 := ReadlnChar2('ТекстПриглашения'); // ввод двух символов
3 var c3 := ReadlnChar3('ТекстПриглашения'); // ввод трех символов
4 var c4 := ReadlnChar4('ТекстПриглашения'); // ввод четырех символов
Вывод символов
С выводом все просто: используются уже знакомые процедуры Write, Writeln, Print, Println, а также расширения .Print и .Println. Имеется лишь oдна особенность вывода символов при помощи расширений: разделителем по умолчанию является не пробел, а пустой символ.
Строки
В PascalABC.NET строка – это последовательность символов практически неограниченной длины (на самом деле, строка не может занимать в памяти больше 2.1 Гбайт), принадлежащая некоторому алфавиту.
Символы в строке нумеруются от единицы (Эта особенность унаследована от языка Turbo Pascal) и чтобы обратиться к символу с номером k в строке s нужно написать s[k].
Чтобы символы строк нумеровались с 0 как и элементы динамических массивов необходимо в начале файла написать директиву компилятора.
{$ZeroBasedStrings}
Имеются два типа строк. Первый тип – строки длиной не превышающей 255 символов, унаследованные от языка Turbo Pascal. Они именуются короткими строками». При описании короткой строки после ключевого слова string в квадратных скобках указывается ее максимальная длина. Короткие строки оставлены в языке лишь для совместимости со старыми программами. Второй, основной тип строк – современные строки; при их описании длина не указывается. Мы будем рассматривать именно такие строки.
1 var st, s1, p18: string; // три строки
2 var s1: string; // одна строка
3 var sos: sequence of string; // последовательность строк
4 var ar: array of string; // динамический массив строк
5 var sh1: string[27]; // короткая строка, максимум 27 символов
6 // Описание строк можно соединять с инициализацией:
7 var s1: string := 'Это строка'; // тип указан явно
8 var s2 := '*** И это строка ***'; // автовыведение типа
9 var kt := ('Это', 'тоже', 'строка'); // кортеж из трех строк
Строка может состоять из одного символа, и даже может иметь и нулевую длину, т.е. не содержать ни одного символа. В последнем случае она записывается парой одиночных кавычек, следующих друг за другом.
Длина строки
Текущую длину строки, т.е. количество символов в ней, можно определить следующим образом:
- s.Length – свойство, возвращает длину строки s
- Length(s) – функция, делающая то же самое
Нумерация символов в строке от 0 или от 1
Если вы не используете директиву компилятора для нумерации символов строк с 0, то важно иметь ввиду это различие.
Несмотря на то, что символы в строке нумеруются от единицы, при использовании любых методов класса string, к которому относятся строки, считается что символы в строке индексируются от нуля. В функциях и процедурах, не относящихся к этому классу, а также в срезах, символы считаются проиндексированными от единицы.
Запомнить это проще всего визуально. Если в коде программы строка s используется в записи вида string.Метод(s) или s.Метод, она считается индексированной от нуля. Если «точки» нет, то строка считается индексированной от единицы.