Пример 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)) |
Вычисляется абсолютное значение |
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. Перечень ситуаций, при которых возможно аварийное завершение Вашей программы.