Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика, программирование
Алгоритми пошуку застосовуються для знаходження, наприклад, у масиві елемента з потрібними властивостями. Звичайно розрізняють постановки завдання пош...полностью>>
Информатика, программирование
АЛУ состоит из регистров, сумматора с соответствующими логическими схемами и элемента управления выполняемым процессом. Устройство работает в соответс...полностью>>
Информатика, программирование
АИС создается для удовлетворения информационных потребно­стей кон­крет­но­го пользователя, и он принимает непосредствен­ное участие в ее работе. Под ф...полностью>>
Информатика, программирование
Поиск: a) людей, б) предприятий по специализации. Может быть задано несколько специализаций, связанных операциями «и» и «или»....полностью>>

Главная

Сохрани ссылку в одной из сетей:

Функции, определяемые пользователем

Хотя набор встроенных функций языка Delphi достаточно широк, он вряд ли может удовлетворить требованиям каждого программиста. Поэтому пользователю предоставлена возможность самому реализовать нужные ему алгоритмы в виде функций и обращаться к ним из программ по мере необходимости.

Функция — это подпрограмма, т.е. последовательность инструкций, имеющая имя и возвращающая единственное значение.

Функция, определенная пользователем, описывается в соответствующем разделе программы и включает заголовок и тело функции. Заголовок содержит зарезервированное слово Function, идентификатор (имя) функции, необязательный список формальных параметров, заключенный в круглые скобки, и тип возвращаемого функцией значения.

В общем виде структура объявления функции пользователя имеет вид:

function Имя_функции(Пар_1: Тип_1, ..., Пар_К: Тип_К): Тип_рез.);

var

// Разделы описания локальных меток, констант,

// типов, переменных, внутренних процедур и функций

begin

// Раздел операторов, среди которых должен быть хотя бы один,

// который присваивает имени функции значение результата

Имя_функции:=Выражение;

end;

где Имя_функции — уникальный в пределах блока идентификатор, используемый для перехода из программы к инструкциям функции. Возвращаемый результат может иметь любой простой, строковый или указательный тип;

(Пар_1: Тип_1, ..., Пар_К: Тип_К) – список формальных параметров, используемых для вычисления значения функции. Отличие параметра от обычной переменной состоит в том, что он объявляется не в разделе объявления переменных, который начинается словом var, а в заголовке функции. Конкретное значение параметр получает во время работы программы в результате вызова функции из основной программы;

Тип_результата – тип значения, которое функция возвращает в вызвавшую ее программу.

Следует обратить внимание, что в последовательности операторов, составляющих тело функции, должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. Если таких присваиваний несколько, то результатом выполнения функции будет значение последнего оператора присваивания. Тип выражения, определяющего значение функции, должен совпадать с типом функции, указанным в ее объявлении.

Процесс перехода к исполнению инструкций функции называется вызовом функции или обращением к функции. Процесс перехода от инструкций функции к инструкциям программы, вызвавшей функцию, называется возвратом из функции.

В общем виде инструкция обращения к функции выглядит так:

Переменная:=Имя_функции(Параметры);

где Переменная – имя переменной, которой надо присвоить значение, вычисляемое функцией;

Имя_функции – имя функции, значение которой надо присвоить переменной;

Параметры — список фактических параметров, которые применяются для вычисления значения функции. В качестве параметров обычно используют переменные или константы.

Следует обратить внимание на то, что:

  • каждая функция возвращает значение определенного типа, поэтому тип переменной, которой присваивается значение функции, должен соответствовать типу функции;

  • тип и количество параметров для каждой конкретной функции строго определены.

Задание № 2. Функция расчета площади треугольника

  1. Разработайте консольное приложение, рассчитывающее площади треугольников и сравнивающее их по размерам.

  2. Каждый треугольник задается координатами своих вершин (x1, y1), (x2, y2), (x3, y3) (рис. 1.2). Расчет площади треугольника рассчитывается в следующей последовательности:

  • расчет длин сторон по формулам:

  • расчет параметра:

  • расчет площади треугольника:

.

  1. Оформите расчет площади треугольника в виде функции, при обращении к которой передаются координаты трех точек, а возвращается значение функции.

  2. Рассчитайте значения площадей двух треугольников и определите, какая из них больше.

  3. Найдите сумму двух площадей.

  4. Листинг программы должен иметь примерно следующий вид:

program Ploshadi;

{$APPTYPE CONSOLE}

uses

SysUtils;

// Объявление переменных

var

x1,x2,x3,y1,y2,y3: real;

s1,s2,ssum: real;

// Заголовок функции

function Plosh(x1,x2,x3,y1,y2,y3: real): real;

// Объявление локальных переменных

var

a,b,c,p: real;

begin

a:=sqrt(sqr(x2-x1)+sqr(y2-y1)); // Расчет сторон треугольника

b:=sqrt(sqr(x3-x2)+sqr(y3-y2));

c:=sqrt(sqr(x3-x1)+sqr(y3-y1));

p:=(a+b+c)/2;

Plosh:=sqrt(p*(p-a)*(p-b)*(p-c)); // Расчет площади треугольника

end;

begin

writeln('Vvedite koordinaty vershin 1-go treugolnika');

write('x1= ');

readln(x1);

write('y1= ');

readln(y1);

write('x2= ');

readln(x2);

write('y2= ');

readln(y2);

write('x3= ');

readln(x3);

write('y3= ');

readln(y3);

s1:=Plosh(x1,x2,x3,y1,y2,y3); // Обращение к функции

writeln('Vvedite koordinaty vershin 2-go treugolnika');

write('x1= ');

readln(x1);

write('y1= ');

readln(y1);

write('x2= ');

readln(x2);

write('y2= ');

readln(y2);

write('x3= ');

readln(x3);

write('y3= ');

readln(y3);

s2:=Plosh(x1,x2,x3,y1,y2,y3); // Обращение к функции

ssum:=s1+s2;

if s1>s2 then

writeln('s1>s2',' s1=',s1:7:3,' s2=',s2:7:3)

else

if s1=s2 then

writeln('s1=s2',' s1=',s1:7:3,' s2=',s2:7:3)

else

writeln('s1

  • если mes[i]  {'р'..'я'}, то mes[i]:=Chr(Ord(mes[i])-16).

  • Листинг программы должен иметь примерно следующий вид:

    program perevod;

    {$APPTYPE CONSOLE}

    uses

    SysUtils;

    // Функция Rus преобразует ANSI-строку в ASCII-строку

    function Rus(mes: string): string;

    // В ANSI русские буквы кодируются числами от 192 до 255,

    // в ASCII - от 128 до 175 (А..Я а..п) и от 224 до 239 (р..я).

    var

    i: integer; // Номер обрабатываемого символа

    begin

    for i:=1 to length(mes) do

    case mes[i] of

    'A'..'п': mes[i]:=Chr(Ord(mes[i])-64);

    'р'..'я': mes[i]:=Chr(Ord(mes[i])-16);

    end;

    Rus:=mes;

    end;

    // основная программа

    begin

    writeln(Rus('Переключитесь на русскую раскладку клавиатуру'));

    writeln(Rus('Введите любую фразу'));

    write(Rus('Для завершения нажмите '), '');

    readln;

    end.

    1. Откомпилируйте и выполните программу. При наличии ошибок, исправьте их.

    2. Сохраните проект программы в папке \Мои документы\ЛЗ-03\Задание3 под именем Perevod.

    Теперь можете копировать текст функции RUS в другие консольные приложения и использовать символы кириллицы для вывода информации на экран.

    2. Рекурсивные подпрограммы

    Во многих случаях алгоритм решения задачи требует вызова для выполнения подпрограммы из раздела операторов той же самой подпрограммы, т.e. подпрограмма вызывает сама себя. Такой способ вызова называется рекурсией. Рекурсия полезна, прежде всего, в случаях, когда основную задачу можно разделить на подзадачи, имеющие ту же структуру, что и первоначальная задача. Подпрограммы, реализующие рекурсию, называются рекурсивными.

    Задание № 4. Рекурсивное вычисление факториала

    Факториал целого положительного числа n определяется как произведение первых n целых чисел:

    n! = 1*2*3* ... *n, причем полагается, что 0!=1.

    Такое произведение можно легко вычислить с помощью оператора цикла for:

    program Factorial;

    {$APPTYPE CONSOLE}

    uses

    SysUtils;

    var

    Fact: cardinal;

    n,i: integer;

    begin

    Write('Vvedite celoe chislo n: ');

    Readln(n);

    Fact:=1;

    for i:=1 to n do

    Fact:=Fact*i;

    Writeln('n! = ',Fact);

    Readln

    end.

    Однако существует другое определение факториала, в котором используется рекуррентная формула:

    (1) 0! = 1;

    (2) для всех n > 0 n! = n*(n–1)!

    Определения с помощью рекуррентных формул иногда называют рекурсивными определениями.

    1. Разработать функцию, рекурсивно вычисляющую факториал числа.

    2. Программа, использующая рекурсивную функцию для вычисления n! имеет следующий вид:

    program Factorial_Recurs;

    {$APPTYPE CONSOLE}

    uses

    SysUtils;

    var

    n: integer;

    // Определение рекурсивной функции

    function Fact(i: Integer): cardinal;

    begin

    if i=0 then Fact:=1

    else Fact:=i*Fact(i-1) // Функция вычисляется через себя

    end;

    function Rus(mes: string): string;

    var

    i: integer;

    begin

    for i:=1 to length(mes) do

    case mes[i] of

    'A'..'п': mes[i]:=Chr(Ord(mes[i])-64);

    'р'..'я': mes[i]:=Chr(Ord(mes[i])-16);

    end;

    Rus:=mes;

    end;

    begin

    Write(Rus('Введите целое число'),' n<=20: ');

    Readln(n);

    if (n>=0) and (n<=20) then

    Writeln(n:2,'! = ',Fact(n)) // Обращение к функции

    else Writeln(Rus('Введенное число выходит за диапазон'),' 0..20');

    Readln;

    end.

    1. Проверьте работу программы при значениях n = 10, 20, 25.

    2. Сохраните проект программы в папке \Мои документы\ЛЗ-03\Задание4 под именем Factorial.

    При разработке рекурсивных подпрограмм необходимо обращать особое внимание на выход из подпрограммы в нужный момент, так как возможен выход значений из допустимого диапазона или потеря порядка (обращение результата в нуль).

    Содержание и мощность рекурсивного определения, а также его главное назначение, состоит в том, что оно позволяет просто, с помощью конечного выражения, определить бесконечное множество объектов. Однако за эту простоту приходится расплачиваться неэкономным использованием оперативной памяти, так как выполнение рекурсивных процедур требует значительно большего размера памяти во время выполнения, чем нерекурсивных. При каждом рекурсивном вызове для локальных переменных, а также для параметров процедуры, выделяются новые ячейки памяти.

    ВЫВОДЫ

    1. Процедура (функция) пользователя представляет собой именованную группу операторов, реализующую определенную часть общей задачи и вызываемую для выполнения по имени из любой позиции раздела операторов.

    2. Между фактическими параметрами в операторе вызова процедуры (функции) и формальными параметрами в заголовке описания процедуры (функции) устанавливается взаимно-однозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равны количеству и типу фактических параметров.

    3. Областью действия (сферой видимости) идентификатора называется часть программы, где он может быть использован. Если идентификаторы допускается использовать только в рамках одной процедуры или функции, то такие идентификаторы называются локальными. Если действие идентификаторов распространяется на несколько вложенных (не менее одной) процедур и/или функций, то такие идентификаторы называются глобальными.

    4. Если подпрограмма вызывает сама себя, то она называется рекурсивной. Главное требование к рекурсивным подпрограммам: вызов рекурсивной подпрограммы должен выполняться по условию, которое на каком-то уровне рекурсии станет ложным.

    Контрольные вопросы

    1. Какой вид имеет структура описания процедуры и функции?

    2. В чем состоит отличие описания процедуры и функции?

    3. Что такое область действия идентификаторов?

    4. Каковы основные правила определения области действия для идентификаторов процедур и функций?

    5. Какие параметры называются формальными и какие — фактическими?

    6. Какой объект называется рекурсивным?

    7. Что необходимо для реализации рекурсии в программе?

    8. В чем преимущества и недостатки использования рекурсивных процедур по сравнению с нерекурсивными?

    Контрольные задания

    Вычислить следующие формулы, используя для решения рекурсивную процедуру или функцию.

    а) , где k - целая константа.

    б) , где а и n — целые положительные числа.

    в)



  • Похожие страницы:

    1. ... в визуальной интегрированной системе разработки программ Delphi

      Реферат >> Информатика, программирование
      ... привела к идее использования в подпрограммах локальных данных. И ... компонентов на форме, заданию некоторых их свойств и написанию, ... привлекательного и дружественного пользовательского интерфейса. Главной ... ), содержащий код на языке Delphi, с которого начинается ...
    2. Разработка приложений в визуальной среде Delphi на языке программирования Object Pascal

      Курсовая работа >> Информатика
      ... визуальной среде Delphi на языке программирования Object Pascal ... всё необходимое для написания, отладки, запуска ... , на ходу проектируя и видоизменяя их пользовательский интерфейс ... - подпрограмм, дополняющих основную программу. Использование подпрограмм не ...
    3. Язык программирования Delphi (Object Pascal)

      Конспект >> Информатика, программирование
      ... специальным образом написанный фрагмент кода, ... переменную. В языке Delphi каждая переменная перед использованием должна быть объявлена ... пользовательские варианты, которые фактически снимают ограничения на характер значений варианта. 16.2. Подпрограммы ...
    4. Основные понятия языка программирования Delphi

      Реферат >> Информатика, программирование
      ... подпрограмм, которые обеспечивают отображение на ... на русском или украинском языке. Программа, написанная на языке Delphi, ... Поэтому описание пользовательских идентификаторов, ... языке для совместимости со старыми версиями. Не рекомендуется к использованию ...
    5. Основы программирования на языке Си

      Реферат >> Информатика
      ... на языке Си++ и (4) Программирование для Microsoft Windows с использованием ... и Inprise Delphi), выбор их ... зуемых в подпрограмме, в начале этой подпрограммы. В ... (Определения констант и пользовательских типов) // ПРОТОТИП ... языку Си++, написанное авто- ром языка. ...

    Хочу больше похожих работ...