Действия над элементами массива
Элементы массива называются индексированными переменными. Для обращения к конкретному элементу массива необходимо указывать имя массива и индексы элемента в квадратных скобках. Элементы массива могут использоваться в выражениях аналогично простым переменным и вместе с простыми переменными
Примеры: Инициализация двумерного массива, ввод и вывод элементов массива присвоение одного массива другому, арифметические действия с элементами и др.
Действия над массивами
Полные переменные типа массив не могут использоваться в качестве операндов выражений. Значения полных переменных могут быть использованы только в операторах присваивания, причем полной переменной может быть присвоено только значение полной переменной того же типа.
Например,
В := А;
Здесь А и В – массивы одного и того же типа.
К этому моменту массив А уже должен быть определен – всем его элементам должны быть присвоены значения.
Это же касается и подмассивов. Например, если А и В – двумерные массивы одного типа, то запись
B[I] := A[I];
означает, что I-ой строке массива В будет присвоено значение I-ой строки массива А.
Многомерная и одномерная константа – массив
Типизованные константы-массив объявляются в разделе констант. Объявление одномерной константы-массив.
Type
Mas = Array [1..10] Of Integer;
Const
{Для присваивания типа типизованной константе-массив используется имя типа}
M: Mas = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
{Для присваивания типа типизованной константе-массив используется задание типа}
Simv: Array [1..5] Of Char = (‘A’, ‘B’, ‘C’, ‘D’, ‘E’);
Многомерный массив фактически состоит из массивов меньшей мерности. Отсюда следует, что при задании многомерной константы-массив в качестве (см. рисунок 10.4) следует использовать константу-массив на единицу меньшей размерности, чем текущая константа- массив. Массив каждой размерности заключается в круглые скобки.
Объявление многомерных констант-массивов.
Type
Mas3 = Array [1..2, 1..2, 1..2] Of Integer;
Const
M3: Mas3 = (((0,1), (2,3)), ((4,5), (6,7)));
Вопрос 43. Динамические массивы
Динамические массивы
Тип динамического массива конструируется следующим образом:
array of тип элементов (одномерный массив)
array [,] of тип элементов (двумерный массив)
и т.д.
Переменная типа динамический массив представляет собой ссылку. Поэтому динамический массив нуждается в инициализации (выделении памяти под элементы). Для выделения памяти под динамический массив используется два способа.
Первый способ использует операцию new в стиле вызова конструктора класса:
var a: array of integer;
b: array [,] of real;
begin a := new integer[5];
b := new real[4,3];
end.
В этом случае можно также задавать инициализацию массива значениями:
a := new integer[3](1,2,3);
b := new real[4,3] ((1,2,3),(4,5,6),(7,8,9),(0,1,2));
Второй способ использует стандартную процедуру SetLength:
SetLength(a,10);
SetLength(b,5,3);
Процедура SetLength обладает тем преимуществом, что при ее повторном вызове старое содержимое массива сохраняется.
Динамические массивы представляются в памяти ссылками. Это означает, что любая переменная типа "динамический массив" является указателем на непрерывный участок динамической памяти. Первоначально этот указатель хранит nil, а вызов SetLength(a) выделяет под данные массива блок динамической памяти и записывает в a адрес этого блока памяти. Их основное отличие от обычных массивов заключается в том, что они хранятся в динамической памяти. Этим и обусловлено их название. Полные переменные типа массив не могут использоваться в качестве операндов выражений.
Значения полных переменных могут быть использованы только в операторах присваивания, причем полной переменной может быть присвоено только значение полной переменной того же типа.
Например,
В := А;
Здесь А и В – массивы одного и того же типа.
К этому моменту массив А уже должен быть определен – всем его элементам должны быть присвоены значения.
Это же касается и подмассивов. Например, если А и В – двумерные массивы одного типа, то запись
B[I] := A[I];
означает, что I-ой строке массива В будет присвоено значение I-ой строки массива А.
Вопрос 44. Строковые константы
Строковая константа – это последовательность любых символов, допускаемых для представления в компьютере, заключенная в апострофы.
Например, ‘TEKST’.
Правила записи строковых констант в программе:
1) Если в строке необходимо поместить апостроф, то его повторяют дважды. При подсчете длины строки два рядом стоящих апострофа считаются одним символом.
2) При подсчете длины строки учитываются пробелы.
Например,
‘ПРОГРАММА ‘‘ИНТЕГРАЛ’’’
Так должна быть написана строка ПРОГРАММА ‘ИНТЕГРАЛ’.
‘ЗНАК ‘‘+’’’
Так должна быть написана строка ЗНАК ‘+’.
3) Допускаются пустые символьные константы, т.е. константы, не содержащие ни одного символа.
‘’ – это пустая строка нулевой длины.
4) Паскаль разрешает вставлять в строку символов управляющие символы. Символ # с целой константой без знака (от 0 до 255) обозначает соответствующий этому значению символ в коде ASCII. Между # и целой константой не должно быть никаких разделителей. Если несколько управляющих символов входят в строковую константу, то между ними не должно быть разделителей.
Например,
‘TURBO’#13#10’TEKST’
Здесь #13#10 – это управляющие символы, осуществляющие переход к началу следующей строки.
#7#7’MAKE’#7#7
Здесь #7 – это управляющий символ «Звонок».
#13#10
Эта строковая константа состоит только из управляющих символов.
Управляющие символы пишутся вне апострофа.
Строковые переменные
В языке Паскаль существует два способа задания строковых переменных.
1-ый способ задания строковых переменных.
Задает строковые переменные постоянной длины. Строковая переменная определяется как одномерный массив символов:
Array [1 .. N] Of Char
<Тип_индекса> может быть задан только с помощью типа диапазон, где N – длина строки (N ≥ 1), определяемая как целое число без знака.
При таком способе объявления строка обладает всеми свойствами массивов.
Например, строковой переменной можно присвоить значение другой строковой переменной той же длины; возможно обращение к отдельным символам строковой переменной, используя индексные переменные.
Пример 10.13.
Работа со строковыми переменными постоянной длины. Использование
свойств строки, аналогичных свойствам массивов.
---------------------------------------------------------
Type
{Одномерный массив символов (строка)}
Stroka = Array [1 .. 9] Of Char;
{Двумерный массив символов (одномерный массив строк)}
Stranitca = Array [1 .. 30] Of Stroka;
Var
Stroka1, Stroka2: Stroka;
Stranitca1, Stranitca2: Stranitca;
I, K, J: 1.. 30;
X, Y: Boolean;
Const
Literal = ‘Программа’;
Begin
------------------------------------
{K этому моменту Stroka2 должна быть определена:}
Stroka1 := Stroka2;
{Одной строке может быть присвоено значение другой строки той же
длины. Здесь К-ой строке страницы присваивается значение строки:}
Stranitca1[K] := Stroka2;
{Обращение к отдельным символам строковой переменной:}
Stroka1[I] := ‘A’;
Stroka1[J] := Stroka2[I];
{J-ому символу I-ой строки страницы присваивается значение К-ого символа строки:}
Stranitca1[I, J] := Stroka1[K];
------------------------------------
Особенности строковых переменных по сравнению с массивами:
1) Строковым переменным могут быть присвоены значения строковых
констант (литералов), если длина строки равна длине литерала.
Пример 10.14.
Применительно к примеру 10.13 можно написать следующие операторы
присваивания:
Stroka1 := Literal;
Stranitca[I] := Literal;
Stroka1 := ‘ПРОГРАММА’;
2) Над значениями строковых переменных одинаковой длины можно
выполнять операции сравнения (=, <>, >, <, >=, <=). Сравнение производится
посимвольно, начиная с левой стороны до первого несовпадающего символа.
Считается большей та строка, в которой первый несовпадающий символ имеет
больший номер в коде обмена информацией (ASCII).
Пример 10.15.
Применительно к примеру 10.13 можно написать следующие операторы
присваивания:
X := Stroka1 = Stroka2;
Если Stroka1 и Stroka2 равны, то X примет значение True, в противном
случае – False.
Y := Stranitca[I] >= Stroka2;
I-ая строка страницы сравнивается со строкой (у них длины должны быть
одинаковые).
Строковые переменные различной длины сравнивать нельзя.
Основные способы представления строковых данных
Паскаль-строки
‘h’ | ‘e’ | ‘l’ | ‘l’ | ‘o’ | ‘!’ | ? | … | ? | |
_______ Реальная длина | _______________________________________________ Символы строки | _____________________ Не использовано |
Си-строки
‘h’ | ‘e’ | ‘l’ | ‘l’ | ‘o’ | ‘!’ | ? | … | ? | |
_______________________________________________ Символы строки | _______ Признак конца строки | _____________________ Не использовано |
В «Делфи» используется особый вид строк
refCnt | ‘h’ | ‘e’ | ‘l’ | ‘l’ | ‘o’ | ‘!’ | ||
_______ Счетчик ссылок | _______ Реальная длина | _______________________________________________ Символы строки | _______ Признак конца строки |
Подсчет ссылок используется для решения задачи автоматического управления памятью.
Значение счетчика ссылок - это кол-во переменных, ссылающихся на объект (строку, массив).
Когда счетчик ссылок становится равным 0, память, занятая объектом, освобождается.
Тип STRING может соответствовать различным видам строк:
STRING[N] – pascal-строки,
STRING – pascal- или Delphi-строки (в зависимости от настроек компилятора).
У строковых констант счетчик ссылок равен -1 и никогда не изменяется.
Вопрос 45. Строки переменной длины. Формат задания. Представление в памяти. Операции, определенные над строковыми данными переменной длины.
Строковые переменные
Короткая строка объявляется с помощью идентификатора типа ShortString или зарезервированного слова string, за которым следует заключенное в квадратные скобки значение максимально допустимой длины, например:
var
Address: ShortString;
Person: string[30];
Короткая строка может иметь длину от 1 до 255 символов. Предопределенный тип данных ShortString эквивалентен объявлению string[255].
Реальная длина строки может быть меньше или равна той, что указана при ее объявлении. Например, максимальная длина строки Friend в примере выше составляет 30 символов, а ее реальная длина — 9 символов. Реальную длину строки можно узнать с помощью встроенной функции Length. Например, значение Length(Friend) будет равно 9 (количество букв в слове Alexander).
Все символы в строке типа ShortString пронумерованы от 0 до N, где N — максимальная длина, указанная при объявлении. Символ с номером 0 — это служебный байт, в нем содержится реальная длина короткой строки. Значащие символы нумеруются от 1. Очевидно, что в памяти строка занимает на 1 байт больше, чем ее максимальная длина. Поэтому значение SizeOf(Friend) будет равно 31.
type
TName = string[30];
var
Name: TName;
const
FriendName: TName = 'Alexander';
Обратиться к отдельному символу можно так же, как и к символу обычной строки. Например, выражения FriendName[1] и FriendName[9] возвращают соответственно символы 'A' и 'r'. Значения FriendName[10] .. FriendName[30] будут случайными, так как при объявлении типизированной константы FriendName символы с номерами от 10 до 30 не были инициализированы. Символы, получаемые в результате индексирования короткой строки, принадлежат типу Char.
Поскольку существует два типа строк: обычные (длинные) строки и короткие строки, возникает закономерный вопрос, можно ли их совмещать. Да, можно! Короткие и длинные строки могут одновременно использоваться в одном выражении, поскольку компилятор языка Delphi автоматически генерирует код, преобразующий их тип. Более того, можно выполнять явные преобразования строк с помощью конструкций вида ShortString(S) и AnsiString(S).
2.10.5. Операции над строками
Выражения, в которых операндами служат строковые данные, называются строковыми. Они состоят из строковых констант, переменных, имен функций и строковых операций. Над строковыми данными допустимы операции сцепления и отношения.
Операция сцепления (+) применяется для сцепления нескольких строк в одну строку.
Выражение | Результат |
'Object' + ' Pascal' | 'Object Pascal' |
Операции отношения (=, <>, >, <, >=, <=) проводят сравнение двух строковых операндов. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в кодовой таблице. Строки считаются равными, если они полностью совпадают по длине и содержат одни и те же символы. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная.
Выражение | Результат |
'USA' < 'USIS' | True { A < I } |
'abcde' > 'ABCDE' | True |
'Office' = 'Office' | True |
'USIS' > 'US' | True |
Если короткой строке присваивается значение, длина которого превышает максимально допустимую величину, то все лишние символы справа отбрасываются.