Программирование с использованием подпрограмм, практическая работа
Оценка 4.7

Программирование с использованием подпрограмм, практическая работа

Оценка 4.7
doc
15.02.2020
Программирование с использованием подпрограмм, практическая работа
Практическая работа. Программирование с использованием подпрограмм doc.doc

Практическая работа №6

                             Тема: «Программирование с использованием подпрограмм»

Цель:  Практическое закрепление программирования с использованием подпрограмм.

 

Теоретический минимум

В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпрограмм: процедуры и функции. Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа а и b. Требуется определить наибольший общий делитель трех величин: а + b, а2 + b2, а • b.

Запишем это так: НОД(а + b, а2 + b2, а • b).

Идея решения состоит в следующем математическом факте: если х, у, z — три натуральных числа, то НОД(х, y, z) = НОД(НОД(х, у), z). Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).

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

image

Приведем алгоритм решения поставленной задачи на учебном Алгоритмическом языке. Алгоритм состоит из процедуры «Евклид» и основного алгоритма «Задача», в котором присутствуют два обращения к процедуре:

image

Здесь М, N и К являются формальными параметрами процедуры. М и N — параметры-аргументы, К — параметр-результат.

imageПроцедуры в Паскале. Основное отличие процедур в Паскале от процедур в Алгоритмическом языке (АЯ) состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как решение поставленной задачи программируется на Паскале.

image

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

Procedure <имя процедуры> [(список формальных параметров)]; <блок>

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

Var <список переменных>: <тип>

Параметры-значения указываются так:

<список переменных>: <тип>

Чаще всего аргументы представляются как параметры-значения (хотя могут быть и параметрами-переменными). А для передачи результатов используются параметры-переменные. Процедура в качестве результата может передавать в вызывающую программу множество значений (в частном случае — одно), а может и ни одного. Теперь рассмотрим правила обращения к процедуре. Обращение к процедуре производится в форме оператора процедуры:

<имя процедуры>[(список фактических параметров)]

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

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

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

В рассмотренном нами примере формальные параметры М и N являются параметрами-значениями. Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выражений А + В и abs(A - В); второй раз — С и А*В. Параметр Кявляется параметром-переменной. В ней получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С. Через эту переменную основная программа получает результат.

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

image

Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: область действия описания.

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

В программе NOD1 переменные М, N, К являются локальными внутри процедуры; переменные А, В, С — глобальные. Однако внутри процедуры переменные А, В, С не используются. Связь между внешним блоком и процедурой осуществляется через параметры.

В программе N0D2 все переменные являются глобальными. В процедуре Evklid нет ни одной локальной переменной (нет и параметров). Переменные М и N, используемые в процедуре, получают свои значения через оператор присваивания в основном блоке программы и изменяют значения в подпрограмме. Результат получается в глобальной переменной К, значение которой выводится на экран. Здесь обмен значениями между основной программой и процедурой производится через глобальные переменные.

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

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

image

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

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

image

Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции результат присваивается идентификатору функцииEvklid:=M.

Обращение к функции является операндом в выражении. Оно записывается в следующей форме:

<имя функции> (<список фактических лараметров>)

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

По правилам стандарта Паскаля, возврат в вызывающую программу из подпрограммы происходит, когда выполнение подпрограммы доходит до ее конца (последний End). Однако в современных версиях Паскаля есть средство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit. Например, функцию определения большего из двух данных вещественных чисел можно описать так:

image

imageМодифицированный алгоритм Евклида. Подпрограмму алгоритма Евклида можно составить иначе, если воспользоваться операцией mod (получение остатка от деления), имеющейся в Паскале. Идея алгоритма исходит из справедливости следующих равенств:

image

В таком случае функцию Evklid можно переписать так:

image 

Задача 1.

Составьте программу нахождения наибольшего общего делителя трёх чисел, используя следующую формулу: НОД(A,B,C)=НОД(НОД(A,B),C).

 

Program progr1;

var a,b,c: longint;

function nod(a, b: longint): longint;

begin

while (a <> 0) and (b <> 0) do

begin

if a > b then a := a mod b else b := b mod a;

nod := a + b;

end;

end;

begin

read(a,b,c);

Writeln(nod(nod(a,b),c));

end.

 

Задача 2.

Вычислить площадь правильного шестиугольника со стороной "a", используя процедуру вычисления площади треугольника.

 

program progr2;

var a : integer;

S : real;

function SquareTr(a : integer) : real;

begin

SquareTr := (sqrt(3)*a)/2

end;

BEGIN

writeln('Введите сторону а шестиугольника: ');

ReadLn(a);

S := 6 * SquareTr(a);

Writeln('Площадь шестиугольника со стороной а, равна ', S:3:3);

END.

Задача 3.

Даны две дроби A/B и C/D (A,B,C,D-натуральные числа). Составить программу для умножения дроби на дробь. 

 

program test;

var

a,b,c,d:real;

begin

readln(a,b,c,d);

if (a>0) and (b>0) and (c>0) and (d>0) then

writeln((a/b)*(c/d));

end.

Задача 4.

По данной блок схеме составить и решить задачу.

 

 

 

 

 

 

 

 

 

 

Задача 5

Составить программу нахождения наибольшего общего делителя (НОД) и наименьшего общего кратного (НОК) двух натуральных чисел

image.

Использовать подпрограмму алгоритма Евклида для определения НОД.

 

Вопросы и задания

1. Для чего используются подпрограммы?

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

3. Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?

4. По координатам вершин треугольника вычислите его периметр, используя подпрограмму вычисления длины отрезка между двумя точками.

5. Даны три целых числа. Определите, у которого из них больше сумма цифр. Подсчет суммы цифр организуйте через подпрограмму. 


Практическая работа №6

Практическая работа №6

В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры

В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры

В программе NOD1 переменные

В программе NOD1 переменные

Модифицированный алгоритм Евклида

Модифицированный алгоритм Евклида

Задача 4. По данной блок схеме составить и решить задачу

Задача 4. По данной блок схеме составить и решить задачу
Скачать файл