- •Содержание
- •1. PASCAL
- •1.1 Алфавит
- •1.2 Типы данных
- •1.3 Переменные
- •1.4 Константы
- •1.5 Стандартные функции
- •1.6 Выражения
- •1.7 Операторы
- •1.7.1 Оператор присваивания
- •1.7.2 Составной оператор
- •1.7.3 Условный оператор IF
- •1.7.4 Условный оператор CASE
- •1.7.5 Оператор цикла FOR
- •1.7.6 Оператор цикла REPEAT
- •1.7.7 Оператор цикла WHILE
- •1.8 Одномерные массивы
- •1.9 Многомерные массивы
- •1.10 Строки
- •1.11 Записи
- •1.12 Множества
- •1.13 Пользовательские типы
- •1.14 Файлы
- •1.15 Перечисляемый тип
- •1.16 Тип-диапазон
- •1.17 Функции и процедуры
- •1.18 Локализация имен
- •1.19 Модули
- •1.20 Операторы прерывания
- •1.21 Комментарии
- •1.22 Указатели
- •1.23 Динамические массивы Delphi
- •2. Основные положения ООП
- •3. Базовые классы Delphi
- •3.1 TObject
- •3.2 Exception
- •3.3 TList
- •3.4 TPersistent
- •3.5 TCollection
- •3.6 TCollectionItem
- •3.7 TStrings
- •3.8 TStringList
- •3.9 TGraphicsObject
- •3.10 TPen
- •3.11 TBrush
- •3.12 TCanvas
- •3.13 TGraphics
- •3.14 TPicture
- •3.15 TComponent
- •3.16 TControl
- •3.17 TWinControl
- •3.18 TGraphicControl
- •3.19 TTimer
- •3.20 TThread
- •3.21 TTreeView
- •3.22 TTreeNodes
- •3.23 TTreeNode
- •3.24 TForm
- •3.25 TMainMenu
- •3.26 TMenuItem
- •3.27 TStatusBar
- •3.28 TStatusPanels
- •3.29 TStatusPanel
- •3.30 TToolBar
- •3.31 TToolButton
- •3.32 TActionList
- •3.33 TAction
30
type
Mas : array[1..100] of integer; var
X,n : integer; A : Mas;
B : Modul1.Mas; begin
...
InputMas(A,n); {Ошибка} InputMas(B,n); {Нет ошибки}
X := 5; {Иcпользуется переменная основной программы} Modul1.X := 10; {Используется переменная модуля}
...
end.
1.20 Операторы прерывания
В Pascal имеется четыре оператора, позволяющие прервать выполнение текущего блока: continue, break, exit, halt(X). Первый из них позволяет прервать выполнение тела цикла и перейти к следующей итерации, второй – немедленно закончить выполнение цикла, третий – немедленно выйти из текущего блока (если текущим блоком является основная программа, то закончить выполнение программы), четвертый – немедленно выйти из программы, при этом в качестве параметра задается целое значение кода выхода, которое может быть проанализировано внешней программой, запустившей данную.
Пример 1 (найти первое i, при котором
|
|
x |
2i |
( 1) |
i |
|
|
|
|
||
|
(2i)! |
||
|
|
меньше заданного числа e):
procedure TForm1.Button1Click(Sender: TObject); var
i,j : integer; x,Sum,F,S,R,E : real;
begin
x := ???;
E := ???;
i := 1; Sum := 0; repeat
F := 1;
for j := 2 to 2*i do F := F*j;
if odd(i) then S := -1
else
S := 1;
R := S*exp(2*i*ln(x))/F; if R<E then
Break
31
else
Sum := Sum+R; until False;
SumEdit.Text := FloatToStr(Sum); end;
Пример 2 (найти первый отрицательный элемент в массиве):
procedure TForm1.Button1Click(Sender: TObject); var
i,n,Sum : integer;
A : array[1..100] of integer; s : string;
begin
n := ???;
for i := 1 to n do A[i] := ???;
Sum := 0;
{Выведем сразу ответ для случая, когда отрицательных чисел нет} s := 'Отрицательных чисел нет';
for i := 1 to n do begin
if A[i]>=0 then Continue;
s := 'Первое отрицательное число: '+IntToStr(A[i]); Break;
end; <вывод s>;
end;
1.21 Комментарии
Комментарии вводятся в программу для описания ее блоков или отдельных операторов. Использование комментариев позволяет облегчить разбор исходного текста программы для людей, не являющихся ее разработчиками, а также быстрее вспомнить разработчику идеи, используемые в программе, если он долго к ней не обращался. Также комментарии могут использоваться для временного отключения некоторых фрагментов программ при отладке.
Существует три типа комментариев:
пара {} – при обнаружении в программе символа { компилятор считает комментарием все, что будет расположено до символа };
пара (* *) – при обнаружении в программе комбинации символов (* компилятор считает комментарием все, что будет расположено до комбинации символов *);
пара // – при обнаружении в программе пары символов // компилятор считает комментарием все, что будет расположено далее в этой строке.
32
Таким образом, первые два типа комментариев позволяют считать комментариями несколько строк, тогда как третий тип комментирует только часть строки.
Внутри одного комментария может располагаться комментарий другого типа. При этом, на работу исходного комментария он не оказывает никакого влияния.
1.22 Указатели
При работе со статическими переменными может возникнуть ситуация, когда места, отведенного под хранение данных окажется недостаточно для решаемой задачи (Borland Pascal). Одним из способов увеличения объема доступной памяти может быть разделение программы на модули, каждый из которых имеет свой сегмент данных. Однако наиболее кардинальным решением является использование в программе динамически выделяемой памяти и указателей.
В отличии от статической переменной, в переменной-указателе хранятся не сами данные, а адрес (указание) места, где их можно найти (привести графическую интерпретацию). Указатели бывают нетипизированные и типизированные. Для обозначения первых служит зарезервированный тип pointer, для вторых – значок “^” с указанием типа, например:
Чтобы указать, что переменная-указатель не ссылается на ячейку памяти, используется ключевое слово nil;
var
p : pointer;
pI1, pI2 : ^integer; pD : ^double;
I1, I2 : integer; D : double;
begin
I1 := 5;
I2 := 7;
D := 5.4;
pI1 := addr(I1); pI2 := addr(I2); pD := addr(D);
pI1^ := 10; {I1 = 10} pI2^ := 12; {I2 = 12} pD^ := 6.7 {D = 6.7} pI1 := pI2;
pI1^ := 16; {I2 = 16};
p := pI1; {p ссылается на I2}
pD := p; {pD ссылается на I2, что допустимо, но может привести
кошибке}
pD := pI2; {ошибка, так как указатели типизированные}
p := nil; {указатель p теперь никуда не указывает} end.
Таким образом, использование типизированных указателей может предотвратить ошибки, но снижает гибкость программы.
33
Использование указателей наиболее оправданно при работе со сложными структурами с применением динамического выделения памяти. Для выделения памяти и ее освобождения могут быть использованы пары New – Dispose,
GetMem – FreeMem с применением SizeOf. procedure New(var p : pounter)
procedure Dispose(var p : pointer)
procedure GetMem(var p : pointer; Size : integer) procedure FreeMem(var p : pointer; Size : integer) function SizeOf(X) : integer
Приведение типов:
type
PInteger = ^integer; var
i : integer; p : pointer;
begin
i := 7;
p := addr(i);
pinteger(p)^ := 12; {i = 12} integer(p^) := 14; {i = 14}
end.
Пример 1 (работа с памятью при обработке одномерных массивов):
type
PMas = ^Mas;
Mas = array[1..10] of integer; var
p1, p2 : PMas; n : integer;
begin New(p1); n := 5;
GetMem(p2, SizeOf(integer)*n);
…
p2^[3] := 5;
…
Dispose(p1);
FreeMem(p2, SizeOf(integer)*n); end.
Пример 2 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 1):
type
PMas = ^Mas;
Mas : array[1..1] of integer; var
n,m,i,j,Temp : integer; Data : PMas;
begin
n := ???;
34
m := ???;
GetMem(Data,SizeOf(integer)*n*m); for i := 1 to n do
for j := 1 to m do Data^[(i-1)*m+j] := ???;
for j := 1 to m do begin
i := 1; while i<n do
if Data^[(i-1)*m+j]<Data^[i*m+j] then begin
Temp := Data^[(i-1)*m+j]; Data^[(i-1)*m+j] := Data^[i*m+j]; Data^[i*m+j] := Temp;
if i>1 then dec(i)
else inc(i)
end else
inc(i);
end;
for i := 1 to n do for j := 1 to m do
<вывод Data^[(i-1)*m+j]>;
FreeMem(Data,SizeOf(integer)*n*m);
end;
Пример 3 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 2):
type
PMas1 = ^Mas1;
Mas1 = array[1..1] of integer; PMas2 = ^Mas2;
Mas2 := array[1..1] pf PMas1; var
Data : PMas2; n,m,i,j,k,MaxI,Temp : integer;
begin
n := ???;
m := ???;
GetMem(Data,SizeOf(PMas1)*n); for i := 1 to n do
GetMem(Data^[i],SizeOf(integer)*m); for i := 1 to n do
for j := 1 to m do Data^[i]^[j] := ???;
for j := 1 to m do begin
for k := 1 to n-1 do begin
MaxI := k;