Опубликован: 06.09.2005 | Доступ: свободный | Студентов: 12780 / 1211 | Оценка: 3.98 / 3.46 | Длительность: 12:50:00
ISBN: 978-5-9556-0025-3
Лекция 5:

Символы и строки. Множества

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Аннотация: Приемы работы с символьными и строковыми данными. Использование множеств. Задание больших множеств массивами.

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

Две предыдущие лекции были посвящены произвольным массивам. Перейдем теперь к изучению массивов специального вида - линейных массивов, состоящих только из символов, - строк. Кроме того, сами символы мы тоже не обойдем вниманием.

Описание строк

В разделе var строки описываются следующим образом1Как описывать символьные переменные, мы рассказали в лекции 2.:

var <имя_строки>: string[[<длина>]] 2Напомним, что жирная квадратная скобка является стандартным элементом синтаксиса, а обычная - указанием на необязательность заключенных в нее элементов.

Максимальная длина строки - 255 символов. Нумеруются ее компоненты начиная с 0, но этот нулевой байт хранит длину строки.

Если <длина> не указана, то считается, что в строке 255 символов. Поэтому для экономии памяти следует по возможности точно указывать длину используемых строк.

Примеры описаний:

var s1: string[10];	(*строка длиной 10 символов*) 
	s2: string;	(*строка длиной 255 символов*)

Необходимо отметить, что один символ и строка длиной в один3На самом деле "строка длиной в один символ" имеет две компоненты: s[0] (длина строки = 1) и s[1] (собственно символ) символ

var c: char; 
	s: string[1];

совершенно не эквивалентны друг другу. Вне зависимости от своей реальной длины, строка относится к конструируемым структурированным типам данных, а не к базовым порядковым (см. лекцию 2).

Символ-константа и строка-константа

Неименованные константы

В тексте программы на языке Pascal последовательность любых символов, заключенная в апострофы, воспринимается как символ или строка. Например:

c:='z';		{c: char}
s:='abc';	{s: string}

Константе автоматически присваивается "минимальный" тип данных, достаточный для ее представления: char или string[k]. Поэтому попытка написать

c:='zzz'; {c: char}

вызовет ошибку уже на этапе компиляции.

Кроме того, не забывайте, что если константа длиннее той переменной- строки, куда ваша программа пытается ее записать, то в момент присваивания произойдет усечение ее до нужной длины.

Пустая строка задается двумя последовательными апострофами:

st:= '';

Если же необходимо сделать так, чтобы среди символов строки содержался и сам апостроф, его нужно удвоить:

s:='Don''t worry about the apostrophe!';

Если теперь вывести на экран эту строку, то получится следующее:

Don't worry about the apostrophe!
Нетипизированные константы

Все правила задания символов и строк как неименованных констант остаются в силе и при задании именованных нетипизированных констант в специальном разделе const. Например:

const c3 = '''';	{это один символ - апостроф!}
	s3 = 'This is a string';
Типизированные константы

Типизированная константа, которая будет иметь тип char или string, задается в разделе const следующим образом:

const c4: char = '''';	{это один символ - апостроф!}
	s4: string[20] = 'This is a string';

Действия с символами

Операции

Результатом унарной операции

#<положительная_неименованная_константа_целого_типа>

является символ, номер которого в таблице ASCII соответствует заданному числу. Например,

#100  = 'd'
#39   = ''''	{апостроф}
#232  = 'ш'	
#1000 = 'ш'	{потому что (1000 mod 256)= 232}

Кроме того, к символьным переменным, как и к значениям всех порядковых типов данных, применимы операции сравнения <, <>, >, =, результат которых также опирается на номера символов из таблицы ASCII.

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Евгения Поздеева
Евгения Поздеева
Ольга Стебакова
Ольга Стебакова

Вот фрагмент лекции 5 (статья 4):

Проверка множества на пустоту может быть осуществлена довольно просто:

pusto:= true;   for i:= 1 to N do 

if set_arr[i] then begin pusto:= false; break end; {мне кажется здесь должно быть так:

if set_arr[i]<>0 then begin pusto:= false; break end;}

Хотелось бы знать это ошибка в теории или я просто не поняла лекцию?