- •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
23
n1 := i;
n2 := j; end;
end;
Res1Edit.Text := IntToStr(n1); Res2Edit.Text := IntToStr(n2);
end;
Пример 3 (формирование одномерного массива из положительных чи-
сел):
procedure TForm1.Button1Click(Sender: TObject); var
A : array[1..10,1..10] of integer; B : array[1..100] of integer; Count,n,m,i,j : integer;
begin
n := AStringGrid.RowCount;
m := AStringGrid.ColCount; for i := 1 to n do
for j := 1 to m do
A[i,j] := StrToInt(AStringGrid.Cells[j-1,i-1]); Count := 0;
for i := 1 to n do for j := 1 to m do
if A[i,j]>0 then begin
inc(Count); B[Count] := A[i,j];
end;
ResMemo.Clear;
for i := 1 to Count do ResMemo.Lines.Add(IntToStr(B[i]));
end;
2.10 Строки
Строковый тип String можно рассматривать как одномерный массив символов. Поэтому обращение к конкретному символу строки можно осуществлять по его индексу, например, S[12] – обращение к 12-му символу строки S.
Максимальную длину строки можно задать при объявлении переменной,
например, S : string[80].
Для строк допустимо выполнение операции сложения, например,
S := 'Первая '+'строка'.
Так как каждому символу соответствует определенный числовой код, то строки можно сравнивать между собой, например, 'AB'>'A' значение True, т.к. более короткая строка имеет меньший код.
24
Для работы со строками могут применяться стандартные функции и процедуры:
Функция |
Описание |
Length(S) |
Определяет длину строки в символах |
Pos(SubS,S) |
Поиск подстроки SubS в строке S |
Copy(S,i,n) |
Копирование n символов из строки S начиная с позиции i |
Concat(S1[,S2…]) |
Объединение строк |
Delete(S,i,n) |
Удаление n символов из строки S начиная с позиции i |
Insert(SubS,S,i) |
Вставка подстроки SubS в строку S начиная с позиции i |
Str(X[:m:n],S) |
Перевод числа X в строку S |
Val(S,X,c) |
Перевод строки S в число X. с – код результата перевода |
Пример (разложение строки на отдельные слова):
procedure TForm1.Button1Click(Sender: TObject); var
S : string;
Mas : array[1..100] of string; i,n : integer;
begin
S := SEdit.Text; n := 0;
repeat
i := Pos(' ',S); if i>0 then begin
inc(n);
Mas[n] := Copy(S,1,i-1); Delete(S,1,i);
end; until i=0;
if Length(S)>0 then begin
inc(n); Mas[n] := S;
end;
WordsMemo.Clear; for i := 1 to n do
WordsMemo.Lines.Add(Mas[i]);
end;
2.11 Записи
В отличии от массива, тип-запись включает ряд компонент, называемых полями, которые могут быть различных типов. Формат описания:
<идентификатор записи> : record <идентификатор поля1> : <тип поля1>;
…
25
<идентификатор поляN> : <тип поляN>; end;
Количество и тип полей записи может быть произвольным. Для обращения к полю записи используется формат:
<идентификатор записи>.<идентификатор поля>
Если требуется обращение к нескольким полям записи подряд, то можно для упрощения использовать оператор WITH:
WITH <идентификатор записи> do <оператор>
WITH <идентификатор записи> do begin
<оператор1>
…
<операторN> end;
Пример (нахождение среднего роста людей старше 50 лет):
procedure TForm1.Button1Click(Sender: TObject); var
People : array[1..100] of record
Name : string; Age : integer; Height : integer;
end; i,CountPeople,SumHeight,CountSelect : integer;
begin
CountPeople := PeoplesSG.RowCount; for i := 1 to CountPeople do begin
People[i].Name := PeoplesSG.Cells[0,i-1]; People[i].Age := StrToInt(PeoplesSG.Cells[1,i-1]); People[i].Height := StrToInt(PeoplesSG.Cells[2,i-1]);
end;
CountSelect := 0;
SumHeight := 0;
for i := 1 to CountPeople do if People[i].Age>50 then begin
inc(CountSelect);
SumHeight := SumHeight+ People[i].Height; end;
if CountSelect>0 then
ResEdit.Text := FloatToStr(SumHeight/CountSelect) else
ResEdit.Text := 'таких людей нет';
end;
26
При работе с записью можно применять вариантную часть, которая может быть одна на всю запись и располагается после описания всех полей:
<идентификатор записи> : record
…
case [<идентификатор поля>:]<тип поля> of
<вариант выбора1> : (<идентификатор поля> : <тип поля>);
…
<вариант выбораN> : (<идентификатор поля> : <тип поля>); end;
Для всех вариантов отводится общая область памяти, поэтому имеется возможность преобразовывать данные одного типа в другой, однако при неправильном обращении к полю имеется возможность ошибки.
Пример (нахождение площади фигур):
procedure TForm1.Button1Click(Sender: TObject); var
Figures : array[1..100] of record X,Y : real;
Vid : integer; case integer of
0: (Side : real); {квадрат}
1: (Side1,Side2 : real){прямоугольник};
2: (Radius : real); {круг}
end;
Count,i : integer; begin
Count := FiguresSG.RowCount; for i := 1 to Count do
with Figures[i] do begin
Vid := StrToInt(FiguresSG.Cells[0,i-1]);
X := StrToInt(FiguresSG.Cells[1,i-1]);
Y := StrToInt(FiguresSG.Cells[2,i-1]); case Vid of
0 : Side := StrToInt(FiguresSG.Cells[3,i-1]);
1 : begin
Side1 := StrToInt(FiguresSG.Cells[3,i-1]);
Side2 := StrToInt(FiguresSG.Cells[4,i-1]); end;
2 : Radius := StrToInt(FiguresSG.Cells[3,i-1]) end;
end;
ResMemo.Clear;
for i := 1 to Count do with Figures[i] do
case Vid of
0 : ResMemo.Lines.Add(IntToStr(i)+' - квадрат, S='+ FloatToStr(sqr(Side)));
1 : ResMemo.Lines.Add(IntToStr(i)+' - прямоугольник, S='+ FloatToStr(Side1*Side2));