
- •Место процедур в модуле
- •Вложенные описания процедур
- •Параметры процедур
- •Пример 1. Процедуры без параметров
- •Иллюстрация свойств параметр-значение и параметр-переменная
- •Рекомендации по выбору типа формальных параметров
- •Пример 2. Процедура с параметрами
- •Пример 3. Процедура контроля алфавита вещественных чисел
- •Пример 4. Функция
- •Постановка задачи
- •Пример 5. Вычисление значений функции
- •Содержание отчета
Пример 3. Процедура контроля алфавита вещественных чисел
Расширим возможности процедуры, разработанной в примере2:
разрешим ввод как «,», так и «.» с последующей подменой «.» на «,»;
исключим возможность ввода нескольких запятых.
Воспользуемся стандартной функцией Pos.
Pos(Substr: string; S: string): Integer - функция ищет подстроку или отдельный символ Substr в строке S и возвращает значение позиции первого символа Substr в строке S. Если вхождение Substr не найдено, то функция возвращает ноль. Функция чувствительна к регистру.
Например. Pos(‘,’, Edit1.Text), в поле Edit1.Text введено 123 (запятой нет) - функция возвратит 0; после ввода запятой 123, - функция вернёт значение 4.
Используем оператор case.
procedure Inp_Rea3(Var Symb: Char ; Str_Ed : string);
{Var Symb - формальный параметр-переменная обеспечит передачу введённого символа из процедуры Inp_Real3 в вызывающую процедуру;
Str_Ed – значение строки отображаемой в поле ввода, параметр-значение,
при вызове процедуры будет подставлено фактическое имя поля}
begin
case Symb of
'0'..'9': ; // допустимые символы
',','.' : //введена точка или запятая
begin
if Symb = '.' //введена точка
then Symb := ','; // подмена точки запятой
{проверка наличия в отображаемой строке Str_Ed запятой}
if Pos(',', Str_Ed) <> 0 // строка Str_Ed уже содержит запятую
then Symb:=Char(0); // подмена запятой пустым символом
end;
#8 : ; // <Backspace>
else Symb :=Chr(0); //подмена недопустимого символа пустым
end;
Обращение к процедуре Inp_Real3.
procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin
Inp_Real4 (Key, LabeledEdit1.Text); { Key из Inp_Real4 будет передан в
end;
Пример 4. Функция
Разработаем функцию возведения в степень
.
Постановка задачи
X и n – вещественные числа.
Для вычислений воспользуемся встроенной функцией Ln(X: Real): Real, возвращающей логарифм числа X, и функцией Exp(X: Real): Real, возвращающей число по его логарифму.
Определим функцию в виде function Fxn(X, n: Real): Real;
Особые случаи:
при X=0, Fxn=0;
при X<0 вычислять будем абсолютное значении |X|n ;
при n=0, Fxn=1. Другие особые случаи не рассматриваем.
function FXn(X, n: Real):Real; //возвращаетX в степени n
Begin
if X=0
then Fxn:=0 //при Х=0 – возвращает 0
else if n=0
then FXn:=1 // при n=0 – возвращает 1
else if X<0
then begin
ShowMessage('При отрицательных Х вычисляется по
абсолютному значению');
FXn:= Exp(n*Ln(Abs(X)));
end;
else
FXn:=
Exp(n*Ln(X));
end; //конец функции
Пример 5. Вычисление значений функции
Разработка программы вычисления трёх значения функции Fxn(X, n: Real):Real (пример 4), начиная с X0 и приращением dX, процедура контроля ввода Inp_Rea3(Var Symb: Char ; Str_Ed : string) взята из примера 3.
//установим компоненты формы
type
TForm1 = class(TForm)
Label1: TLabel; // информация о работе
Button1: TButton; //кн. Вычислить
LabeledEdit1: TLabeledEdit; // Х
LabeledEdit2: TLabeledEdit; // dX - приращение
LabeledEdit3: TLabeledEdit; // n - степень
Label2: TLabel; //вывод результатов
{Определим процедуры обработки событий ввода Х, dX, n и нажатия кнопки для вычислений и вывода значений}
procedure LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
procedure LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
procedure LabeledEdit3KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
Var X, dX, n : Real; //глобальные переменные
procedure Inp_Real3(Var Symb: Char ; Str_Ed : string);
{Контроль ввода символов вещественных чисел. Текст процедуры приведён в примере 3.}
end;
function FXn(X, n: Real):Real; //возвращаетX в степени n
//Вычисление , текст функции приведён в примере 4.
end;
procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin //ввод Х
Inp_Real3(Key, LabeledEdit1.Text); //контроль алфавита переменной Х
end;
{Процедуры TForm1.LabeledEdit2KeyPress и TForm1.LabeledEdit3KeyPress аналогичны TForm1.LabeledEdit1KeyPress и здесь не приведены}
procedure TForm1.Button1Click(Sender: TObject);
begin
if LabeledEdit1.Text <> '' //Проверка поля ввода Х на пустое значение
then X:= StrToFloat( LabeledEdit1.Text); //Х преобразовано в число
else begin ShowMessage('введите X!');
exit //досрочное завершение процедуры
end;
if LabeledEdit2.Text <> '' //Проверка поля ввода dХ на пустое значение
then dX:= StrToFloat( LabeledEdit2.Text)
else begin ShowMessage('введите dX');
exit //досрочное завершение процедуры
end;
if LabeledEdit3.Text <> '' //Проверка поля ввода n на пустое значение
then n:= StrToFloat( LabeledEdit3.Text)
else begin ShowMessage('Введите n!');
exit
end;
Label2.Caption:= ' X Y'+ #10+
FloatToStrF(X, ffGeneral, 5, 3)+ #9+ //преобразование Х в строку и вывод
FloatToStrF(FXn(X, n), ffGeneral, 5, 3)+ #10+
//преобразование FXn(X,n)и вывод
FloatToStrF(X+dX, ffGeneral, 5, 3)+ #9 + //вывод X+dx
FloatToStrF(FXn(X+dX, n), ffGeneral, 5, 3)+ #10 + //вывод FXn(X+dx, n)
FloatToStrF(X+2*dX, ffGeneral, 5, 3)+ #9+ //вывод X+2*dx
FloatToStrF(FXn(X+2*dX, n), ffGeneral, 5, 3)+ #13; //вывод FXn(X+2*dX, n)
end;
end.