Программирование.
Часть 1.
1. Вызов редактора
кода
Итак, Delhi уже заготовила
каркас будущего приложения. Теперь нужно ввести
программный код, который может быть выполнен
только самим программистом.
1. Щелкните на панели Delphi на
кнопке Toggle Form/Unit. При этом форма и редактор
кодов поменяются местами (форма спрячется под
редактор, а редактор всплывет наверх и станет
доступным).
2. Для удобства растяните
окно редактора так, чтобы оно заняло всё
пространство справа от Object Inspector и под панелью
Delphi.
2. Описание
глобальных констант, типов и переменных
Теперь необходимо описать глобальные
константы, типы и переменные модуля
main.pas.
Сразу перед словом implementation
введите с клавиатуры текст, показанный на рис. 3.
Обратите внимание, что часть этого текста -
описание формы - уже сгенерировала сама Delphi.
Есть другой более
быстрый способ ввода текста - из этого
документа в редактор кодов:
1.2. Выделите мышью в таблице требуемый фрагмент
текста.
1.3. Клавишами Ctrl+Insert скопируйте его в буфер
обмена.
1.4. Перейдите в редактор кодов Delphi, установите
курсор в требуемое место и нажмите Shift+Insert
для вставки текста из буфера обмена.
Const
df = 'Datas.txt'; // файл исходных данныхType // описание
типов динамических массивов
TArr1 = array of Real; // одномерный
TArr2 = array of TArr1; // двумерный
Var
fMain: TfMain; // эту строку уже вставила Delphi
a: TArr2;
u: TArr1;
n,m: Integer; |
Рис. 3.
Описание глобальных констант, типов и переменных
Оператором Const
описана текстовая константа df, которой присвоено
значение 'Datas.txt'. Это имя файла, в котором будем
хранить исходные данные - элементы матрицы А.
В операторе Type
описаны два динамических массива вещественного
типа (Real).
В операторе Var
кроме описанной формы fMain, описан двумерный
массив a, одномерный массив u и
две целочисленные переменные n, m.
3. Описание
вспомогательных функций общего назначения
Для ввода/вывода данных
нам потребуется ряд функций общего назначения,
которые приведены ниже на рис. 4. Вставьте их
сразу за опцией {$R *.DFM},
расположенной после слова imlementation.
{$R *.DFM}
Function RealToStr(r: Real; p: byte): String;
{Конвертирует Real в строку, p - символов в дробной
части}
BEGIN
Str(r:30:p,Result); // конвертация real - string
Result:=Trim(Result); // отбрасывание пробелов слева и
справа
END;
Function LPad(s: String; d: Word): String;
{вставляет слева от строки пробелы, добирая ее до
длины d}
BEGIN
Result:=Format('%*s',[d,s]);
END;
Function RealToStr2(R: Real; All,p: byte): String;
// конвертация real в строку длины All,
// p - цифр в дробной части
BEGIN
Result:=LPad(RealToStr(R,p),All);
END;
Function DaNet(S: String): boolean;
{Задает вопрос, требует ответа в виде Да/Нет}
BEGIN
DaNet:=MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes;
Screen.ActiveForm.Refresh; // удаление следов окна вопроса
END;
|
Рис. 4.
Вспомогательные функции общего назначения
Функция RealToStr2
конвертирует вещественное число в строку,
логическая функция DaNet потребуется для
уточнения намерений пользователя выполнить
ответственную операцию.
4. Описание
подпрограмм для работы с компонентом Memo
Ниже этих строк добавьте
строки из нижепривеженной таблицы рис. 5. Эти
подрограммы предназначены для обработки
ввода/вывода при ипользовании в нашем приложении
компонентов Memo.
procedure ToMemo2(s:
String);
// добавляет строку s в Memo2, слева вставляется
пробел
begin
fMain.Memo2.Lines.Add(' '+s);
end;
function FromMemoToDinArray
(Me: TMemo; var a: TArr1; var n: Integer):
boolean;
// читает числа из Memo и автоматически создает
// одномерный массив А длины n (нумерация от 0)
Label Fin;
var i,j,Code: Integer; s,q: String; r: Real;
begin
n:=0; Result:=true;
With Me, Me.Lines do
if Count>0 then
for i:=0 to Count-1 do
begin
s:= Trim(Lines[i]);
if s <> '' then
repeat
j:=Pos(' ',s);
Case j>0 of
true : begin
q:= Copy(s,1,j-1);
s:=Trim(Copy(s,j+1,Length(s)));
end;
false: begin
q:= Trim(s);
s:='';
end;
end; // Case
Val(q,r,Code);
Case Code = 0 of
true: begin
Inc(n);
SetLength(a,n);
a[n-1]:=r;
end;
false: begin
ShowMessage('Ошибка в данных: '+q);
Result:= false;
Goto
Fin;
end;
end; // Case
until s = '';
end;
Fin: end;
function FormVspomArrToA: boolean;
// из Memo1 читает числа во вспомогательный массив V,
// затем из него - в массив А.
// возвращает TRUE, если нет ошибок
var v: TArr1; k,i,j: Integer;
begin
Result:=false;
if FromMemoToDinArray(fMain.Memo1,v,k) then
if (k < n*m) then
ShowMessage('Недостаточно данных')
else
begin
k:=0; Result:=true;
SetLength(a,n+1,m+1);
for i:= 1 to n do
for j:= 1 to m do
begin
a[i,j]:=v[k];
Inc(k);
end;
end;
v:= Nil;
end;
procedure OutStr(Title: String);
// в Memo2 выводит пустую строку, затем строку s
begin
ToMemo2(' ');
ToMemo2(Title);
end;
procedure OutArr1(a: TArr1; d,p: Integer);
// выводит одномерный массив A в Memo2,
// каждое число длины d, в дробной части p символов
var i: Integer; s: String;
begin
s:= '';
for i:= 1 to High(a) do
s:=s+RealToStr2(a[i],d,p);
ToMemo2(s);
end;
procedure OutArr2(a: TArr2; d,p: Integer);
// выводит двумерный массив A в Memo2,
// каждое число длины d, в дробной части p символов
var i: Integer;
begin
for i:= 1 to High(a) do
OutArr1(a[i],d,p);
end; |
Рис. 5.
Подрограммы для работы с компонентами Memo
Теперь можно приступать к
непосредственному программированию ядра
приложения - операций сортировки.
|