Поиск

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

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

Информатика, программирование->Курсовая работа
Презентация представляет собой сочетание компьютерной анимации, графики, видео, музыки и звукового ряда, которые организованы в единую среду. Как прав...полностью>>
Информатика, программирование->Другое
Методичні вказівки щодо організації самостійної роботи студентів при виконанні контрольних робіт та індивідуальних завдань по курсу «Організація баз д...полностью>>
Информатика, программирование->Лекция
Открытая система – под открытой системой понимается сетевое устройство, готовое взаимодействовать с другими сетевыми устройствами на основе стандартны...полностью>>
Информатика, программирование->Практическая работа
Текстовый процессор Word, мощная и удобная информацион­ная технология создания и обработки текстовых документов. Word позволяет создавать и редактиров...полностью>>

Главная > Лабораторная работа >Информатика, программирование

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

Введение

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

Технология программирования с использованием подпрограмм, разработанных пользователем, дает ряд преимуществ. Она обеспечивается возможность:

  • организовать работу нескольких программистов над одной программой с последующим объединением отдельно отлаженных и относительно независимых блоков в единое целое;

  • проводить отладку отдельных блоков и только после этого программы в целом;

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

  • упростить внесение изменений в программу, так как исправление ошибки в одном блоке не вызывает корректировку других блоков.

I. ЦЕЛЬ И СОДЕРЖАНИЕ РАБОТЫ

Цель лабораторной работы:

  • привитие практических навыков в написании и использовании пользовательских подпрограмм на языке Delphi.

Содержание работы:

1. Процедуры и функции, определенные пользователем.

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

Требования к отчету:

Отчет по работе должен содержать:

  • название лабораторного занятия, цель работы, порядок выполнения каждого пункта задания, выводы по каждому пункту задания;

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

II. МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

1. Процедуры и функции, определенные пользователем

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

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

Использование имени процедуры в программе называется оператором процедуры или вызовом процедуры. Имя процедуры нельзя использовать в выражениях в качестве операндов.

Функция аналогична процедуре, но имеется два отличия:

  1. функция передает в точку вызова скалярное значение (результат своей работы);

  2. имя функции можно включать в выражения как операнд.

Функция, если она встречается в выражении, называется указателем функции или обращением к функции.

Все процедуры и функции языка Delphi подразделяются на две группы: встроенные и определенные пользователем.

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

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

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

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

Процедуры и их использование

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

Подпрограмма реализуется в виде процедуры в двух случаях:

  • когда подпрограмма не возвращает в основную (вызывающую) программу никаких данных (например, вычерчивает график в диалоговом окне);

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

Если программист вводит собственную процедуру, то она должна быть полностью описана в разделе описаний программы.

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

В общем виде структура описания процедуры может иметь вид:

procedure Имя_процедуры(var Пар_1: Тип_1; ... var Пар_К: Тип_К);

// Заголовок процедуры

var

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

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

begin

// Раздел операторов (Тело_процедуры)

end;

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

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

Тело_процедуры – локальный блок, включающий операторы, которые реализуют заданный алгоритм. По структуре аналогичен программному блоку.

Например, заголовок процедуры имеет вид:

Procedure Sort(Var A: integer; Var B: real);

Procedure Kvadr(Alf,Bet: cardinal; Gam: boolean);

Procedure SunWed; // Алгоритм, реализованный процедурой,

// не требует формальных параметров

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

// Оператор вызова процедуры

Имя_процедуры(Список_фактических_параметров);

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

Если в описании процедуры перед именем параметра стоит слово var, то при вызове процедуры на месте соответствующего параметра должна стоять переменная основной программы. Использование константы или выражения считается ошибкой, и компилятор в этом случае выведет сообщение: Types of actual and formal var parameters must be identical (тип фактического параметра должен соответствовать типу формального параметра).

Для указанных выше примеров операторы вызова процедуры будут иметь вид:

Sort(A1,B1); // Параметры - значения переменных

Kvadr(14,25,True); // Параметры - непосредственно значения

SunMassiv; // Фактические параметры отсутствуют

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

Количество и тип формальных параметров должны быть равны количеству и типу фактических параметров.

Задание № 1. Процедура решения квадратного уравнения

  1. Разработайте консольное приложение, в котором используется процедура решения квадратного уравнения (ах2 + bх+ с = 0). У процедуры должно быть шесть параметров:

    • первые три предназначены для передачи в процедуру исходных данных — коэффициентов уравнения (a, b, c);

    • параметры x1 и х2 используются для возврата результата — корней уравнения;

    • параметр ok служит для передачи информации о том, что решение существует (True) или не существует (False).

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

program Kvadrat_Ur;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

a1,b1,c1: real;

k1,k2: real;

Rez: boolean;

// Описание процедуры решения квадратного уравнения

procedure SqRoot(a,b,c:real; var x1,x2:real; var ok:boolean);

// a,b,c - коэффициенты уравнения;

// x1,x2 - корни уравнения;

// ok = True - решение есть, ok = False - решения нет

var

d: real; // Дискриминант

begin

d:=Sqr(b)-4*a*c;

if d<0 then ok:=False // Уравнение не имеет решения

else

begin

ok:=True;

// Действительные корни уравнения

x1:=(-b+Sqrt(d))/(2*a);

x2:=(-b-Sqrt(d))/(2*a);

end;

end;

begin

writeln('Vvedite znachenia koefficientov a, b, c');

readln(a1,b1,c1);

Sqroot(a1,b1,c1,k1,k2,Rez); // Оператор обращения к процедуре

if Rez then

writeln('x1=',k1:10:5,' x2=',k2:10:5)

else writeln('Reshenia net');

readln

end.

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

  2. Проверьте решение задачи на двух наборах аргументов: (a=3, b=8, c=2) и (a=7, b=5, c=1). При отсутствии ошибок вы должны получить результаты, показанные на рис. 1.1.

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

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

Хотя набор встроенных функций языка 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), выбор их ... зуемых в подпрограмме, в начале этой подпрограммы. В ... (Определения констант и пользовательских типов) // ПРОТОТИП ... языку Си++, написанное авто- ром языка. ...

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