ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 70
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Рязанский станкостроительный колледж РГРТУ
Основы алгоритмизации и
программирования
Тема 5. Модульное программирование.
Функции.
Рязань 2020
Юдаев А.Н. Основы алгоритмизации и программирования
2
Оглавление
Функции ....................................................................................................................................... 3
Общие сведения .................................................................................................................. 3
Структура подпрограммы ................................................................................................ 3
Формальные и фактические параметры ................................................................... 5
Локальные и глобальные переменные ..................................................................... 5
Обмен данными между программой и функциями .............................................. 5
Возврат значения и завершение работы функции ............................................. 6
Параметры со значениями по умолчанию (необязательные параметры) 7
Перегрузка функций.......................................................................................................... 8
Практическая работа №14. .......................................................................................... 11
Юдаев А.Н. Основы алгоритмизации и программирования
3
Функции
Общие сведения
Наряду со стандартными функциями пользователь может организовать свои собственные функции, которые в общем смысле можно называть подпрограммами.
Подпрограмма – это именованная часть программы, которая вызывается, получает параметры (аргументы), выполняет определённые действия и возвращает управление в точку вызова, возвращая полученный результат.
Вызов подпрограммы (или обращение к подпрограмме, или активизация подпрограммы) – это скачок по программному коду: если в тексте программы встречается обращение к подпрограмме, то выполнение текущей программы приостанавливается, осуществляется переход на код подпрограммы, выполняются её операторы, а затем осуществляется возврат в текущую программу в точку вызова.
Параметры подпрограммы – это величины, имеющие смысл входных и выходных данных, т.е. это исходные данные, получаемые подпрограммой, и результаты вычислений, возвращаемые в вызвавшую программу.
Подпрограммы описываются до описания главной функции или описываются в отдельном классе. Подпрограмма, используемая другой подпрограммой, должна описываться ранее (до того, как она будет использована в другой подпрограмме).
Структура подпрограммы
Структура любой подпрограммы (функции) аналогична структуре программы т.е. ее главной функции. Она имеет: 1) заголовок; 2) Описание переменных и операторы.
Обратим внимание на тот факт, что внутри подпрограммы могут размещаться другие подпрограммы. Уровень вложения синтаксически не ограничен.
Синтаксическая форма функции имеет следующий вид:
[модификаторы] тип_результата имя_функции([список_параметров])
{
объявления переменных;
операторы;
return результат;
}
где:
Модификаторы — модификатор доступа к функции. В данном случае нужно указать static, чтобы можно было использовать функцию сразу без создания объекта этого класса.
Тип_результата — (int, double, void) тип результата ответа возвращаемого при использовании функции.
Список_параметров – Имена входных и выходных переменных (аргументов), используемых в функции.
Объявления переменных – Имена локальных переменных, используемых в функции.
Операторы — некоторые операторы и выражения, содержащиеся внутри функции и выполняющиеся каждый раз при вызове функции. Внутри операторов мы можем обращаться к локальным переменным, объявленным внутри функции; а также к аргументам функции.
return результат — оператор, останавливающий работу функции и возвращающий указанный результат в качестве её значения (при этом тип
Юдаев А.Н. Основы алгоритмизации и программирования
4
результата должен соответствовать типу результата в объявлении функции).
Наличие этого оператора обязательно для функции, возвращающей значение.
Для функции, объявленной как void этот оператор необязателен, но можно вызывать оператор return без аргументов, это досрочно завершит функцию, иначе — будут выполнены все действия до конца блока описания функции.
Пример 1.
Формулировка задачи:
Создадим и используем функции для сложения 2 чисел.
Методика решения задачи:
В данном случае т.к. результат функции один, то функция описывается и используется как классическая функция типа y=sin(x).
Решение:
Исходные данные: Два операнда x, y.
Результат: Сумма 2 двух значений.
Код программы:
Юдаев А.Н. Основы алгоритмизации и программирования
5
Формальные и фактические параметры
Формальные параметры используются при описании параметров (аргументов) функции. В примере 1 – это параметры value1 и value2. Они задаются некоторыми уникальными именами и внутри функции доступны как локальные переменные.
Фактические параметры используются в основной программе. Они используются при вызове функции на месте формальных параметров. В момент вызова функции значения фактических параметров присваиваются формальным параметрам.
Соответственно, имена формальных и фактических параметров могут совпадать, а могут не совпадать. В примере 1 – это параметры zn1 и zn2.
Локальные и глобальные переменные
Локальная переменная - переменная, объявленная внутри какой-либо функции или блока. Областью видимости локальных переменных является тело функции или блока, в которой эта переменная объявлена.
Глобальная переменная - переменная, объявленная за пределами всех функций или блоков. Областью видимости глобальных переменных является вся программа.
Обмен данными между программой и функциями
При описании функции указываются формальные параметры, которые указывают, с какими величинами следует обращаться к этой функции. Заголовок функции определяет количество параметров, их последовательность и типы.
Параметры, используемые в функции, могут быть трех видов:
1. Входные параметры (например: int value), используются для входных данных.
Передаются основной программой в функцию через стек в виде их копий и, следовательно, внутри функции параметр может изменяться, но фактический параметр функцией измениться не может.
В качестве фактического параметра на месте входного параметра при вызове функции может выступать любое выражение совместимого для присваивания типа, переменная или константа.
2. Входные параметры. Модификатор in (например: in int value), используются для входных данных.
Передаются основной программой в функцию по ссылке, внутри функции значение параметра изменить будет нельзя.
Обычно используется, если переменная имеет большой размер (массив, запись и т.д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать через ссылку с защитой от его изменения
3. Выходные параметры. Модификатор out (например: out int result), используются для выходных данных.
Обратите внимание, что функции, использующие такие параметры, обязательно должны присваивать им определенное значение.
При использовании ключевое слово out используется как при определении функции, так и при её вызове.
При вызове функции на месте выходного параметра в качестве фактического параметра должна использоваться переменная идентичного типа.
4. Передача параметров по ссылке. Модификатор ref (например: ref int valueA), используются для полного управления передаваемых параметров.
Юдаев А.Н. Основы алгоритмизации и программирования
6
При передаче через ссылку функция получает значение, передаваемое через фактический параметр, а также возвращает в фактический параметр внесенные изменения, т.е. может играть роль входного/ выходного параметра.
При использовании ключевое слово ref используется как при определении функции, так и при её вызове.
При вызове функции на месте параметра в качестве фактического параметра должна использоваться переменная идентичного типа.
Возврат значения и завершение работы функции
Для завершения работы функции может и должна использоваться инструкция
return. Она завершает выполнение функции. После этого управление возвращается той функции, из которой была вызвана данная. Инструкция return может употребляться в двух формах:
return;
return выражение;
Первая форма используется в функциях, для которых типом возвращаемого значения является void. Использовать return в таких случаях обязательно, если нужно принудительно завершить работу. Такое применение return напоминает инструкцию
break.
Во второй форме инструкции return указывается то значение, которое функция должна вернуть. Это значение может быть сколь угодно сложным выражением, даже содержать вызов функции. В функции, не объявленная с void в качестве типа возвращаемого значения, обязательно использовать вторую форму return, иначе произойдет ошибка компиляции.
Пример 2
Даны стороны прямоугольника, найти площадь и периметр.
Выбор метода решения:
В данном случае т.к. результатов функции два, то возврат значений функции происходит через аргументы функции PlPer(x, y, Pl, Per).
Решение:
Исходные данные: Два операнда x, y стороны прямоугольника.
Результат: pl - площадь per - периметр
Юдаев А.Н. Основы алгоритмизации и программирования
7
Код программы
Параметры
со
значениями
по
умолчанию
(необязательные
параметры)
Для ряда параметров функции на этапе её создания могут быть указаны значения по умолчанию, эти значения будут автоматически подставляться, если при вызове явно не было задано значение параметров.
Параметры по умолчанию удобно использовать, когда для функции заранее ясно, с какими параметрами её будут вызывать чаще всего.
int pow(int a, int p = 2) {
...
}
Теперь можно вызывать функцию, не указывая последнего параметра:
cout << pow(5); // 25
Что равносильно вызову:
cout << pow(5,2); // 25
Юдаев А.Н. Основы алгоритмизации и программирования
8
Перегрузка функций
Уникальность функции определяется не только её именем, но и набором её параметров и типом возвращаемого значения. C# позволяет создавать функцию с именем ранее существовавшей при условии, что у новой функции будет иной набор параметров.
Таким образом, перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.
Например, нам нужно складывать два числа, а числа бывают целые и вещественные, следовательно, нам нужно иметь две разные функции для разных типов чисел типа
SumInt и SumDouble. Перегрузка позволяет иметь две функции с одним названием Sum для сложения, как целых, так и вещественных чисел, см. пример ниже. int
Sum(
int value1
, int value2
){ int rez; rez = value1
+ value2
; return rez;
} double
Sum(
double value1
, double value2
){ double rez; rez = value1
+ value2
; return rez;
}
Пример 3
Описать функцию DigitCoun5(K, C, P), находящую количество C цифр целого положительного числа K, а количество цифр пять P (K — входной, C и P — выходные параметры целого типа). С помощью этой процедуры найти количество цифр и количество цифр пять для каждого из пяти данных целых чисел.
Выбор метода решения:
От целого числа с конца отделяем по одной цифре и считаем их количество.
Одновременно с этим проверяем отделенные цифры, определяя из них цифры 5, и считаем их количество. Процесс продолжаем до тех пор, пока в исходном числе есть цифры. Для отделения цифр с конца числа используем операции деления / и %.
Распишем эти действия более подробно.
1. В этой задаче имеем один входной и два выходных параметров. Входной параметр описываем как параметр значение, выходные как параметры-переменные.
2. Алгоритм процедуры будет следующим (процедуру назовем DigitCoun5):
3. Пока число содержит цифры While (k <> 0) do.
4. Получаем цифру с конца Num=k % 10.
5. Если это цифра 5 увеличиваем счетчик цифр 5 If Num = 5 тогда P=P+1.
6. Увеличиваем общий счетчик цифр C=C+1;
7. Убираем цифру с конца числа k=k / 10;
Юдаев А.Н. Основы алгоритмизации и программирования
9
Блок-схема алгоритма
Начало
Ввод Mas[i]
P=P+1
Вывод Mas[i]
Конец
Цикл 1
K <>0
Цикл 1
Mum=5
K:=k / 10
да нет
Определяем кол- во цифр в числе
DigitCoun5
(Mas[i],Kol,Kol5)
DigitCoun5
(K,C,P)
Конец DigitCoun5
Основная программа
Подпрограмма DigitCoun5
Цикл 1
i=1(1)5
Вывод Kol,
Kol5
Цикл 1
Num=k % 10
C=0;P=0
C=C+1
Юдаев А.Н. Основы алгоритмизации и программирования
10
Код программы
Юдаев А.Н. Основы алгоритмизации и программирования
11
Практическая работа №14.
Организация функций
Задание №1. Составьте алгоритм и программу по заданию.
1. Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения: –1, если X < 0; 0, если X = 0; 1, если X > 0. С помощью этой функции найти значение выражения Sign(A) + Sign(B) для данных вещественны чисел A и
B.
2. Описать функцию RootsCount(A, B, C) целого типа, определяющую количество корней квадратного уравнения A·x
2
+ B·x + C = 0 (A, B, C — вещественные параметры, A
. 0). С ее помощью найти количество корней для каждого из трех квадратных уравнений с данными коэффициентами. Количество корней определять по значению дискриминанта:
D = B
2
– 4·A·C.
3. Описать функцию CircleS(R) вещественного типа, находящую площадь круга радиуса R (R — вещественное). С помощью этой функции найти площади трех кругов с данными радиусами. Площадь круга радиуса R вычисляется по формуле S = 3.14·R
2
. В качестве значения использовать 3.14.
4. Описать функцию RingS(R1, R2) вещественного типа, находящую площадь кольца, заключенного между двумя окружностями с общим центром и радиусами R1 и R2
(R1 и R2 — вещественные, R1 > R2). С ее помощью найти площади трех колец, для которых даны внешние и внутренние радиусы. Воспользоваться формулой площади круга радиуса R: S = 3.14·R
2
. В качестве значения . использовать 3.14.
5. Описать функцию TriangleP(a, h), находящую периметр равнобедренного треугольника по его основанию a и высоте h, проведенной к основанию (a и h — вещественные). С помощью этой функции найти периметры трех треугольников, для которых даны основания и высоты. Для нахождения боковой стороны b треугольника использовать теорему Пифагора: b
2
= (a/2)
2
+ h
2 6. Описать функцию SumRange(A, B) целого типа, находящую сумму всех целых чисел от A до B включительно (A и B — целые). Если A > B, то функция возвращает 0. С помощью этой функции найти суммы чисел от A до B и от B до C, если даны числа A, B,
C.
7. Описать функцию Calc(A, B, Op) вещественного типа, выполняющую над ненулевыми вещественными числами A и B одну из арифметических операций и возвращающую ее результат. Вид операции определяется целым параметром Op: 1 — вычитание, 2 — умножение, 3 — деление, остальные значения — сложение. С помощью
Calc выполнить для данных A и B операции, определяемые данными целыми N1, N2, N3.
8. Описать функцию Quarter(x, y) целого типа, определяющую номер координатной четверти, в которой находится точка с ненулевыми вещественными координатами (x, y). С помощью этой функции найти номера координатных четвертей для трех точек с данными ненулевыми координатами.
9. Описать функцию Even(K) логического типа, возвращающую True, если целый параметр K является четным, и False в противном случае. С ее помощью найти количество четных чисел в наборе из 10 целых чисел.
10.
Описать функцию IsSquare(K) логического типа, возвращающую True, если целый параметр K (> 0) является квадратом некоторого целого числа, и False в противном случае. С ее помощью найти количество квадратов в набореиз 10 целых положительных чисел.
11.
Описать функцию IsPower5(K) логического типа, возвращающую True, если целый параметр K (> 0) является степенью числа 5, и False в противном случае. С ее помощью найти количество степеней числа 5 в наборе из 10 целых положительных чисел.