Функции в Си-шарп. Оператор return




 

Функция – это небольшая подпрограмма. Функции позволяют уменьшить размер программы за счет того, что не нужно повторно писать какой-то фрагмент кода - мы просто вызываем сколько угодно и где нужно объявленную функцию.

 

Функции в Си-шарп также называют методами. Между этими двумя понятиями разница небольшая, и тут мы будем использовать термин функция.

 

До этого, мы весь код писали в функции main. Функция main является главной функцией приложения и точкой входа программы. Любая функция в Си-шарп может быть объявлена только в рамках класса, так как C# - полностью объектно-ориентированный язык программирования (ООП). Объявление пользовательской функции внутри другой функции (например main) недопустимо. Объявление функции имеет следующую структуру:

 

[модификатор доступа] [тип возвращаемого значения] [имя функции] ([аргументы])

{
// тело функции
}

 

Модификатор доступа (области видимости) может быть public, private, protected, internal, но пока будем везде использовать public.

 

Между модификатором и типом может стоять ключевое слово static, что означает, что функция будет статичной. Скажу только, что из статичной функции можно вызывать другие функции, если они тоже статичные. Главная функция main – всегда static, поэтому все функции в этом уроке мы будем объявлять также статичными.

 

Функция может возвращать значение или не возвращать. Если функция, например, возвращает целое число, то нужно указать тип int. Если функция не возвращает никакого значения, то для этого используется ключевое слово void. Функции, которые не возвращают значение, еще называют процедурами.

 

Желательно называть функции так, чтобы имя отражало суть функции. Используйте глаголы или словосочетания с глаголами. Примеры: GetAge(), Sort(), SetVisibility().

 

Аргументы – это те данные, которые необходимы для выполнения функции. Аргументы записываются в формате [тип] [идентификатор]. Если аргументов несколько, они отделяются запятой. Аргументы могут отсутствовать.

 

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

 

Перейдем к практике.

 

Пример функции, которая не возвращает значение

 

Напишем простую функцию, которая будет заменять в массиве строк указанное имя на другое. Данная функция будет принимать три аргумента: массив строк, имя, которое необходимо заменить и новое имя. Так как функция не будет возвращать значение, указываем тип void перед именем функции.

public static void ReplaceName(string[] names, string name, string newName)
{
for (int i=0; i < names.Length; i++)
{
if (names[i] == name)
names[i] = newName;
}
}

 

Проходим в цикле по элементам и смотрим, равен ли элемент указанному имени. Если да, то заменяем его на новое имя.

Функция написана, и теперь используем ее:

class Program
{
public static void ReplaceName(string[] names, string name, string newName)
{
for (int i=0; i < names.Length; i++)
{
if (names[i] == name)
names[i] = newName;
}
}
// главная

static void Main(string[] args)
{
string[] names = { "Sergey", "Maxim", "Andrey", "Oleg", "Andrey", "Ivan", "Sergey" };
ReplaceName(names, "Andrey", "Nikolay"); // вызов функции. Все строки "Andrey" в массиве будут заменены на "Nikolay"
ReplaceName(names, "Ivan", "Vladimir");
}
}

Изначально:

"Sergey", "Maxim", "Andrey", "Oleg", "Andrey", "Ivan", "Sergey"

После вызова функции два раза в этой программе, массив будет выглядеть так: "Sergey", "Maxim", " Nikolay ", "Oleg", " Nikolay ", " Vladimir ", "Sergey".

 

Пример функции, которая возвращает значения

Напишем функцию, которая будет находить максимальное число в массиве. Аргумент у этой функции будет один – массив целых чисел. Тип возвращаемого значения – целое число int.

public static int GetMax(int[] array)
{
int max = array[0];
for (int i = 1; i < array.Length; i++)
{
if (array[i] > max)
max = array[i];
}
return max;
}

 

Логика функции проста. Создаем переменную max, в которую записываем первый элемент массива. Дальше в цикле сравниваем каждый элемент со значением в max, если элемент больше, чем max, то записываем в max этот элемент. В конце функции используем оператор return, чтобы вернуть наш результат.

 

Оператор return должен быть обязательно в функции, которая возвращает значение.

Используем нашу функцию:

class Program
{
public static int GetMax(int[] array)
{
int max = array[0];
for (int i = 1; i < array.Length; i++)
{
if (array[i] > max)
max = array[i];
}
return max;
}
static void Main(string[] args)
{
int[] numbers = { 3, 32, 16, 27, 55, 43, 2, 34 };
int max;
max = GetMax(numbers); //вызов такой функции можно использовать при присваивании значения
Console.WriteLine(GetMax(numbers)); // вызов функции также можно использовать как аргумент при вызове другой функции. WriteLine() – тоже функция.
Console.ReadKey();
}
}

 

Оператор return

Когда встречается этот оператор, происходит выход из функции и код ниже (если он есть) выполняться не будет (например, в функцию передан такой аргумент, при котором нет смысла выполнять функцию). Он похож на оператор break, который используется для выхода из циклов. Этот оператор также можно использовать и в функциях, которые не возвращают значение. Оператор return допустимо использовать несколько раз в функции, но этого делать не рекомендуется.

 

 


Дополнительные примеры:

Пример 1. Напишите функцию, которая будет менять в массиве целых чисел все элементы, которые равны указанному значению (аргумент) на противоположное значение по знаку. Например, все элементы массива которые равны 5, будут меняться на -5.

public static void replacesign (int[] numbers, int number)
{
for (int i=0; i<numbers.Length; i++){
if (numbers[i] == number){
numbers[i] = -numbers[i];
}
}
}
static void Main()
{
int[] numbers = {12, 5, 7, 83, 5, 8, 5};
replacesign (numbers, 5);
for(int i=0; i<numbers.Length; i++){
Console.WriteLine(numbers[i]);
}
}

 

 

Задача 2. Напишите функцию, которая будет находить минимальное число из трех.

 

public static int _min(int a, int b, int c)
{
int min;
return ((min = b>c? c: b) > a)? a: min;
}

 

class Program
{
public static int getmin (int[] numbers)
{
int min = numbers[0];
for (int i=1; i<numbers.Length; i++){
if (numbers[i] < min){
min = numbers[i];
}
}
return min;
}
static void Main()
{
int[] numbers = {12, 5, 7};
Console.WriteLine(getmin(numbers));
}
}

 

 

Задача 3. Напишите функцию, которая будет возвращать указанный элемент ряда Фибоначчи. Ряд Фибоначчи – это ряд, в котором каждый следующий элемент равен сумме двух предыдущих. 1 1 2 3 5 8 13 21… Функция принимает порядковый номер элемента, и возвращает соответствующий элемент.

class Program
{
public static int getfib (int num)
{
int a = 1;
int b = 1;
int res = 1;
if (num > 2){
for (int i=2; i<num; i++){
res = a + b;
a = b;
b = res;
}
}
return res;
}
static void Main()
{
Console.WriteLine ("Введите порядковый номер элемента последовательности");
int num = Convert.ToInt32(Console.ReadLine());
if (num!= 0){
Console.WriteLine (getfib (num));
}
else{
Console.WriteLine("элемент не существует!");
}
}
}

 

С применением массивов

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите порядковый номер элемента");
int f = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(fib(f));
Console.ReadKey();
}
public static int fib(int f)
{
int[] fib = new int[f];
for (int i = 0; i < f; i++)
{
if (i < 2)
fib[i] = 1;
else
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[f-1];
}
}

 

С использованием рекурсии (когда подпрограмма вызывает сама себя)

public static int fib(int i)
{
return (i == 1 || i == 2)? 1: (fib(i - 1) + fib(i - 2));
}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: