алгоритмы. алгор. Компьютерная программа представляет собой список команд, которые указывают компьютеру
![]()
|
string Тип string в PascalABC.NET является классом и содержит ряд свойств, статических и экземплярных методов. Свойства класса String Свойство Описание s[i] Индексное свойство. Возвращает или позволяет изменить i-тый символ строки s. Строки в PascalABC.NET индексируются от 1. Length: integer Возвращает длину строки Статические методыкласса String Метод Описание String.Compare(s1,s2: string): integer Сравнивает строки s1 и s2. Возвращает число <0 если s1 String.Compare(s1,s2: string; ignorecase: boolean): integer То же. Если ignorecase=True, то строки сравниваются без учета регистра букв String.Format(fmtstr: string, params arr: array of object): string; Форматирует параметры arr согласно форматной строке fmtstr String.Join(ss: array of string; delim: string): string Возвращает строку, полученную слиянием строк ss с использованием delim в качестве разделителя Экземплярные методыкласса String Отметим, что все экземплярные методы не меняют строку, как это может показаться на первый взгляд, а при необходимости возвращают измененную строку. Кроме того, считается, что символы в сроке индексируются с нуля. Метод Описание Contains(s: string): boolean Возвращает True, если текущая строка содержит s, и False в противном случае EndsWith(s: string): boolean Возвращает True, если текущая строка заканчивается на s, и False в противном случае String.Format(fmtstr: string, params arr: array of object): string; Форматирует параметры arr согласно форматной строке fmtstr String.Join(ss: array of string; delim: string): string Возвращает строку, полученную слиянием строк ss с использованием delim в качестве разделителя Экземплярные методыкласса String Отметим, что все экземплярные методы не меняют строку, как это может показаться на первый взгляд, а при необходимости возвращают измененную строку. Кроме того, считается, что символы в сроке индексируются с нуля. Метод Описание Contains(s: string): boolean Возвращает True, если текущая строка содержит s, и False в противном случае EndsWith(s: string): boolean Возвращает True, если текущая строка заканчивается на s, и False в противном случае IndexOf(s: string): integer Возвращает индекс первого вхождения подстроки s в текущую строку IndexOfAny(cc: array of char): integer Возвращает индекс первого вхождения любого символа из массива сс Insert(from: integer; s: string): string Возвращает строку, полученную из исходной строки вставкой подстроки s в позицию from LastIndexOf(s: string): integer Возвращает индекс последнего вхождения подстроки s в текущую строку LastIndexOfAny(a: array of char): integer Возвращает индекс последнего вхождения любого символа из массива сс PadLeft(n: integer): string Возвращает строку, полученную из исходной строки выравниванием по правому краю с заполнением пробелами слева до длины n PadRight(n: integer): string Возвращает строку, полученную из исходной строки выравниванием по левому краю с заполнением пробелами справа до длины n Remove(from,len: integer): string Возвращает строку, полученную Remove(from,len: integer): string Возвращает строку, полученную из исходной строки удалением len симолов с позиции from Replace(s1,s2: string): string Возвращает строку, полученную из исходной строки заменой всех вхождений подстроки s1 на строку s2 Split(delim: char := ' '): array of string Возвращает массив строк, полученный расщеплением исходной строки на слова, при этом в качестве разделителей используется символ delim StartsWith(s: string): boolean Возвращает True, если текущая строка начинается на s, и False в противном случае Substring(from,len: integer): string Возвращает подстроку исходной строки с позиции from длины len ToCharArray: array of char Возвращает динамический массив символов исходной строки ToLower: string Возвращает строку, приведенную к нижнему регистру ToUpper: string Возвращает строку, приведенную к верхнему регистру Trim: string Возвращает строку, полученную из исходной удалением лидирующих и завершающих пробелов TrimEnd(params cc: array of char): string Возвращает строку, полученную из исходной удалением завершающих символов из массива cc TrimStart(params cc: array of char): string Возвращает строку, полученную из исходной удалением лидирующих символов из массива cc Массивы Массив представляет собой набор элементов одного типа, каждый из которых имеет свой номер, называемый индексом (индексов может быть несколько, тогда массив называется многомерным). Массивы в PascalABC.NET делятся на статические и динамические При выходе за границы изменения индекса в PascalABC.NET всегда генерируется исключение. Статические массивы Тип статического массива конструируется следующим образом : array array array array [тип индекса1, ..., тип индексаN] of of of of базовый тип Тип индекса должен быть порядковым Обычно тип индекса является диапазонным и представляется в виде a..b , где a и b - константные выражения целого , символьного или перечислимого типа Например : type type type type MyEnum = (w1,w2,w3,w4,w5); Arr = array array array array [1..10] of of of of integer; var var var var a1,a2: Arr; b: array array array array ['a'..'z',w2..w4] of of of of string string string string; c: array array array array [1..3] of array of array of array of array [1..4] of of of of real; При описании можно также задавать инициализацию массива значениями : var var var var a: Arr := (1,2,3,4,5,6,7,8,9,0); cc: array array array array [1..3,1..4] of of of of real := ((1,2,3,4), (5,6,7,8), (9,0,1,2)); Статические массивы одного типа можно присваивать друг другу , при этом будет производиться копирование содержимого одного массива в другой : a1:=a2; При передаче статического массива в подпрограмму по значению также производится копирование содержимого массива - фактического параметра в массив - формальный параметр : procedure procedure procedure procedure p(a: Arr); p(a1); Как правило , в этой ситуации копирование не требуется , поэтому статический массив рекомендуется передавать по ссылке : procedure procedure procedure procedure p1(var var var var a: Arr); r(a1); Динамические массивы Тип динамического массива конструируется следующим образом : array array array array of of of of тип элементов ( одномерный массив ) array array array array [] of of of of тип элементов ( одномерный массив ) array array array array [,] of of of of тип элементов ( двумерный массив ) и т д Переменная типа динамический массив представляет собой ссылку Поэтому динамический массив нуждается в инициализации ( выделении памяти под элементы ). Для выделения памяти под динамический массив используется два способа Первый способ использует операцию new в стиле вызова конструктора класса : var var var var a: array of array of array of array of integer; b: array array array array [,] of of of of real; begin begin begin begin a := new integer[5]; b := new real[4,3]; end end end 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 обладает тем преимуществом , что при ее повторном вызове старое содержимое массива сохраняется Если объявлен массив массивов var var var var с: array of array of array of array of array of array of array of array of integer; то его инициализацию можно провести только с помощью SetLength : SetLength(с,5); for for for for i := 0 to to to to 4 do do do do SetLength(c[i],3); Для инициализации такого массива с помощью new следует ввести имя типа для array of integer: type IntArray = array of integer; var с: array of IntArray; c := new IntArray[5]; for i := 0 to 4 do c[i] := new integer[3]; При описании инициализацию динамического массива можно проводить в сокращенной форме: var a: array of integer := (1,2,3); b: array [,] of real := ((1,2,3),(4,5,6),(7,8,9),(0,1,2)); c: array of array of integer := ((1,2,3),(4,5),(6,7,8)); При этом происходит выделение памяти под указанное справа количество элементов. При таком способе в инициализаторе одномерного массива должно содержаться не менее 2 элементов. Динамические массивы одного типа можно присваивать друг другу, при этом обе переменные-ссылки будут указывать на одну память: var a1: array of integer; var a2: array of integer; a1 := a2; Следует обратить внимание, что для динамических массивов принята структурная эквивалентность типов : можно присваивать друг другу и передавать в качестве параметров подпрограмм динамические массивы, совпадающие по структуре. Чтобы одному динамическому массиву присвоить копию другого массива, следует воспользоваться стандартной функцией Copy: a1 := Copy(a2); Длина массива (количество элементов в нем) возвращается стандартной функцией Length или свойством Length: l := Length(a); l := a.Length; Для многомерных массивов длина по каждой размерности возвращается стандартной функцией Length с двумя параметрами или методом GetLength(i): l := Length(a,0); l := a.GetLength(0); Указатели Указатель - это ячейка памяти , хранящая адрес В PascalABC.NET указатели делятся на типизированные ( содержат адрес ячейки памяти данного типа ) и бестиповые ( содержат адрес оперативной памяти , не связанный с данными какого - либо определенного типа ). Тип указателя на тип T имеет форму ^T , например : type type type type pinteger = ^integer; var var var var p: ^record record record record r,i: real end end end end; Бестиповой указатель описывается с помощью слова pointer Для доступа к ячейке памяти , адрес которой хранит типизированный указатель , используется операция разыменования ^ : var var var var i: integer; pi: ^integer; pi := @i; // указателю присвоили адрес переменной i pi^ := 5; // переменной i присвоили 5 Операция разыменования не может быть применена к бестиповому указателю Типизированный указатель может быть неявно преобразован к бестиповому : var var var var p: pointer; pr: ^real; p := pr; Обратное преобразование также может быть выполнено неявно : pr := p; pr^ := 3.14; Указатели можно сравнивать на равенство ( = ) и неравенство ( <> ). Для того чтобы отметить тот факт , что указатель никуда не указывает , используется стандартная константа nil nil nil nil ( нулевой указатель ) : p := nil nil nil nil Внимание ! Ввиду особенностей платформы .NET тип T типизированного указателя не должен быть ссылочным или содержать ссылочные типы на каком - то уровне ( например , запрещены указатели на записи , у которых одно из полей имеет ссылочный тип ). Причина такого ограничения проста : указатели реализуются неуправляемым кодом , который не управляется сборщиком мусора Если в памяти , на которую указывает указатель , содержатся ссылки на управляемые переменные , то они становятся недействительными после очередной сборки мусора Исключение составляют динамические массивы и строки , обрабатываемые особым образом То есть , можно делать указатели на записи , содержащие в качестве полей строки и динамические массивы Записи Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи конструируется следующим образом: record список полей список методов end Приведем пример записи, содержащей только поля: type SexType = (male, female); Person = record Name: string; Age, Weight: integer; Sex: SexType; end; При описании переменной или константы типа запись можно использовать инициализатор записи (как и в Object Pascal): const p: Person = (Name: 'Петрова'; Age: 18; Weight: 55; Sex: female); var p: Person := (Name: 'Иванов'; Age: 20; Weight: 80; Sex: male); Присваивание записей копирует содержимое полей одной переменной-записи в другую: d2 := d1; Для записей принята именная эквивалентность типов : можно присваивать друг другу и передавать в качестве параметров подпрограмм записи, совпадающие только по имени. В отличие от Object Pascal, в PascalABC.NET отсутствуют записи с вариантами. Помимо полей, внутри записей могут содержаться также методы и свойства . Таким образом, записи очень близки к классам. Список отличий между записями и классами приводятся ниже: 1.Запись представляет собой размерный тип (переменные типа запись располагаются на стеке). 2. Все члены записей – публичные , модификаторы доступа внутри записей запрещены 3. Записи нельзя наследовать ; от записей также нельзя наследовать ( отметим , что записи , тем не менее , могут реализовывать интерфейсы ). В .NET тип записи неявно предполагается наследником типа System.ValueType и реализуется struct- типом Конструкторы для записей имеют тот же синтаксис , что и для классов Однако , в отличие от классов , вызов конструктора записи не создает новый объект в динамической памяти , а только инициализирует поля записи По умолчанию процедура write для переменной типа запись выводит ее тип Чтобы изменить это поведение , в записи следует переопределить метод ToString класса Object Например : type type type type SexType = (male, female); Person = record record record record Name: string; Age, Weight: integer; Sex: SexType; constructor constructor constructor constructor Create(Name: string; Age, Weight: integer; Sex: SexType); begin begin begin begin Self.Name := Name; Self.Age := Age; Self.Weight := Weight; Self.Sex := Sex; end end end end; function function function function ToString: string; override override override override; begin begin begin begin Result := string.Format('Имя: {0} Возраст: {1} Вес: {2} Пол: {3}', Name, Age, Weight, Sex); end end end end end end end end; var var var var p: Person := new Person('Иванов',20,70,Sex); writeln(p); Множества Множество представляет собой набор элементов одного типа Элементы множества считаются неупорядоченными ; каждый элемент может входить во множество не более одного раза Тип множества описывается следующим образом : set of set of set of set of базовый тип В качестве базового может быть любой тип , в том числе строковый и классовый Например : type type type type ByteSet = set set set set of of of of byte; StringSet = set set set set of of of of string; Digits = set set set set of of of of '0'..'9'; SeasonSet = set set set set of of of of (Winter,Spring,Summer,Autumn); PersonSet = set of set of set of set of Person; Элементы базового типа сравниваются на равенство следующим образом : у простых типов , строк и указателей сравниваются значения , у структурированных и у классов - значения всех элементов или полей Однако , если поля относятся к ссылочному типу , то сравниваются только их адреса ( неглубокое сравнение ). Переменная типа множество может содержать несколько значений базового типа Чтобы сконструировать значение типа множество , используется конструкция вида [список значений] где в списке могут перечисляться через запятую либо выражения базового типа , либо ( для порядковых типов ) их диапазоны в виде a..b , где a и b - выражения базового типа Например : var var var var bs: ByteSet := [1,3,5,20..25]; fios: StringSet := ['Иванов','Петров','Сидорова']; Значения в списке могут отсутствовать , тогда множество является пустым : bs:=[]; Пустое множество совместимо по присваиванию с множеством любого типа Для множеств имеет место структурная эквивалентность типов Множества целых и множества на базе типа и его диапазонного подтипа или на базе двух диапазонных типов одного базового типа неявно преобразуются друг к другу Если при присваивании s := s1 во множестве s1 содержатся элементы , которые не входят в диапазон значений базового типа для множества s, то они отсекаются Например : var var var var st: set set set set of of of of 3..9; st := [1..5,8,10,12]; // в st попадут значения [3..5,8] Операция in in in in проверяет принадлежность элемента множеству : if if if if Wed in in in in bestdays then then then then ... Для множеств определены операции + ( объединение ), - ( разность ), * ( пересечение ), = ( равенство ), <> ( неравенство ), <= ( нестрогое вложение ), < ( строгое вложение ), >= ( нестрого содержит ) и > ( строго содержит ). Процедура write при выводе множества выводит все его элементы : write([' Иванов','Петров','Сидорова']); выведет ['Иванов','Петров','Сидорова'] , при этом данные , если это возможно , будут отсортированы по возрастанию Для перебора всех элементов множества можно использовать цикл foreach foreach foreach foreach , данные перебираются в некотором внутреннем порядке : foreach foreach foreach foreach s: string in in in in fios do do do do write(s,' '); Для добавления элемента x к множеству s используется конструкция s += [x] или стандартная процедура Include : Include(s,x) Для удаления элемента x из множества s используется конструкция s -= [x] или стандартная процедура Exclude : Exclude(s,x) Процедурный тип Переменные , предназначенные для хранения процедур и функций , называются процедурными Тип процедурной переменной представляет собой заголовок процедуры или функции без имени Например : type type type type procI = procedure procedure procedure procedure(i: integer); funI = function function function function: integer; Процедурной переменной можно присвоить процедуру или функцию с совместимым типом : procedure procedure procedure procedure my(i: integer); begin begin begin begin end end end end; function function function function f: integer; begin begin begin begin end end end end; var var var var p1: procI; f1: funI; p1 := my; f1 := f; После этого можно вызвать процедуру или функцию через эту процедурную переменную , пользуясь обычным синтаксисом вызова : p1(5); write(f1); Для процедурных переменных принята структурная эквивалентность типов : можно присваивать друг другу и передавать в качестве параметров процедурные переменные , совпадающие по структуре ( типы и количество параметров , тип возвращаемого значения ). Обычно процедурные переменные передаются как параметры для реализации обратного вызова : procedure procedure procedure procedure forall(var var var var a: array array array array of of of of real; p: procedure procedure procedure procedure(var var var var r: real)); begin begin begin begin for for for for var var var var i := 0 to to to to a.Length-1 do do do do p(a[i]); end end end end; procedure procedure procedure procedure mult2(var var var var r: real); begin begin begin begin r := 2*r; end end end end; procedure procedure procedure procedure add3(var var var var r: real); begin begin begin begin r := r + 3; end end end end; procedure procedure procedure procedure print(var var var var r: real); begin begin begin begin write(r,' '); end end end end; forall(a,mult2); // умножение элементов массива на 2 forall(a,add3); // увеличение элементов массива на 3 forall(a,print); // вывод элементов массива Процедурная переменная может хранить нулевое значение , которое задается константой nil Вызов подпрограммы через нулевую процедурную переменную приводит к ошибке Процедурные переменные реализуются через делегаты .NET. Это означает , что они могут хранить несколько подпрограмм Для добавления / отсоединения подпрограмм используются операторы += и -= : p1 += mult2; p1 += add3; forall(a,p1); Подпрограммы в этом случае вызываются в порядке прикрепления : вначале умножение , потом сложение Отсоединение неприкрепленных подпрограмм не выполняет никаких действий : p1 -= print; Кроме того , к процедурной переменной можно прикреплять / откреплять статические и экземплярные методы классов |