Пример 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

caseSymb of

'0'..'9': ; // допустимые символы

',','.' : //введена точка или запятая

Begin

if Symb = '.' //введена точка

then Symb := ','; // подмена точки запятой

{проверка наличия в отображаемой строке Str_Ed запятой}

if Pos(',', Str_Ed) <> 0 // строка Str_Ed уже содержит запятую

then Symb:=Char(0); // подмена запятой пустым символом

End;

#8 : ; // <Backspace>

elseSymb :=Chr(0); //подмена недопустимого символа пустым

End;

Обращение к процедуре Inp_Real3.

procedureTForm1.LabeledEdit1KeyPress(Sender: TObject;varKey: Char);

Begin

Inp_Real4 (Key, LabeledEdit1.Text); { Key из Inp_Real4 будет передан в

End;

Схема алгоритма. Контроль ввода вещественных чисел procedure Inp_Real3(Var Symb: Char ; Str_Ed : string)
Symb вводимый символ  
Начало
Symb = '.'  
true
Chr(0)
Symb
‘0’..’9’:
‘,’, ‘.’:
#8:  
Конец
true
Symb:=’,’  
else true
Есть ‘,’? Pos(',', Str_Ed) <> 0
Запятая уже есть Chr(0)

Пример 4. Функция

Разработаем функцию возведения в степень .

 

Постановка задачи

X и n – вещественные числа.

1 Для вычислений воспользуемся встроенной функцией Ln(X: Real): Real, возвращающей логарифм числа X, и функцией Exp(X: Real): Real, возвращающей число по его логарифму.

2 Определим функцию в виде function Fxn(X, n: Real): Real;

3 Особые случаи:

· при X=0, Fxn=0;

· при X<0 вычислять будем абсолютное значении |X|n ;

· при n=0, Fxn=1. Другие особые случаи не рассматриваем.

 

function FXn(X, n: Real):Real; //возвращаетX в степени n

Begin

ifX=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;

Начало
Схема алгоритма. Функция Xn function FXn(X, n: Real):Real
true
X=0
Конец
true
false
FXn:= Exp(n*Ln(Abs(X)))
X<0
false
false
FXn=0
true
n=0
FXn=1
FXn:= Exp(n*Ln(X))
Вычисляется абсолютное значение
elseFXn:= 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 и нажатия кнопки для вычислений и вывода значений}

procedureLabeledEdit1KeyPress(Sender: TObject; var Key: Char);

procedure LabeledEdit2KeyPress(Sender: TObject; var Key: Char);

procedure LabeledEdit3KeyPress(Sender: TObject; var Key: Char);

procedure Button1Click(Sender: TObject);

End;

 

varForm1: TForm1;

 

Implementation

{$R *.dfm}

Var X, dX, n : Real; //глобальные переменные

 

procedureInp_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 и здесь не приведены}

 

procedureTForm1.Button1Click(Sender: TObject);

Begin

if LabeledEdit1.Text <> '' //Проверка поля ввода Х на пустое значение

then X:= StrToFloat( LabeledEdit1.Text); //Х преобразовано в число

else begin ShowMessage('введите X!');

exit//досрочное завершение процедуры

End;

ifLabeledEdit2.Text <> '' //Проверка поля ввода dХ на пустое значение

thendX:= 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.

Введите n
false
Начало
Конец
false
True
LabeledEdit1.Text <> ''  
true
LabeledEdit2.Text <> ''  
False
n преобразовано в число преобразован в X
Введите Х
Вывод X, FXn(X, n) X+dx, FXn(X+dx, n) X+2*dX, FXn(X+2*dX, n)
Введите dX
 
Exit
Exit
true
Схема алгоритма. Вычисления с использование FXn(x, n) procedure TForm1.Button1Click(Sender: TObject)
X преобразован в число  
LabeledEdit3.Text <> ''  
dX преобразовано в число
Exit

Содержание отчета

1. Задание.

2. Листинг модуля с подробными комментариями.

3. Для каждой из пользовательских процедур дайте обоснование назначенного типа параметра (параметр-значение или параметр переменная).

4. Схемы алгоритмов всех нелинейных процедур.

5. Условия тестирования и ожидаемый результат.

6. Перечень ситуаций, при которых возможно аварийное завершение Вашей программы.