- •Лабораторная работа №7. Работа в delphi.
- •Процедуры и функции
- •Задание 1.1 Опишем процедуру вычисления корней квадратного уравнения.
- •Заметьте что, прототип процедуры указывается в разделе interface, а заготовка процедуры в разделе реализации который предваряет ключевое слово implementation.
- •Ключевое слово Result в функции, содержит возвращаемый ею результат определенного типа. Вместо этого слова можно писать имя самой функции.
- •Задание 1.3. Создадим функцию, подсчитывающую количество букв «f» в введённой пользователем строке.
- •Задание 1.5. Создадим простую, отдельную от какого либо класса функцию с именем Bush(X,y:integer):integer возвращающую значение произведения X*y.
- •Перегрузка функций.
- •Задание 1.6. Напишем ещё две перегруженные функции с тем же именем Bush.
- •Задание 1.7. Изучим Основной блок Begin и End модуля.
Ключевое слово Result в функции, содержит возвращаемый ею результат определенного типа. Вместо этого слова можно писать имя самой функции.
В отличие от процедуры, для функции всегда указывается не только тип переданных в неё параметров, но и тип возвращаемого функцией значения. В данном случае функция будет возвращать значение типа word.
Далее в обработчике Button2 напишите следующее:
var i:integer; b:word;
begin
for i:=1 to 10 do
Memo1.Lines.Add('Факториал n='+IntToStr(i)+' равен '+IntToStr(Faktorial(i)));
b:=Faktorial(10); { просто присваиваем некоторой переменой типа word
значение функции Faktorial(25);}
ShowMessage(’10! = ’+IntToStr(b));
end;
Запустите программу, убедитесь в правильности её работы, вернитесь в режим программирования.
Нужно отметить, что в данном случае процедура
procedure TForm1.KvadrKoren(a, b, c: real; var x1, x2: real);
и функция function TForm1.Faktorial(n: word): word; являются методами класса TForm1
мы их объявили в разделе Public это означает, что эти функции и процедуры доступны наследникам данного класса, также их можно вызывать и из другого модуля, например Unit2 подключенного к данному Unit1.
Delphi предоставляет очень полезное окно Module Explorer (Ctrl+Shift+E) – в нем содержится основная информация о текущем программном модуле, о перечне классов, других модулях которые он использует, а также методах классов, процедурах и функциях.
Рис. 7 Окно Module Explorer
Задание 1.3. Создадим функцию, подсчитывающую количество букв «f» в введённой пользователем строке.
Создайте новый проект. Как и в предыдущем случае сбросьте на форму Button1, Button2 и Memo1.
Строку будем вводить при помощи оператора InputBox('Input Box', 'Prompt', 'Default string'), данный оператор является по существу функцией и возвращает строковое значение 'Default string' типа string.
Так же в Public объявите прототип и сформируйте функцию Funkfff(s:string):word;
Таким образом, функция будет получать в качестве параметра значение строковой переменной s, а возвращать количество букв «f» содержащихся в данной строке.
Реализация функции должна быть следующая:
function TForm1.Funkfff(s: string): word;
var i,sum:word;
begin
sum:=0;
for i:=1 to length(s) do
if s[i]='f' then sum:=sum+1;
result:=sum;
end;
Здесь length(s) – стандартная функция возвращающая длину строки s, то есть количество всех символов в строке.
В обработчике щелчка на Button1 напишите следующее:
var s:string;
begin
s:=inputBox('Ввод строки','Введите строку','');
messageDlg('Число букв f равно '+IntToStr(Funkfff(s) ),mtInformation,[mbOk],0);
end;
Запустите программу, убедитесь в правильности её работы, вернитесь в режим программирования.
Задание 1.4. Здесь же создадим процедуру по имени Mas (метод Класса TForm1), получающую в качестве параметра некоторый одномерный массив, и постоянное число N, которая будет определять: сумму N элементов массива, среднее арифметическое N его элементов, а также менять чётные элементы массива на -1.
Так как процедура должна менять чётные элементы массива на -1, а значит должна иметь доступ к оригинальному массиву, то в процедуре перед переданным параметром-массивом должно быть слово Var (передача по ссылке).
В Public объявите прототип и сформируйте процедуру
Mas(var a: array of integer; const N:integer; var Sum:integer; var Sred:real);
Код функции должен быть следующим:
procedure TForm1.Mas(var a: array of integer; const N:integer;
var Sum:integer; var Sred:real);
var i:integer;
begin
sum:=0;
for i:=0 to N-1 do sum:=sum+a[i];
sred:=sum/N;
for i:=0 to N-1 do if (a[i] mod 2)=0 then a[i]:=-1;
end;
Здесь в процедуре индексация массива идет с нулевого индекса, поэтому первый элемент это a[0], второй элемент a[1] и т.д.
Мы будем вызывать процедуру Mas из обработчика щелчка кнопки Button2, поэтому в обработчике Button2 напишите следующее:
const N=5;
var i:integer; a:array[1..N] of integer; Sum:integer; Sred:real;
begin
memo1.Clear;
memo1.Lines.Add('Выводим начальный массив');
for i:=1 to N do begin
a[i]:=Random(9); memo1.Lines.Add( IntToStr(a[i]) );
end;
mas(a,N,Sum,Sred);// Вызываем процедуру
Memo1.Lines.Add('Sum='+IntToStr(Sum)+' Sred='+FloatToStr(Sred));
memo1.Lines.Add('');
memo1.Lines.Add('Выводим измененный массив');
for i:=1 to N do memo1.Lines.Add( IntToStr(a[i]) );
end;
Запустите программу, убедитесь в правильности её работы. Результат должен быть примерно следующим(рис. 8). Вернитесь в режим программирования.
Рис. 8 Окно приложения (в режиме работы) определяющего сумму элементов массива, среднее арифметическое элементов и т.д.
Нужно отметить, что и процедуры и функции можно прописывать совершенно обособленно от конкретного класса, то есть они могут существовать «сами по себе» и поэтому их уже нельзя называть методами класса. При этом не нужно описывать их прототип, а достаточно описать их один раз.