
Контр раб Ч2
.pdfВ этой программе используется замещение процедуры UpString «заглушкой», в которой на самом деле не осуществляется нужных действий, а выходная строка просто копирует входную.
При разработке алгоритма процедуры необходимо учесть, что в соответствии с принятой в Windows ANSI-кодировкой, символы кириллицы располагаются сплошным массивом от «А» до «я», за исключением «ё» и «Ё», которые предшествуют «А». Кроме того, символ «я» имеет внутренний код 255, т. е. максимально возможное значение одного байта.
Возможный вариант процедуры:
procedure UpString (stInp: String; var stOut: String);
//Эта процедура преобразует все буквы строки stInp в прописные
//и помешает результат в выходную строку stOut
var
k: Integer; // Параметр цикла begin
StOut := stInp;
// Цикл no-буквенного преобразования
for k := 1 to Length(stOut) {Length - длина строки} do begin
stOut[k] := UpCase (stOut[k]); |
// Преобразуем латиницу |
|
//Если строчная |
буква кириллицы, преобразуем ее |
|
if (stOut[k] >= |
'а') and (stOut[k] <= 'я') then |
stOut[k] := Chr(ord('A') + ord(stOut[k]) - ord('a')); if stOut[k]='ё' then
stOut[k] := 'Ё'; // Преобразуем ё в Ё
end;
end; // UpString
Сохраните проект (File/Save All). Скомпилируйте и запустите программу UPSTRING.
Рассмотрим способ реализации той же программы в виде функции.
С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем UpStr_F.dpr в папке С:\Projects\UpStr_F\, а модуль под именем Main.pas в той же папке. Код функции, преобразующей строчные буквы кириллицы в прописные, представлен ниже.
procedure TfmExample.bbRunClick(Sender: TObject); function UpString(stInp: String): String;
//Эта функция преобразует все буквы строки stlnp в прописные
//и помещает результат в выходную строку Result
var
k: Integer; // Параметр цикла begin
Result := stInp;
// Цикл по-буквенного преобразования
for k := |
1 to Length(Result) do |
|
begin |
|
// Преобразуем латиницу |
Result[k] := UpCase(Result[k]); |
||
//Если |
строчная буква кириллицы, преобразуем ее |
|
|
11 |
|

if (Result[k] >= 'а') and (Result[k] <= 'я') then Result[k] := Chr(ord('A') + ord(Result[k]) - ord('a'));
if Result[k] = 'ё' then
Result[k] := 'Ё'; // Преобразуем ё в Ё
end;
end; // UpString begin
//В следующем операторе исходная строка edInput.Text
//преобразуется и помещается в выходную строку lbOutput.Caption:
lbOutput.Caption := UpString(edInput.Text); edInput.Text := '';
edInput.SetFocus;
end;
Окно программы UPSTRING показано на рисунке
Сохраните проект (File/Save All).
2.5.Программа возведения в степень POWER
Спомощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Power.dpr в папке С:\Projects\Power\, а модуль под именем Main.pas в той же папке.
В Object Pascal не предусмотрена операция возведения вещественного числа в произвольную степень. Эту задачу можно решить с использованием стандартных математических функций Ехр и Ln по следующему алгоритму:
X Y = e(Y *Ln( X )) .
Создайте функцию с именем Power и двумя вещественными параметрами А и В, которая будет возвращать результат возведения А в степень В. Обработчик события bbRunClick учебной формы fmExample читает из компонента edInput текст и пытается выделить из него два числа, разделенных хотя бы одним пробелом. Если это удалось сделать, он обращается к функции Power дважды: сначала возводит первое число Х в степень второго числа Y, затем Х возводится в степень -Y.
12
procedure TfmExample.bbRunClick(Sender: TObject);
function Power(A, B: Real): Real;
{Функция возводит число А в степень В. Поскольку логарифм отрицательного числа не существует, реализуется проверка значения А: отрицательное значение заменяется на положительное, для нулевого результат равен нулю. Кроме того, любое число в нулевой степени дает единицу.}
begin
if A > 0 then
Result := Exp(B * Ln(A)) else if A <0 then
Result := Exp(B * Ln(Abs(A))) else if B = 0 then
Result := 1
else
|
Result := 0; |
end; |
// Power |
var
S: String;
X, Y: Real; begin
{Читаем строку из edInput и выделяем из нее два вещественных числа, разделенных хотя бы одним пробелом}
S := edInput.Text; |
|
|
|
if (S = '') or (pos(' ',S) =0) |
then |
|
|
Exit; |
// Нет текста |
или в нем |
нет |
|
// пробела - прекращаем |
дальнейшую работу |
try
// Выделяем первое число:
X := StrToFloat(copy(S, 1, pos(' ', S) - 1)) ;
//Если успешно, удаляем символы до пробела
//и выделяем второе число:
Delete (S, 1, pos (' ', S)) ; Y := StrToFloat(Trim(S));
except
Exit; |
// Завершаем работу при ошибке преобразования |
end;
mmOutput.Lines.Add(FloatToStr(Power(X, Y))); mmOutput.Lines.Add(FloatToStr(Power(X, -Y)));
end;
Для вызова функции Power ее указали в качестве параметра при обращении к стандартной функции преобразования вещественного числа в строку FloatToStr. Параметры Х и Y в момент обращения к функции Power – это фактические параметры. Они подставляются вместо формальных параметров А и В в заголовке функции и затем над ними осуществляются нужные действия. Полученный результат присваивается специальной переменной с именем Result, которая в теле любой функции интерпретируется как то значение, которое вернет функция после окончания своей работы. В программе функция Power вызывается дважды – сначала с параметрами Х и Y, а затем X и -Y.
Сохраните проект (File/Save All). Скомпилируйте и запустите программу POWER. Ее окно показано на рисунке.
13

Закройте проект командой главного меню File/Close All.
2.6. Программа вывода одномерных массивов переменной длины MYARRAY
Откройте новый проект и сохраните его под именем MyArray.dpr в папке С:\Projects\MyArray\, а модуль под именем Main.pas в той же папке. Введите в обработчик события OnClick кнопки Run следующий код:
procedure TfmExample.bbRunClick(Sender: TObject);
{Иллюстрация использования открытых массивов: программа выводит в компонент mmOutput содержимое двух одномерных массивов разной длины с помощью одной процедуры ArrayPrint}
procedure ArrayPrint(aArray: array of Integer); var
k: Integer; S: String;
begin
S := '';
for k := 0 to High(aArray) do
S := S + IntToStr(aArray[k]); mmOutput.Lines.Add(S);
end; const
A:array [-1..2] of Integer = (0,1,2,3);
B:array [5..7] of Integer = (4,5,6);
begin
ArrayPrint(A);
ArrayPrint(B); end;
Как видно из этого примера, фактические границы массивов А и В, передаваемых в качестве параметров вызова процедуре ArrayPrint, не имеют значения. Однако размерность открытых массивов (количество индексов) всегда равна 1 – за этим следит компилятор.
Сохраните проект (File/Save All). Скомпилируйте и запустите программу MYARRAY. Ее окно показано на рисунке.
14

Закройте проект командой главного меню File/Close All.
2.7. Программа вывода на экран таблицы с расчетом RELATION
Откройте новый проект и сохраните его под именем Relation.dpr в папке
С:\Projects\Relation\, а модуль под именем Main.pas в той же папке.
Программа выводит на экран таблицу двух функций: sin1(x) = (sin(x) + 1) × eхр(-х)
и
cos1(x) = (cos(x) + 1) × eхр(-х).
Вычисление и печать значений этих функций реализуются в процедуре PrintFunc, которой в качестве параметров передается количество NP вычислений функции в диапазоне Х от 0 до 2π и имя нужной функции.
function Sin1(X: Real): Real; begin
Result := (Sin(X) + 1) * Exp(-X) end; // Sin1
function Cos1(X: Real): Real; begin
Result := (Cos(X) + 1) * Exp(-X) end; // Cos1
procedure TfmExample.bbRunClick(Sender: TObject);
type
Func = function(X: Real): Real; // Процедурный тип procedure PrintFunc(NP: Integer; F: Func) ;
var
k: Integer; X: Real;
begin
for k := 0 to NP do
15

begin
|
X := k * 2 * |
pi / NP; |
|
|
mmOutput.Lines.Add(FloatToStrF(X, ffExponent, 10, 2) |
+ |
|
|
#9 + #9 + |
FloatToStrF(F(X), ffExponent, 10, 2)) ; |
|
end; |
|
|
|
end; |
// Print Funс |
|
begin // bbRunClick mmOutput.Lines.Add(#9'Функция Sin1:'); PrintFunc(10, Sin1) ; mmOutput.Lines.Add(#9'Функция Cos1:'); PrintFunc (10, Cos1) ;
end; end.
Обратите внимание: передаваемые подпрограммы не могут быть локальными, т. е. процедурами или функциями, объявленными внутри другой подпрограммы. Вот почему описание подпрограмм Sin1 и Cos1 размещаются вне обработчика bbRunClick, но выше него по тексту модуля. Символ #9 – это символ табуляции, который вставляется в формируемые строки для разделения колонок с цифрами.
Сохраните проект (File/Save All). Скомпилируйте и запустите программу RELATION. Ее окно показано на рисунке.
Закройте проект командой главного меню File/Close All.
2.8. Программа рекурсивного вычисления факториала FACTORIAL
Откройте новый проект и сохраните его под именем Factorial.dpr в папке
С:\Projects\Factorial\, а модуль под именем Main.pas в той же папке.
Программа получает от компонента edInput целое число N и выводит в компонент lbOutput значение N!, которое вычисляется с помощью рекурсивной функции Factorial.
16

procedure TfmExample.bbRunClick(Sender: TObject); function Factorial(N: Word): Extended;
begin
if N = 0 then
Result := 1 else
Result := N * Factorial(N-1)
end;
var
N: Integer; begin
try
N := StrToInt(Trim(edInput.Text)); except
Exit; end;
lbOutput.Caption := FloatToStr(Factorial(N)); end;
Сохраните проект (File/Save All). Скомпилируйте и запустите программу FACTORIAL. Ее окно показано на рисунке.
Закройте проект командой главного меню File/Close All.
17