- •1.1 Общие положения
- •1.2 Количественные оценки
- •1.3 Устройство ПК
- •1.4 Программное обеспечение
- •1.5 Автоматизированные и информационные системы
- •1.6 Разное
- •1.7 Алгоритм
- •2. PASCAL
- •2.1 Алфавит
- •2.2 Типы данных
- •2.3 Переменные
- •2.4 Константы
- •2.5 Стандартные функции
- •2.6 Выражения
- •2.7 Операторы
- •2.7.1 Оператор присваивания
- •2.7.2 Составной оператор
- •2.7.3 Условный оператор IF
- •2.7.4 Условный оператор CASE
- •2.7.5 Оператор цикла FOR
- •2.7.6 Оператор цикла REPEAT
- •2.7.7 Оператор цикла WHILE
- •2.8 Одномерные массивы
- •2.9 Многомерные массивы
- •2.10 Строки
- •2.11 Записи
- •2.12 Множества
- •2.13 Пользовательские типы
- •2.14 Файлы
- •2.15 Перечисляемый тип
- •2.16 Тип-диапазон
- •2.17 Функции и процедуры
- •2.18 Локализация имен
- •2.19 Модули
- •2.20 Операторы прерывания
- •2.21 Комментарии
- •2.22 Указатели
- •2.23 Динамические массивы Delphi
- •3. ОСНОВНЫЕ ПОЛОЖЕНИЯ ООП
- •4. БАЗОВЫЕ КЛАССЫ DELPHI
- •4.1 TObject
- •4.2 Exception
- •4.3 TList
- •4.4 TPersistent
- •4.5 TCollection
- •4.6 TCollectionItem
- •4.7 TStrings
- •4.8 TStringList
- •4.9 TGraphicsObject
- •4.10 TPen
- •4.11 TBrush
- •4.12 TCanvas
- •4.13 TGraphics
- •4.14 TPicture
- •4.15 TComponent
- •4.16 TControl
- •4.17 TWinControl
- •4.18 TGraphicControl
- •4.19 TTimer
- •4.20 TThread
- •4.21 TTreeView
- •4.22 TTreeNodes
- •4.23 TTreeNode
- •4.24 TForm
- •4.25 TMainMenu
- •4.26 TMenuItem
- •4.27 TStatusBar
- •4.28 TStatusPanels
- •4.29 TStatusPanel
- •4.30 TToolBar
- •4.31 TToolButton
- •4.32 TActionList
- •4.33 TAction
31
Processing := Processing+[DelSomeSpace]; if EmptyLineCB.Checked then
Processing := Processing+[DelEmptyLine]; AssignFile(fIn,InEdit.Text);
Reset(fIn);
AssignFile(fOut,OutEdit.Text);
Rewrite(fOut);
while not Eof(fIn) do begin
readln(fIn,s);
if DelEndSpace in Processing then repeat
EndCycle := True; if Length(s)>0 then
if s[1]=' ' then begin
Delete(s,1,1); EndCycle := False;
end;
if Length(s)>0 then
if s[Length(s)]=' ' then begin
Delete(s,Length(s),1); EndCycle := False;
end;
until EndCycle;
if DelSomeSpace in Processing then begin
i := 1;
while i<Length(s) do
if (s[i]=' ') and (s[i+1]=' ') then Delete(s,i,1)
else inc(i);
end;
if (s<>'') or ((s='') and (not(DelEmptyLine in Processing))) then writeln(fOut,s);
end;
CloseFile(fIn);
CloseFile(fOut);
end;
2.15 Перечисляемый тип
В разделе пользовательских типов тип Month описывает так называемый перечисляемый тип, формат которого
<идентификатор> = (<элемент1> [,<элемент2> …])
32
Перечисляемый тип задает множество значений, которые может принимать переменная. Его применение позволяет избежать ошибок выхода переменной за заданные границы и улучшает читабельность программы.
Каждому элементу перечисляемого типа соответствует числовое значение: первому элементу – 0, второму – 1 и т.д.
Пример (определение числа дней в месяцах года):
procedure TForm1.Button1Click(Sender: TObject); type
Months = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); const
DayOfMonth : array[Months] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
NameMonths : array[Months] of string = ('январь','февраль','март','апрель','май','июнь', 'июль','август','сентябрь','октябрь','ноябрь','декабрь');
var
Year,n : integer; i : Months;
begin
Year := StrToInt(YearEdit.Text); DaysMemo.Clear;
for i := Jan to Dec do begin
n := DayOfMonth[i]; if i=Feb then
if ((Year mod 4=0) and (Year mod 100<>0)) or (Year mod 400=0) then
n := 29;
DaysMemo.Lines.Add(NameMonths[i]+' - '+IntToStr(n)); end;
end;
2.16 Тип-диапазон
Тип диапазон схож с перечисляемым типом, но набор возможных значений задается как диапазон некоторого порядкового типа:
<идентификатор> = <начало> .. <окончание>,
например
type
Less10 = 1..9; Letter = 'a'..'z';
Как и перечисляемый тип, тип диапазон позволяет избегать выхода значения переменной за границы заданного диапазона.
33
Для определения минимального и максимального индексов типадиапазона можно воспользоваться функциями Low(X) и High(X), где X – переменная или сам тип.
Пример (определение количества дней в квартале не високосного года):
procedure TForm1.Button1Click(Sender: TObject); type
Months = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); First = Jan..Mar;
Second = Apr..Jun;
Third = Jul..Sep;
Fourth = Oct..Dec;
NumQuarter = 1..4; const
DayOfMonth : array[Months] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
var
i : Months;
Quarter : NumQuarter; Sum : integer;
begin
Quarter := StrToInt(QuarterEdit.Text); Sum := 0;
case Quarter of |
Low(First) to High(First) do |
|
1 |
: for i := |
|
2 |
Sum := |
Sum+DayOfMonth[i]; |
: for i := |
Low(Second) to High(Second) do |
|
3 |
Sum := |
Sum+DayOfMonth[i]; |
: for i := |
Low(Third) to High(Third) do |
|
4 |
Sum := |
Sum+DayOfMonth[i]; |
: for i := |
Low(Fourth) to High(Fourth) do |
|
|
Sum := |
Sum+DayOfMonth[i]; |
end;
CountDayEdit.Text := IntToStr(Sum); end;
2.17 Функции и процедуры
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и имеющие идентификатор. Чаще всего они используются для описания повторяющегося фрагмента программы. Отличие функции от процедуры заключается в том, что результатом выполнения функции всегда является некоторое значение, которое может быть использовано в дальнейшем в выражении.
В дальнейшем будем называть процедуры и функции подпрограммами, если не требуется уточнение. Формат описания заголовка:
procedure <идентификатор>[(<список формальных параметров>)];
34
function <идентификатор>[(<список формальных параметров>)] : <возвращаемый тип>;
<список формальных параметров> может включать любое количество параметров любых типов. Параметры одного типа можно описывать подряд через запятую. Параметры разного типа при описании отделяются друг от друга точкой с запятой.
Для вызова подпрограммы из основной программы требуется ввести ее идентификатор и указать фактические параметры, причем их количество и тип должны в точности соответствовать <списку формальных параметров>.
При описании <списка формальных параметров> каждый из параметров может быть одного из трех типов:
•параметр-переменная. Перед описанием такого параметра следует указывать ключевое слова var. Такой параметр напрямую передаются в подпрограмму, и его изменение в теле подпрограммы приводит к изменению фактического параметра, т.е. параметр-переменную можно использовать для возврата в основную программу видоизмененного значения. Параметр-переменная не может быть константой или результатом вычисления выражения;
•параметр-значение. При описании такого параметра не требуется ввод уточняющих ключевых слов. При этом, в подпрограмму передается копия фактического параметра, поэтому его изменение в теле подпрограммы не приведет к смене значения в основной программе. В этом случае фактический параметр может быть константой или результатом вычисления выражения;
•параметр-константа. Перед описанием такого параметра следует указывать ключевое слова const. Такой параметр, как и параметр-переменная, напрямую передаются в подпрограммы, но его изменение в теле подпрограммы блокируется на стадии компиляции программы. Фактический параметр, как и для параметра-значения, может быть константой или результатом вычисления выражения.
Так как подпрограммы являются относительно независимыми фрагментами программы, то структура их реализации аналогична структуре программы. После заголовка могут находиться разделы описания типов, констант, переменных, одна подпрограмма может включать в себя другие подпрограммы, каждая из которых также может включать в себя другие подпрограммы и т.д. После описания всех разделов описывается тело подпрограммы путем введения блока
begin … end;.
Подпрограмма может использовать в своей работе и переменные, описанные выше в основной программе, однако этим не стоит злоупотреблять во избежании появления ошибок и снижения гибкости программы целиком.
При описании тела функции следует указать, какое значение функция будет возвращать. Это делается путем присвоения идентификатору функции требуемого значения.
При использовании в качестве параметра подпрограммы массива, следует применять предварительное описание пользовательского типа, например:
35
type
Mas = array[1..100] of integer; procedure First(var A : Mas);
Запись procedure First(var A : array[1..100] of integer); не-
допустима.
Однако допустима запись procedure First(var A : array of integer);, в которой происходит использование так называемых открытых массивов, позволяющее передавать подпрограмме массивы переменной длины. Такой массив трактуется подпрограммой как одномерный массив с начальным индексом 0. Конечный индекс может быть определен с помощью функции High() (например, High(A)).
В большинстве случаев при передаче в подпрограмму в качестве параметра массива, требуется и передача фактического числа элементов массива, так как максимальное и текущее количество элементов массива часто различны.
Если в теле подпрограммы требуется использование дополнительных переменных, то в большинстве случаев целесообразно описание данных переменных именно внутри подпрограммы.
Пример (определение суммы элементов и среднего из положительных элементов для каждого из двух одномерных массивов):
procedure TForm1.Button1Click(Sender: TObject); type
Mas = array[1..100] of integer; var
Mas1,Mas2 : Mas; Count1,Count2,Sum,i : integer; Average : real;
function Summa(A : Mas; Count : integer) : integer; var
i,Sum : integer; begin
Sum := 0;
for i := 1 to Count do Sum := Sum+A[i];
Result := Sum; end;
function AveragePositive(A : Mas; Count : integer;
var Average : real) : boolean;
var
i,CountPositive : integer;
Temp : real; // Объяснить, зачем нужна begin
CountPositive := 0; Temp := 0;
for i := 1 to Count do if A[i]>=0 then