Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Контр раб Ч2

.pdf
Скачиваний:
8
Добавлен:
14.03.2016
Размер:
345.34 Кб
Скачать

В этой программе используется замещение процедуры 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