
- •Место процедур в модуле
- •Параметры процедур
- •Пример 1. Процедуры без параметров
- •Рекомендации по выбору типа формальных параметров
- •Пример 2. Процедура с параметрами
- •Пример 3. Процедура контроля алфавита вещественных чисел
- •Пример 4. Функция
- •Пример 5. Вычисление значений функции
- •4.3. Содержание отчета
- •4.4. Контрольные вопросы
Рекомендации по выбору типа формальных параметров
При подстановке фактических параметров, обращаясь к подпрограмме, следите за соответствием:
количество формальных и фактических параметров должно быть одинаковое;
порядок следования формальных и фактических параметров должен совпадать;
тип фактического параметра должен совпадать с соответствующим типом формального параметра.
Без необходимости описание всех формальных параметров как параметров-переменных нежелательно по двум причинам. Во-первых, это исключает возможность вызова процедуры с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, изменённое в подпрограмме значение не всегда следует передавать в вызывающий блок. Параметрами-переменными следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающему блоку. Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем меньше опасность получения не предусмотренных эффектов.
Не рекомендуется использовать параметры-переменные в заголовке функции, так как функция сама возвращает единственное значение. Если результатом работы подпрограммы должно быть несколько значений, то её следует оформить в виде процедуры.
Пример 2. Процедура с параметрами
Дано: несколько текстовых полей для ввода вещественных чисел.
Требуется: разработать процедуру, контролирующую ввод символов алфавита вещественных чисел используя механизм передачи данных посредством параметров.
{Параметр Var Symb - формальный параметр-переменная обеспечит передачу введённого символа из процедуры Inp_Real2 в вызывающую процедуру}
procedure Inp_Real2(Var Symb: Char);
begin
If Not (Symb in ['0'..'9', ',', '-', '+', #8]) //допустимые символы
then Symb := #0 ; //подмена недопустимого символа пустым значением
end;
{Вызов процедуры Inp_Real2 процедурой TForm1.LabeledEdit1KeyPress }
procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin
Inp_Real(Key); {Key - фактический параметр, значение будет передано в
вызывающую процедуру TForm1.LabeledEdit1KeyPress}
end;
По аналогии с Inp_Real2 можно разработать процедуру для ввода целых чисел, она будет отличаться только множеством допустимых символов. Недостаток процедуры Inp_Real2 - не исключает ввода нескольких запятых.
Пример 3. Процедура контроля алфавита вещественных чисел
Для расширения возможностей контроля ввода данных, исключающих ввод нескольких запятых, воспользуемся стандартной функцией Pos.
Pos(Substr: string; S: string): Integer - функция ищет подстроку Substr (или отдельный символ) в строке S и возвращает значение позиции первого символа Substr в строке S. Если вхождение Substr не найдено, то функция возвращает ноль. Функция чувствительна к регистру.
Например. Pos(‘,’, Edit1.Text), в поле Edit1.Text введено 123 (запятой нет) - функция возвратит 0; после ввода запятой 123, - функция вернёт значение 4.
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);
end;