Что такое подпрограмма. Программирование с использованием подпрограмм
Цель урока:
- дать учащимся представление о подпрограммах и возможностях их использования;
- показать на примерах механизм реализации подпрограмм с помощью процедур.
Задачи:
- Образовательные
:
- использовать специальные термины при ответе на вопросы
- формировать умение применять полученные знания в процессе создания и отладки программ
- Развивающие
:
- развивать внимание, наблюдательность, память, логическое мышление
- развивать умение анализировать и систематизировать необходимый для работы материал
- развивать навыки принимать решения самостоятельно
- Воспитательные
:
- соблюдать правила техники безопасности в кабинете информатики
- воспитывать культуру поведения, иметь свой взгляд на способ решения поставленной задачи, уметь выслушивать противоположную точку зрения
План
I. Повторение материала.
II. Изучение нового материала.
III. Итог урока.
IV. Домашнее задание.
ХОД УРОКА
I. Повторение материала
- Какова структура программы?
- Обязателен ли заголовок программы?
- Перечислите разделы описаний
- Какие служебные слова служат для описания переменных?
- Какое служебное слово является началом основной части программы?
- Как заканчивается программа?
PROGRAM ИМЯ; (можно не писать)
1. CONST
2. TYPE
3. VAR
4. PROCEDURE, FUNCTION
BEGIN
Тело программы
END.
А сейчас будем разгадывать КЛЮЧВОД, заполняя
его – повторим операторы, служебные слова языка
Паскаль (Приложение 1
).
(Заполненный КЛЮЧВОРД – Приложение
2
)
II. Изучение нового материала
При создании программы для решения сложной
задачи программисты выполняют разделение этой
задачи на подзадачи, подзадачи – на еще меньшие
подзадачи и так далее, до легко программируемых
элементарных задач. Со временем у каждого
программиста через некоторое время появляется
большой набор собственных заготовок,
неординарных решений и т. д., которые он хотел бы
использовать во всех своих творениях.
Язык программирования Pascal позволяет разделять
программу на отдельные части, которые называются
подпрограммами. Сам термин подпрограмма
говорит о том, что она подобна и подчинена
основной программе. Подпрограммы решают три
важные задачи, значительно облегчающие
программирование:
- избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т. е. сократить объем программы;
- улучшают структуру программы, облегчая понимание при разборе;
- уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным по следствиям при модификации.
Таким образом, подпрограмма
– это
повторяющаяся группа операторов, оформленная в
виде самостоятельной программной единицы. Она
записывается однократно, а в соответствующих
местах программы обеспечивается лишь обращение
к ней по имени.
Общие принципы выделения подпрограмм:
– если в программе необходимо переписывать
одни и те же последовательности команд, то стоит
эту последовательность команд оформить в виде
подпрограммы;
– слишком длинную программу полезно разбить на
составные части – подобно тому, как книгу
разбивают на главы. При этом
основная
программа становится похожей на оглавление;
– при решении задачи могут возникать слишком
сложные под задачи. Целесообразней отладить их
отдельно в небольших программах. Добавление
этих программ в основную задачу будет легким,
если они оформлены как подпрограммы;
– все, что вы сделали хорошо в одной программе,
вам захочется перенести в новые программы.
В языке Pascal механизм подпрограмм реализуется в виде ПРОЦЕДУР (PROCEDURE) и ФУНКЦИЙ (FUNCTION), которые вводятся в программу с помощью своего описания, но их структура такая же, как иструктура программы. Они различаются назначением и способом их использования.
Процедуры предназначены для выполнения
некоторой последовательности действий.
Чтобы использовать подпрограмму – процедуру её
надо описать и к ней надо уметь обращаться.
Описание:
- Выбрать для неё имя.
- Определить параметры.
- Составить последовательность действий, которые надо выполнять, для получения результата.
Обращение: вызов выполнения указанных действий, для конкретных значений параметров.
Параметры бывают следующих видов:
I. Глобальные
– параметры описываются в
головном модуле, доступны любой подпрограмме.
I. Локальные
– используются только в
процедуре, они могут быть или не быть,
описываются после слова VAR, с указанием типа.
II. Формальные
– описываются в заголовке
процедуры, к ним относятся входные и выходные
параметры.
III. Входные – это и IV. Параметры – значений
описываются через запятую с указанием типа. При
выходе из процедуры не сохраняются.
III. Выходные – это и IV. Параметры – переменные
описываются после слова VAR через запятую, с
указанием типа, при выходе из процедуры
сохраняются.
Эти параметры описываются в круглых скобках
после имени процедуры
II. Фактические – в головном модуле при вызове
процедуры.
При вызове (обращении) формальные параметры
заменяются на фактические.
Формальные и фактические должны совпадать по 3-м признакам:
- по количеству
- по типу
- по порядку следования.
Описание процедуры
Любая процедура начинается с заголовка, который является ее обязательной частью (в отличие от заголовка программы). Он состоит из служебного слова Procedure, за которым следует имя процедуры, а в круглых скобках – список формальных параметров. После заголовка могут идти те же разделы, что и в программе. Таким образом, общий вид будет следующим:
Рrосеdиге <имя>
(формальные параметры);
VAR (описание локальных параметров, они могут
быть или не быть)
begin
тело процедуры
end; (конец процедуры)
BEGIN (головного модуля)
Фактические параметры
END.
Используя подпрограмму – процедуру рассмотрим
несколько задач
1.Составить программу сложения 2-х чисел, значения вводятся с клавиатуры.
2. Составить программу нахождения максимального из четырёх чисел, вводимых с клавиатуры.
uses art;
var a,b,s,c,d:real;
procedure maxim (x,y: real; var s:real);
begin
if x
end;
begin
clrscr;
writeln("bbedite 4 chisla ");readln(a,b,c,d);
В переменную S заносим большее из двух чисел А и В.
maxim(a,b,s);
В переменную S заносим большее из двух чисел С и S.
maxim(c,s,s);
В переменную S заносим большее из двух чисел D и S.
maxim(d,s,s);}
writeln("max=",s:3:I);
readkey;
end.
Произвести отладку на компьютере.
III. Итак, мы познакомились с новым понятиям: подпрограмма, процедура. Узнали, какие параметры необходимо для работы с процедурами. Структуру процедуры. Описание.
IV. Домашнее задание
Треугольник задан координатами вершин, вычислить периметр, площадь. Вычисление длин сторон оформить с помощью процедуры.

– формула для подсчёта длины: A =
Какая функция в Паскале означает корень квадратный? – SQRT означает возведение в квадрат – SQR
– периметр находим по формуле Р = A + B + C
– формула для нахождения площади: S =
– сколько раз будем обращаться к процедуре? – 3
раза
Подпрограмма – относительно самостоятельная часть программы, имеющая свое имя и выполняющая определенные действия.
Подпрограммы повышают надежность и наглядность программ, т.к. позволяют разрабатывать и отлаживать каждый блок программы независимо (например, разными людьми).
Структура подпрограммы почти полностью повторяет структуру всей программы и состоит из следующих частей:
заголовок подпрограммы
раздел описаний
тело подпрограммы
В Паскаль имеются два вида подпрограмм – процедуры и функции . Они отличаются назначеием и способом их использования. Процедуры служат для выполнения определенной последовательности действий, направленных на изменение программной обстановки (изменение значений переменных, ввод/вывод данных и т.п.). Функции для вычисления значения выражения.
5.1 Процедуры
procedure <имя> (список формальных параметров);
<раздел описаний>;
begin
< тело процедуры >;
Пример 1: Процедура вычисления и вывода на экран куба числа.
procedure cub(x: real);
Указание имени процедуры в программе приводит к активизации процедуры и называется ее вызовом . Сразу после активизации процедуры начинают выполняться входящие в нее операторы. После выполнения последнего оператора процедуры управление передается в основную программу и далее выполняются операторы, следующие за вызовом процедуры. Процедура может вызываться в основной программе неоднократно.
Например:
Для обмена информацией между основной программой и процедурой используются параметры, которые придают процедуре универсальность.
Пример 2: Программа, выводящая на экран следующее:
var a,b: integer;
procedure Stars; {без параметров}
var i: integer;
for i:=1 to 9 do write(‘*’);
for a:=1 to 4 do
writeln(‘a=’,a,’ b=’,b);
Stars; {вызов процедуры Stars }
Пример 3:
var a,b: integer;
procedure Stroka(ch: char, n: integer);
var i: integer;
for i:=1 to n do write(ch);
Stroka(‘+’,4);
for a:=1 to 3 do
writeln(‘a=’,a,’ b=’,b);
Stroka(‘*’,8);
Разберем вызов процедуры Stroka(‘*’,8): ‘*’ и 8 – фактические параметры (т.е. те, которые указаны в скобках после имени процедуры при ее вызове), они присваиваются при вызове формальным параметрам ch и n (т.е. тем, которые указаны в скобках после имени процедуры при ее описании).
Замечание: количество, порядок и тип параметров при вызове процедуры должны совпадать с количеством, порядком и типом параметров, заданным при описании процедуры.
Результат на экране :
При решении новых задач можно попытаться воспользоваться ранее написанными программами. Алгоритм, ранее разработанный и целиком используемый в составе других алгоритмов, называется вспомогательным. Применение вспомогательных алгоритмов позволяет разбить задачу на части, структурировать ее.
Вся программа условно может быть разделена на две части: основную и вспомогательную. В основной части производится простейшая обработка информации, организуется обращение к разным вспомогательным модулям (подпрограммам).
Вспомогательный алгоритм тоже может вызывать другие вспомогательные, длина такой цепочки вызовов теоретически не ограничена. Здесь и далее следующие пары слов используются как синонимы: алгоритм и программа, вспомогательный алгоритм и подпрограмма, команда и оператор, программа и модуль. Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу.
При использовании вспомогательных алгоритмов необходимо учитывать способ передачи значений исходных данных для них и получения результата от них. Аргументы вспомогательного алгоритма - это переменные, в которых должны быть помещены исходные данные для решения соответствующей подзадачи. Результаты вспомогательного алгоритма - это также переменные, где содержаться результаты решения этих подзадач, а также результатом может быть конкретное действие, которое совершает компьютер под действием подпрограммы.
Подпрограммы могут быть двух видов: подпрограмма без параметров и подпрограмма с параметрами. Обращение к подпрограмме может быть организовано из любого места основной программы или другой подпрограммы сколько угодно раз.
При работе с подпрограммами важными являются понятия формальных и фактических параметров. Формальные параметры - это идентификаторы входных данных для подпрограммы. Если формальные параметры получают конкретные значения, то они называются фактическими. Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи фактических параметров должны быть такими же, как и формальных параметров. В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме из основной, а формальные параметры - только в самом модуле.
Подпрограмма с параметрами используется для записи многократно повторяющихся действий при разных исходных данных. Подпрограммы с параметрами можно разделить на два типа: подпрограммы-функции и просто подпрограммы с параметрами (их называют процедурами).
При составлении подпрограмм с параметрами надо соблюдать следующие правила:
1) каждая подпрограмма имеет свое имя и список формальных параметров;
2) процедура из основной программы вызывается командой вызова, которая по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.
Пример 1. Используем алгоритм нахождения наибольшего общего делителя двух натуральных чисел в качестве вспомогательного при решении задачи: составить программу вычитания дробей (a, b, c, d - натуральные числа). Результат представить в виде обыкновенной несократимой дроби.
Подпрограмма.
1) Ввести натуральные числа M, N.
2) Если M=N, перейти к п. 5, иначе к следующему пункту.
3) Если M>N, то M:=M-N, иначе N:=N-M.
4) Перейти к п. 2.
5) Передать значение M в основную программу.
6) Конец подпрограммы.
Основная программа.
1) Ввести значения A, B, C, D.
2) E:=A*D - B*C.
4) Если E=0, вывести значение E и перейти к п. 9, иначе перейти к следующему пункту.
5) M:=|E|, N:=F, перейти к подпрограмме вычисления НОД.
7) E и F нацело разделить на G.
8) Вывести значения E и F на печать.
9) Конецпрограммы.
Var A, B, C, D, G, E, F: Integer;
Procedure Nod(M, N: Integer; Var K: Integer);
While M <> N Do
If M >
Write("Введите числители и знаменатели дробей:");
ReadLn(A, B, C, D);
E:= A * D - B * C;
If E = 0 Then WriteLn(E)
Nod(Abs(E), F, G);
WriteLn("Ответ: ", E, "/", F)
Как видно из примера, объявление и тело подпрограмм находится в разделе описаний. В заголовке подпрограммы содержится список формальных параметров с указанием их типа, которые условно можно разделить на входные и выходные (перед ними стоит служебное Var). При обращении к процедуре указывается ее имя и список фактических параметров. Формальные и фактические параметры должны соответствовать по количеству и по типу.
Вызов процедуры осуществляется следующим образом:
<Идентификатор (имя) процедуры>(<список фактических параметров>);
Например,
Nod(Abs(E), F, G);
По способу передачи фактических значений в подпрограмму в Turbo Pascal 7.0 выделяют параметры-переменные, параметры-значения, параметры-константы и массивы открытого типа, строки открытого типа, параметры-процедуры, параметры-функции (подробности - в литературе).
Функция (в отличие от процедуры) всегда возвращает единственное значение.
Покажем, как изменится подпрограмма из примера, если ее записать в виде функции.
Function Nod(M, N: Integer) : Integer;
While M <> N Do
If M > N Then M:= M - N Else N:= N - M;
Итак, после списка параметров указывается тип значения функции, а в теле функции хотя бы один раз встречается присваивание переменной, имя которой совпадает с именем функции, соотответствующего значения.
Вызов функции будет следующим:
G:= Nod(Abs(E), F);
Вообще, вызов функции может присутствовать в выражении, стоящем: в правой части оператора присваивания, в процедуре вывода, в качестве фактического параметра в вызове другой подпрограммы и т.д.
При решении задач целесообразно проанализировать условие, записать решение в крупных блоках (не являющихся операторами Pascal), детализировать каждый из блоков (записав в виде блоков, возможно, по-прежнему не операторов Pascal), и т.д., продолжать до тех пор, пока каждый из блоков не будет реализован с помощью операторов языка.
Пример 2. Дано натуральное число n. Переставить местами первую и последнюю цифры этого числа.
If Impossible(N)
Then WriteLn("Невозможно переставить цифры, возникнет переполнение")
WriteLn("Ответ: ", N)
Можно заметить, что необходимо детализировать логическую функцию Impossible, которая диагностирует, возможна ли перестановка, и процедуру Change, которая эту перестановку (в случае, если она возможна) выполняет.
Function Impossible(N: Integer) : Boolean;
If Number(N) < 5
Then Impossible:= False
Else Impossible:= (N Mod 10 > 3) Or
(N Mod 10 = 3) And
(N Mod 10000 Div 10 * 10 + N Div 10000 > MaxInt Mod 10000)
Здесь необходимо детализировать функцию Number, возвращающую количество цифр в записи натурального числа (т.к. функция Impossible содержит ее вызов, то в разделе описаний функция Number должна ей предшествовать).
Function Number(N: Integer) : Integer;
Var Vsp: Integer;
While N > 0 Do
Vsp:= Vsp + 1; N:= N Div 10
Наконец, последняя процедура.
Procedure Change(Var N: Integer);
Var Kol, P, S, R: Integer;
Kol:= Number(N);
P:= N Mod 10; {последняяцифра}
If Kol > 1 Then
S:= N Div Round(Exp((Kol - 1) * Ln(10)))
Else S:= 0; {перваяцифра}
R:= N Mod Round(Exp((Kol - 1) * Ln(10))) Div 10;
N:= P * Round(Exp((Kol - 1) * Ln(10))) + R * 10 + S
Возможны также подпрограммы, которые вызывают сами себя. Они называются рекурсивными. Создание таких подпрограмм является красивым приемом программирования, но не всегда целесообразно из-за чрезмерного расхода памяти ЭВМ.
Пример 3. Найти максимальную цифру в записи данного натурального числа.
Program MaxDigit;
Type NaturLong = 1..(High(LongInt));
Function Maximum(N: LongInt) : Digit;
Then Maximum:= N
Else If N Mod 10 > Maximum(N Div 10)
Then Maximum:= N mod 10
Else Maximum:= Maximum(N Div 10)
Write("Введите натуральное число: ");
WriteLn("Максимальнаяцифраравна ", Maximum(A))
При создании функции Maximum было использовано следующее соображение: если число состоит из одной цифры, то она является максимальной, иначе если последняя цифра не является максимальной, то ее следует искать среди других цифр числа. При написании рекурсивного алгоритма следует позаботиться о граничном условии, когда цепочка рекурсивных вызовов обрывается и начинается ее обратное «раскручивание». В нашем примере это условие N < 10.
Более подробно о рекурсии говорится в следующей статье.
| Подпрограммы. Практикум. Практическая работа № 3.5 "Программирование с использованием подпрограмм"
Уроки 45 - 47
Подпрограммы
Практикум
Практическая работа № 3.5
"Программирование с использованием подпрограмм"
![]() |
![]() |
|
![]() |
![]() |
![]() |
Вспомогательные алгоритмы и подпрограммы
Еще одним важнейшим методологическим приемом структурного программирования является декомпозиция решаемой задачи на подзадачи - более простые, с точки зрения программирования, части исходной задачи. Алгоритмы решения таких подзадач называются вспомогательными алгоритмами .
В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпрограмм: процедуры и функции. Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа а и b . Требуется определить наибольший общий делитель трех величин: а + b, а 2 + b 2 , а b.
Запишем это так: НОД(а + b, а 2 + b 2 , а b).
Идея решения состоит в следующем математическом факте: если х, у, z - три натуральных числа, то НОД(х, y, z ) = НОД(НОД(х, у ), z ). Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).
Очевидно, что вспомогательным алгоритмом для решения поставленной задачи является алгоритм получения наибольшего общего делителя двух чисел. Эта задача решается с помощью алгоритма Евклида, который подробно обсуждался в 9 классе. Напомним, что идея алгоритма Евклида основана на следующей формуле:

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

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

В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры . Описание процедуры на Паскале имеет следующий формат:
Procedure <имя процедуры> [(список формальных параметров)]; <блок>
Квадратные скобки указывают на то, что список формальных параметров может отсутствовать, т. е. возможна процедура без параметров. Параметры могут быть параметрами-переменными и параметрами-значениями. Параметры-переменные записываются следующим образом:
Var <список переменных>: <тип>
Параметры-значения указываются так:
<список переменных>: <тип>
Чаще всего аргументы представляются как параметры-значения (хотя могут быть и параметрами-переменными). А для передачи результатов используются параметры-переменные. Процедура в качестве результата может передавать в вызывающую программу множество значений (в частном случае - одно), а может и ни одного. Теперь рассмотрим правила обращения к процедуре. Обращение к процедуре производится в форме оператора процедуры :
<имя процедуры>[(список фактических параметров)]
Если описана процедура с формальными параметрами, то обращение к ней производится оператором процедуры с фактическими параметрами. Правила соответствия между формальными и фактическими параметрами: соответствие по количеству , соответствие по последовательности и соответствие по типам .
Взаимодействие формальных и фактических параметров через параметры-переменные называется передачей по ссылке: при обращении к процедуре ей передается ссылка на переменную, заданную в качестве фактического параметра. Эта ссылка и используется процедурой для доступа к этой переменной.
Другой вариант взаимодействия формальных и фактических параметров называется передачей по значению: вычисляется значение фактического параметра (выражения), и это значение присваивается соответствующему формальному параметру.
В рассмотренном нами примере формальные параметры М и N являются параметрами-значениями. Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выражений А + В и abs(A - В) ; второй раз - С и А*В . Параметр К является параметром-переменной. В ней получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С . Через эту переменную основная программа получает результат.
Теперь рассмотрим другой вариант программы, решающей ту же задачу. В ней используется процедура без параметров.

Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: область действия описания .
Областью действия описания любого программного объекта (переменной, типа, константы и т. д.) является тот блок, на который это описание распространяется. Если данный блок вложен в другой (подпрограмма), то присутствующие во вложенном блоке описания являются локальными . Они действуют только в пределах внутреннего блока. Описания же, расположенные во внешнем блоке, называются глобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание.
В программе NOD1 переменные М, N, К являются локальными внутри процедуры; переменные А, В, С - глобальные. Однако внутри процедуры переменные А, В, С не используются. Связь между внешним блоком и процедурой осуществляется через параметры.
В программе N0D2 все переменные являются глобальными. В процедуре Evklid нет ни одной локальной переменной (нет и параметров). Переменные М и N , используемые в процедуре, получают свои значения через оператор присваивания в основном блоке программы и изменяют значения в подпрограмме. Результат получается в глобальной переменной К , значение которой выводится на экран. Здесь обмен значениями между основной программой и процедурой производится через глобальные переменные .
Использование механизма передачи через параметры делает процедуру более универсальной, независимой от основной программы. Однако в некоторых случаях оказывается удобнее использовать передачу через глобальные переменные. Чаще такое бывает с процедурами, работающими с большими объемами информации. В этой ситуации глобальное взаимодействие экономит память компьютера.
Функции. Теперь выясним, что такое подпрограмма - функция. Обычно функция используется в том случае, когда результатом работы подпрограммы должна быть скалярная (простая) величина. Тип результата называется типом функции . Формат описания функции следующий:
Как и у процедуры, у функции в списке формальных параметров могут присутствовать параметры-переменные и параметры-значения. Всё это - аргументы функции . Параметры вообще могут отсутствовать, если аргументы передаются глобально.
Программа решения рассмотренной выше задачи с использованием функции будет выглядеть следующим образом:

Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции результат присваивается идентификатору функции : Evklid:=M .
Обращение к функции является операндом в выражении. Оно записывается в следующей форме:
<имя функции> (<список фактических лараметров>)
Правила соответствия между формальными и фактическими параметрами все те же. Сравнивая приведенные выше программы, можно сделать вывод, что программа N0D3 имеет определенные преимущества перед другими. Функция позволяет получить результат путем выполнения одного оператора присваивания. Здесь также иллюстрируется возможность того, что фактическим аргументом при обращении к функции может быть эта же функция.
По правилам стандарта Паскаля, возврат в вызывающую программу из подпрограммы происходит, когда выполнение подпрограммы доходит до ее конца (последний End ). Однако в современных версиях Паскаля есть средство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit . Например, функцию определения большего из двух данных вещественных чисел можно описать так:

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


Вопросы и задания
1. Для чего используются подпрограммы?
2. В чем различие между процедурами и функциями?
3. Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?
4. Составьте программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя подпрограмму вычисления площади круга (два варианта: с процедурой и с функцией).
5. Составьте программу сложения двух простых дробей. Результат должен быть несократимой дробью. Используйте подпрограмму вычисления НОД по алгоритму Евклида. Простая дробь задается двумя целыми числами: числителем и знаменателем.
6. По координатам вершин треугольника вычислите его периметр, используя подпрограмму вычисления длины отрезка между двумя точками.
7. Даны три целых числа. Определите, у которого из них больше сумма цифр. Подсчет суммы цифр организуйте через подпрограмму.
Практикум
Работа 3.5. Программирование с использованием подпрограмм
Задание 1
Для решения всех задач сделать два варианта программы: с реализацией указанной подпрограммы в виде функции и в виде процедуры.
Уровень 1
1. Составить программу нахождения наибольшего общего делителя (НОД) и наименьшего общего кратного (НОК) двух натуральных чисел
.
Использовать подпрограмму алгоритма Евклида для определения НОД.
2. Вычислить площадь правильного шестиугольника со стороной а , используя подпрограмму вычисления площади треугольника.
3. Даны две дроби - (А, В, С, D - натуральные числа).
Составить программу деления дроби на дробь. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.
4. Даны две дроби - (А, В, С, D - натуральные числа).
Составить программу умножения дроби на дробь. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.
5. Даны две дроби - (А, В, С, D - натуральные числа).
Составить программу вычитания из первой дроби второй. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.
6. Написать программу вычисления суммы - для заданного числа n . Результат представить в виде несократимой дроби (р, q - натуральные). Использовать подпрограммы алгоритма Евклида для определения НОД и сложения двух простых дробей.
7. Даны числа X, Y, Z, Т
- длины сторон четырехугольника. Вычислить его площадь, если угол между сторонами длиной X
и Y
- прямой. Использовать две подпрограммы для вычисления площадей: прямоугольного треугольника и прямоугольника.
Задание 2
Для всех задач выделить подзадачи, решения которых могут быть реализованы через подпрограммы. Выбрать наиболее удобный вариант подпрограммы: функцию или процедуру. Составить программу решения задачи.
Уровень 2
1. Дано простое число. Найти следующее за ним простое число.
2. Для заданного натурального числа п найти наименьший нечетный натуральный делитель k (k ≠ 1) .
3. Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (например, дано число 156, нужно получить 651).
4. Найти все натуральные числа, не превосходящие заданного п, которые делятся на каждую из своих цифр.
5. Имеется часть катушки с автобусными билетами. Номер билета шестизначный. Составить программу, определяющую количество счастливых билетов на катушке, если меньший номер билета - N , больший - М (билет является счастливым, если сумма первых трех его цифр равна сумме последних трех).
6. Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т. д. Через сколько таких действий получится нуль?
7. На отрезке (2 10 < N < 2 31 ) найти количество чисел, составленных из цифр а, b, с .
8. Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234,5789).
Уровень 3
9. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (например, 41 и 43). Напечатать все пары «близнецов» из отрезка , где n - заданное натуральное число, большее 2.
10. Дано четное число n > 2. Проверить для него гипотезу Гольдбаха: каждое четное п представляется в виде суммы двух простых чисел.
11. Составить программу разложения данного натурального числа на простые множители. Например, 200 = 2 3 . 5 2 .
12. Дано натуральное число n. Найти все меньшие п числа Мерсенна. (Простое число называется числом Мерсенна, если оно может быть представлено в виде 2 p - 1, где р - тоже простое число. Например, 31 = 2 5 - 1 - число Мерсенна.)
13. Два натуральных числа называются «дружественными», если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284). Найти все пары «дружественных» чисел, которые не больше данного числа N .
14. Натуральное число, в записи которого n цифр, называется числом Армстронга, если сумма его цифр, возведенная в степень n , равна самому числу. Найти все числа Армстронга от 1 до k .
15. Найти все простые натуральные числа, не превосходящие n , двоичная запись которых представляет собой палиндром, т. е. читается одинаково слева направо и справа налево.
16. Составить программу для нахождения чисел из интервала [М, N] , имеющих наибольшее количество делителей.
17 Дано натуральное число n > 1. Определить длину периода десятичной записи дроби 1/n.
понятие подпрограмм процедуры и функции
В ТУРБО ПАСКАЛЕ различают два вида подпрограмм - это процедуры и функции . Процедура и функция - это именованная последовательность описаний и операторов. Так же использование процедур и функций необходимо тогда, когда имеется возможность использовать некоторые фрагменты уже разработанных ранее алгоритмов. Кроме того, подпрограммы применяются для разбиения крупных программ на отдельные смысловые части в соответствии с модульным принципом в программировании. Процедура - это независимая именованная часть программы, которую можно вызвать по имени для выполнения определённой в ней последовательности действий. Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки. В ПАСКАЛЬ, существуют стандартные процедуры: read, readln, write, writeln. Таким образом, концепция процедуры расширяет понятие оператора в языке ПАСКАЛЬ. Функция отличается от процедуры тем, что возвращает результат указанного при её описании типа. Вызов функции может осуществляться из выражения, где имя функции используется в качестве оператора. Функции являются частным случаем процедур, и обязательно возвращают в точку вызова результат как значение имени этой функции. При использовании функций необходимо учитывать совместимость типов в выражениях. В ПАСКАЛЬ, существует ряд стандартных функций, известных любой программе: sin, cos, eof, а также и другие функции из таблицы №3. Таким образом, концепция функции расширяет понятие выражения в языке ПАСКАЛЯ.
Локальные и глобальные переменныеНапомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (procedure…, function…, program… ) и блока.
Если блок какой-либо процедуры p1 содержит внутри процедуру p2, то говорят, что p2 вложена в p1.
procedure p1(x: real; var y: real);
procedure p2(var z: real);
…………………….
…………………….
Любые идентификаторы, введенные внутри какого-либо блока (процедуры, функции) для описания переменных, констант, типов, процедур, называются локальными для данного блока. Такой блок вместе с вложенными в него модулями называют областью действия этих локальных переменных, констант, типов и процедур.
var y1, y2: real;
var a, b, c, d: real;
{ Переменные a, b, c, d являются локальными для sq1,
область их действия – процедура sq1 }
……………………………………
{ Переменные y1, y2 - нелокальные для sq1,
область их действия – t1 и sq1 }
Константы, переменные, типы, описанные в блоке program, называются глобальными . Казалось бы, проще иметь дело вообще только с глобальными переменными, описав их все в program. Но использование локальных переменных позволяет системе лучше оптимизировать программы, делать их более наглядными и уменьшает вероятность появления ошибок.




