Основная цель нашего курса – научиться программированию в процедурах и функциях. Формально, в языке C# нет понятий "процедура" и "функция". В языке используется общее понятие – "метод класса". Фактически, метод может быть реализован либо как функция, либо как процедура. Этот урок мы посвятим функциям.
Проект для лекции Lesson4.zip
Функции в математике являются одним из основных понятий. Рассмотрим, как в математике определяется функция от одного аргумента: y = F(x).
Будем полагать, что заданы два множества – X и Y. Множество X будем называть областью определения, а множество Y – областью значений функции F. Для каждого элемента x из области определения функция F задает элемент y из области значений. Другими словами, функция F задает отображение элементов множества X на элементы множества Y. Важно понимать, что функция задает однозначное отображение – каждому элементу x из области определения X соответствует в области значений Y ровно один элемент.
Заметим, что для функций разрешается отображать разные элементы множества X на один и тот же элемент y из множества Y.
Множества X и Y могут совпадать. В этом случае функция строит отображение множества на себя - X отображается в X.
Отображение F задает взаимно однозначную функцию, если разные элементы из множества X отображаются в разные элементы множества Y, то есть справедлива импликация:
x1 ≠ x2 => F(x1) ≠ F(x2)
В этом случае у функции F существует обратная функция: x = F-1(y).
Рассмотрим некоторые примеры. Пусть X и Y – множества целых чисел. Функция y = x +1 каждое целое число отображает в следующее целое, на единицу больше числа x. Это взаимно однозначная функция. Обратная к ней функция x = y – 1 отображает число y в предыдущее число, на единицу меньше, чем число y.
Отображение y = x2
также является функцией, но на множестве целых чисел эта функция не является взаимно однозначной, поскольку два значения, например, 5 и -5 отображаются в одно и то же значение 25. Но если в качестве множеств X и Y рассматривать множества целых неотрицательных чисел, то существует обратная функция , где рассматривается так называемый арифметический корень, принимающий только положительные значения, так что корень из 25 равен числу 5.
Более общим понятием, играющим важную роль как в математике, так и в программировании является понятие "отношение". Бинарное отношение R, также, как и функция от одного аргумента, задается на двух множествах X и Y. Отношение R задает, какие пары элементов, взятые из двух множеств, принадлежат отношению, что обычно записывается в виде >
. Отношение, в отличие от функции, не требует единственности элемента y для заданного x. Классическим примером отношения на множестве целых чисел является отношение "больше": x >> y. Пары <5, 3>, <5, 0>, <5, -10> принадлежат этому отношению. Для отношения "больше" существует обратное отношение "меньше".
Заметьте, каждая функция задает отношение, но не каждое отношение определяет функцию.
Определение функции обобщается на случай функции от n аргументов. В этом случае областью определения является декартово произведение n множеств: X1 * X2 * ... * Xn.
Функция F(x1, x2, ..., xn) каждой совокупности из n значений, каждой n-ке значений y из множества значений Y.
Более подробные сведения об отношениях и функциях с примерами и упражнениями приведены в курсе "Введение в логику", опубликованном на сайте intuit.ru.
Как задается определение функции в языках программирования? В языке C# такое определение называется объявлением функции, и оно может размещаться там же, где объявляются переменные. Синтаксически объявление функции состоит из двух частей:
<заголовок функции> <тело функции>
Заголовок однозначно определяет:
Синтаксически все выглядит достаточно просто и эффективно. Вот как выглядит формальный синтаксис заголовка функции:
<тип значения, возвращаемого функцией> <имя функции> (<список формальных параметров>)
Ранее мы говорили, что тип задает определение множества. Указав тип возвращаемого значения, мы тем самым определяем множество, которому принадлежат значения функции. Число аргументов функции определяется числом элементов в списке формальных параметров. Каждый формальный параметр задает аргумент функции – его имя и множество, которому принадлежит аргумент. Элементы в списке формальных параметров, разделяются запятыми, а каждый параметр задается следующим синтаксисом:
<тип параметра> <имя параметра>
Рассмотрим в качестве примера функцию y = x2
. На языке C# заголовок этой функции может выглядеть так:
int Quadrat(int x)
В этом случае аргумент x нашей функции должен быть целым числом, значение функции также принадлежит множеству целых чисел. В большинстве случаев разумнее было бы определить заголовок этой функции следующим образом:
double Quadrat(double x)
В этом случае аргумент и значение функции являются числами с целой и дробной частями, частным случаем которых являются целые числа.
Мы выяснили роль заголовка функции. А какова роль тела функции? Тело функции задает отображение, позволяющее преобразовать аргумент x в результат y. Синтаксически тело функции – это блок – совокупность операторов и объявлений, заключенная в фигурные скобки. На этот блок накладывается дополнительное требование, - последним выполняемым оператором блока должен быть оператор возврата, имеющий следующий синтаксис:
return <выражение>;
Этот оператор завершает выполнение функции, возвращая в качестве результата вычисления функции значение выражения, заданного оператором return.
Функции, изучаемые в школе, достаточно простые и, чаще всего, задаются одной формулой. На языке C# для таких функций блок, задающий тело функции, может состоять из одного оператора return, выражение в котором задает формулу, представляющую нашу функцию.
Представим полное описание объявления функции y = x2, содержащее как заголовок, так и тело функции:
double Quadrat(double x) { return x * x; }
Рассмотрим функцию SumAB, вычисляющую сумму двух аргументов. Ее объявление может быть задано следующим образом:
double SumAB(double a, double b) { return a + b; }
В реальных задачах функции, объявляемые в языке программирования, могут быть весьма сложными. В этом случае блок, реализующий тело функции, может содержать объявления локальных переменных, необходимых для вычисления значения функции, операторы присваивания, выбора, цикла, вызовы функций.
Объявление функции является декларацией и не производит никаких вычислений. Для того чтобы функция действовала необходимо ее вызвать, задав в момент вызова значения фактических аргументов, которые и будут участвовать в выполнении. Синтаксически вызов функции похож на заголовок функции:
<имя функции> (<список фактических параметров>)
Фактический параметр, в отличие от формального параметра, заданного именем, может быть сколь угодно сложным выражением, содержащем, например, вызовы других функций. На вызов функции накладываются понятные, но довольно строгие ограничения. Вызов функции должен соответствовать ее объявлению. Это означает совпадение имени функции в точке вызова с именем, заданным при объявлении. Списки формальных и фактических параметров должны совпадать по числу параметров, а типы выражений, задающих фактические аргументы в точке вызова должны соответствовать типам формальных параметров, указанных в объявлении функции. Если формальный параметр имеет тип double, то в момент вызова ему нельзя передать значение типа string, хотя можно передать значение типа int.
Точную семантику вызова функции описывать сейчас не будем, полагаясь на интуитивное понимание, взращенное математикой. Можно считать, что в момент вызова функции начинает выполняться блок, заданный телом функции. Перед началом выполнения этого блока формальным параметрам присваиваются значения выражений, задающих фактические аргументы.
Приведем примеры нескольких вызовов функции Quadrat:
double z; z = Quadrat(7); double x = 5.5, y = 7.5, z = Quadrat(x + y);
Представьте себе, что нам нужно вычислить гипотенузу прямоугольного треугольника, когда заданы его катеты. Приведем пример вызова функций для решения этой задачи, используя как функцию из класса Math, так и выше объявленные функции:
double a = 3, b = 4, c = Math.Sqrt(SumAB(Quadrat(a), Quadrat(b)));
Одно из главных, хотя и не единственное достоинство процедур и функций в том, что один раз написав объявление функции, вызывать ее можно многократно. Как следствие, это позволяет существенно сокращать код программного проекта, что также способствует повышению надежности проекта, его корректности. Существует правило хорошего стиля программирования – "в проекте не должно быть дублирующего кода". Действительно, если такой код появляется, то это фрагмент кода следует оформить в виде процедуры или функции, тогда код будет присутствовать в одном экземпляре, а в нужных местах будет вызываться соответствующий метод (процедура или функция).
Задание 1
Постройте консольный и Windows проект, в котором используется функция, вычисляющая сумму целых чисел от 1 до N.
Задание 2
Постройте консольный и Windows проект, в котором используется функция, вычисляющая максимум из трех переменных – a, b, c.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.