Метод – это функциональный элемент класса, который реализует вычисления или другие действия, выполняемые классом или его экземпляром (объектом). Метод представляет собой законченный фрагмент кода, к которому можно обратиться по имени. Он описывается один раз, а вызываться может многократно. Совокупность методов класса определяет, что конкретно может делать класс. Например, стандартный класс Math содержит методы, которые позволяют вычислять значения математических функций.
Синтаксис метода:
[атрибуты] [спецификторы] тип_возвращаемого_результата имя_метода ([список_параметров])
{
тело_метода;
return значение
}
где:
static, который позволит обращаться к методу класса без создания его экземпляра.void (в этом случае в теле метода отсутсвует оператор return ).Рассмотрим простейший пример метода:
class Program
{
static void Func() //дополнительный метод
{
Console.Write("x= ");
double x=double.Parse(Console.ReadLine());
double y = 1 / x;
Console.WriteLine("y({0})={1}", x,y );
}
static void Main() //точка входа в программу
{
Func(); //первый вызов метода Func
Func(); //второй вызов метода Func
}
}
В даном примере в метод Func не передаются никакие значения, поэтому список параметров пуст. Кроме того метод ничего не возвращает, поэтому тип возвращаемого значения void. В основном методе Main мы вызвали метод Func два раза. Если будет необходимо, то данный метод можно будет вызвать еще столько раз, сколько потребуется для решения задачи.
Main третий вызов метода Func.Func вызывался n раз.Изменим исходный пример так, чтобы в него передавалось значение х, а сам метод возвращал значение y.
class Program
{
static double Func( double x) //дополнительный метод
{
return 1 / x; //Возвращаемое значение
}
static void Main() //точка входа в программу
{
Console.Write("a=");
double a=double.Parse(Console.ReadLine());
Console.Write("b=");
double b=double.Parse(Console.ReadLine());
for (double x = a; x <= b; x += 0.5)
{
double y = Func(x); //вызов метода Func
Console.WriteLine("y({0:f1})={1:f2}", x, y);
}
}
В данном примере метод Func содержит параметр х, тип которого double. Для того, чтобы метод Func возвращал в вызывающий его метод Main значение выражения 1/x (тип которого double ), перед именем метода указывается тип возвращаемого значения – double, а в теле метода используется return. Оператор return завершает выполнение метода и передает управление в точку его вызова.
x2 ;Рассмотрим другой пример:
class Program
{
static int Func( int x, int y) //строка 1
{
return (x>y)? x:y;
}
static void Main()
{
Console.Write("a=");
int a = int.Parse(Console.ReadLine());
Console.Write("b=");
int b = int.Parse(Console.ReadLine());
Console.Write("c=");
int c = int.Parse(Console.ReadLine());
int max = Func(Func(a, b), c); //строка 2 - вызовы метода Func
Console.WriteLine("max({0}, {1}, {2})={3}", a, b, c, max);
}
}
В данном примере метод Func имеет два целочисленных параметра – x, y, а в качестве результата метод возвращает наибольшее из них. На этапе описания метода (строка 1) указываются формальные параметры, на этапе вызова (строка 2) в метод передаются фактические параметры, которые по количеству и по типу совпадают с формальными параметрами. Если количество фактических и формальных параметров будет различным, то компилятор выдаст соответствующее сообщение об ошибке. Если параметры будут отличаться типами, то компилятор попытается выполнить
Обратите внимание на то, что при вызове метода Func использовалось вложение одного вызова в другой.
Func можно было найти наибольшее значение из четырех чисел: a, b, c, d. Метод Func при этом не изменять.В общем случае параметры используются для обмена информацией между вызывающим и вызываемым методами. В С# для обмена предусмотрено четыре типа параметров: параметры-значения, параметры-ссылки, выходные параметры, параметры-массивы.
При передаче параметра по значению метод получает копии параметров, и операторы метода работают с этими копиями. Доступа к исходным значениям параметров у метода нет, а, следовательно, нет и возможности их изменить.
Рассмотрим небольшой пример:
class Program
{
static void Func(int x)
{
x += 10; // изменили значение параметра
Console.WriteLine("In Func: " + x);
}
static void Main()
{
int a=10;
Console.WriteLine("In Main: "+ a);
Func(a);
Console.WriteLine("In Main: " + a);
}
}
Результат работы программы:
In Main: 10 In Func: 20 In Main: 10
В данном примере значение формального параметра х было изменено в методе Func, но эти изменения не отразились на фактическом параметре а метода Main.
При передаче параметров по ссылке метод получает копии адресов параметров, что позволяет осуществлять доступ к ячейкам памяти по этим адресам и изменять исходные значения параметров. Для того чтобы параметр передавался по ссылке, необходимо при описании метода перед формальным параметром и при вызове метода перед соответствующим фактическим параметром поставить служебное слово ref.
class Program
{
static void Func(int x, ref int y)
{
x += 10; y += 10; //изменение параметров
Console.WriteLine("In Func: {0}, {1}", x, y);
}
static void Main()
{
int a=10, b=10; // строка 1
Console.WriteLine("In Main: {0}, {1}", a, b);
Func(a, ref b);
Console.WriteLine("In Main: {0}, {1}", a, b);
}
}
Результат работы программы:
In Main: 10 10 In Func: 20 20 In Main: 10 20
В данном примере в методе Func были изменены значения формальных параметров х и y. Эти изменения не отразились на фактическом параметре а, т.к. он передавался по значению, но значение b было изменено, т.к. он передавался по ссылке.
Передача параметра по ссылке требует, чтобы аргумент был инициализирован до вызова метода (см. строку 1). Если в этой строке не проводить инициализацию переменных, то компилятор выдаст сообщение об ошибке.
Однако в некоторых случаях бывает невозможно инициализировать параметр до вызова метода. Тогда параметр следует передавать как выходной, используя спецификатор out.
class Program
{
static void Func(int x, out int y)
{
x += 10; y = 10; // определение значения выходного параметра y
Console.WriteLine("In Func: {0}, {1}", x, y);
}
static void Main()
{
int a=10, b;
Console.WriteLine("In Main: {0}", a);
Func(a, out b);
Console.WriteLine("In Main: {0}, {1}", a, b);
}
}
Результат работы программы:
In Main: 10 In Func: 20 10 In Main: 10 10
В данном примере в методе Func формальный параметр y и соответствующий ему фактический параметр b метода Main были помечены спецификатором out. Поэтому значение b до вызова метода Func можно было не определять, но изменение параметра y отразились на изменении значения параметра b.
Иногда бывает удобно, чтобы методы, реализующие один и тот же алгоритм для различных типов данных, имели одно и то же имя. Использование нескольких методов с одним и тем же именем, но различными типами и количеством параметров называется перегрузкой методов.Компилятор определяет, какой именно метод требуется вызвать, по типу и количеству фактических параметров.
Рассмотрим следующий пример:
class Program
{
static int max(int a) //первая версия метода max
{
int b = 0;
while (a > 0)
{
if (a % 10 > b) b = a % 10;
a /= 10;
}
return b;
}
static int max(int a, int b) //вторая версия метода max
{
if (a > b) return a;
else return b;
}
static int max(int a, int b, int c) //третья версия метода max
{
if (a > b a > c) return a;
else if (b > c) return b;
else return c;
}
static void Main()
{
int a = 1283, b = 45, c = 35740;
Console.WriteLine(max(a));
Console.WriteLine(max(a, b));
Console.WriteLine(max(a, b, c));
}
}
При вызове метода max компилятор выбирает вариант, соответствующий типу и количеству передаваемых в метод аргументов. Если точного соответствия не найдено, выполняются
Console метод WriteLine перегружен 19 раз для вывода величин разных типов.
Пример.
using System;
namespace Hello
{
class Program
{
static double min(double a, double b)
{
return (a < b) ? a : b;
}
static void Main(string[] args)
{
Console.Write("x=");
double x = double.Parse(Console.ReadLine());
Console.Write("y=");
double y = double.Parse(Console.ReadLine());
double z = min(3 * x, 2 * y) + min(x - y, x + y);
Console.WriteLine("z=" + z);
}
}
}
| Разработать метод $$f(a, b)$$, который по катетам $$a$$ и $$b$$ вычисляет гипотенузу. С помощью данного метода найти периметр фигуры ABCD по заданным сторонам AB, AC и DC. | (рис 5.5) 05_05 |
| Разработать метод $$f(x, y, z)$$, который по длинам сторон треугольника $$x$$, $$y$$, $$z $$ вычисляет его площадь. С помощью данного метода по заданным вещественным числам $$a$$, $$b$$, $$c$$, $$d$$, $$e$$, $$f$$, $$g$$ найти площадь пятиугольника, изображенного на рисунке. | (рис 5.6) 05_06 |
Замечание. Для решения задачи использовать вспомогательный метод.
Пример:
using System;
namespace Hello
{
class Program
{
static double f (double x)
{
double y;
if (x >= 0.9) y = 1 / Math.Pow(1 + x, 2);
else if (x >= 0) y = 0.2 * x + 0.1;
else y = x * x + 0.2;
return y;
}
static void Main(string[] args)
{
Console.Write("a=");
double a = double.Parse(Console.ReadLine());
Console.Write("b=");
double b = double.Parse(Console.ReadLine());
Console.Write("h=");
double h = double.Parse(Console.ReadLine());
for (double i = a; i <= b; i += h)
Console.WriteLine("f({0:f2})={1:f4}", i, f(i));
}
}
}
| 2. $$y=\left\{\begin{array}{ll} \sin{(x)}, \text{если } |x|<3; \\ \cfrac{\sqrt{x^2+1}}{\sqrt{x^2+5}}, \text{если } 3\le |x| < 9; \\ \sqrt{x^2+1}-\sqrt{x^2+5} \text{если } |x|\ge9 \end{array}$$ | |
| 3. $$y=\left\{\begin{array}{ll}0, \text{если } x<a; \\\cfrac{x-a}{x+a}, \text{если } x > a; \\1 \text{если } x=a\end{array}$$ | 4. $$y=\left\{\begin{array}{ll} x^3-0.1, \text{если } |x|\le0.1; \\ 0.2x-0.1, \text{если } 0.1< x \le 0.2; \\ x^3+0.1 \text{если } |x|>0.2\end{array}$$ |
| 5. $$y=\left\{\begin{array}{ll} a+b, \text{если } x^2-5x<0; \\ a-b, \text{если } 0\le (x^2-5x) <10; \\ ab \text{если } x^2-5x \ge10\end{array}$$ | 6. $$y=\left\{\begin{array}{ll} x^2, \text{если } (x^2+2x+1)<2; \\ \cfrac{1}{x^2-1}, \text{если } 2\le (x^2+2x+1) <3; \\ 0 \text{если } (x^2+2x+1) \ge3\end{array}$$ |
| 7. $$y=\left\{\begin{array}{ll} -4, \text{если } x<0; \\ x^2, \text{если } 0\le x < 1; \\ 2 \text{если } x\ge1 \end{array}$$ | 8. $$y=\left\{\begin{array}{ll} x^2-1, \text{если } |x|\le1; \\ 2x-1, \text{если } 1< x \le 2; \\ x^5-1 \text{если } |x|>2\end{array}$$ |
| 9. $$y=\left\{\begin{array}{ll} (x^2-1)^2, \text{если } x<1; \\ \cfrac{1}{(1+x)^2}, \text{если } x > 1; \\ 0 \text{если } x=1\end{array}$$ | 10. $$y=\left\{\begin{array}{ll} x^2, \text{если } (x+2)<1; \\ \cfrac{1}{x+2}, \text{если } 1\le (x+2) <10; \\ x+2 \text{если } (x+2) \ge10\end{array}$$ |
| 11. $$y=\left\{\begin{array}{ll} x^2+5, \text{если } x\le 5; \\ 0, \text{если } 5< x <20; \\ 1 \text{если } x \ge20\end{array}$$ | 12. $$y=\left\{\begin{array}{ll} 0, \text{если } x<0; \\ x^2+1, \text{если } x > 0 \text{ и } x \ne 1; \\ 1 \text{если } x=1\end{array}$$ |
| 13. $$y=\left\{\begin{array}{ll} 1, \text{если } x=1 \text{ или } x=-1; \\ \cfrac{1}{1-x}, \text{если } x \ge 0 \text{ и } x \ne 1; \\ \cfrac{1}{1+x}, \text{если } x < 0 \text{ и } x \ne -1; \end{array}$$ | 14. $$y=\left\{\begin{array}{ll} 0.2x^2-x-0.1, \text{если } x<0; \\ \cfrac{x^2}{x-0.1}, \text{если } x > 0 \text{ и } x \ne 0.1; \\ 0 \text{если } x=1\end{array}$$ |
| 15. $$y=\left\{\begin{array}{ll} 1, \text{если } (x-1)<1; \\ 0, \text{если } (x-1)=1; \\ -1 \text{если } (x-1)>1\end{array}$$ | 16. $$y=\left\{\begin{array}{ll} x, \text{если } x>0; \\ 0, \text{если } -1\le x \le 0; \\ x^2 \text{если } x<-1 \end{array}$$ |
| 17. $$y=\left\{\begin{array}{ll} a+bx, \text{если } x<93; \\ b-ac, \text{если } 93\le x \le 120; \\ abx \text{если } x>120 \end{array}$$ | 18. $$y=\left\{\begin{array}{ll}x^2-0.3, \text{если } x<3; \\ 0, \text{если } 3\le x \le 5; \\ x^2+1, \text{если } x>5\end{array}$$ |
| 19. $$y=\left\{\begin{array}{ll}\sqrt{5x^2+5}, \text{если } |x|< 2; \\\cfrac{|x|}{\sqrt{5x^2+5}}, \text{если } 2\le |x| < 10; \\0 \text{если } |x|\ge10\end{array}$$ | 20. $$y=\left\{\begin{array}{ll}\sin{(x)}, \text{если } |x|< \cfrac{\pi}{2}; \\\cos{(x)}, \text{если } \cfrac{\pi}{2}\le |x| \le \pi; \\0 \text{если } |x|>\pi\end{array}$$ |
static void f (double x, out double y). Продемонстрируйте работу Пусть a1, a2, ..., an - произвольная числовая последовательность. Рекуррентным соотношением называется такое соотношение между членами последовательности, в котором каждый следующий член выражается через несколько предыдущих, т.е ak = f(ak-1, ak-2, ..., ak-l, l < k (1).
Последовательность задана рекуррентно, если для нее определено рекуррентное соотношение вида (1) и заданы первые l ее членов.
Самым простым примером рекуррентной последовательности является арифметическая прогрессия. Рекуррентное соотношение для нее записывается в виде: ak = ak-1 + d, где d - разность прогрессии. Зная первый элемент и разность прогрессии, и, используя данное рекуррентное соотношение, можно последовательно вычислить все остальные члены прогрессии.
Рассмотрим пример программы, в которой вычисляются первые n членов арифметической прогрессии при условии, что a1=1/2 и d=1/4.
static void Main()
{
Console.Write("a=");
double a = double.Parse(Console.ReadLine());
Console.Write("h=");
double d = double.Parse(Console.ReadLine());
Console.Write("n=");
int d = int.Parse(Console.ReadLine());
Console.WriteLine("a1="+ a); //вывели первый член последовательности
//организуем вычисление 2, 3, … ,n члена последовательности
for (int i = 2; i <= n; ++i)
{
a += d; //для этого прибавляем к предыдущему члену значение d
Console.WriteLine("a{0}={1}", i, a); //и выводим новое значение а на экран
}
}
Результат работы программы:
n состояние экрана 5 a1: 0.5 a2: 0.75 a3: 1. a4: 1.25 a5: 1.5
Более сложная зависимость представлена в последовательности Фибоначчи: a1 = a2= 1, an = an-1 + an-2. В этом случае каждый член последовательности зависит от значений двух предыдущих членов. Рассмотрим пример программы, в которой вычисляются первые n членов последовательности Фибоначчи.
static void Main()
{
int a1=1, a2=1, a3; //задали известные члены последовательности
Console.Write("n=");
int n = int.Parse(Console.ReadLine());
//вывели известные члены последовательности
Console.WriteLine("a1={0}\na2={1}",a1,a2);
/*Организуем цикл для вычисления членов последовательности с номерами 3, 4,…, n.
При этом в переменной a1 будет храниться значение члена последовательности с номером i-2,
в переменной a2 - члена с номером i-1,
переменная а будет использоваться для вычисления члена с номером i. */
for (int i = 3; i <= n; ++i)
{
a3=a1+a2; //по рекуррентному соотношению вычисляем член последовательности
Console.WriteLine("a{0}={1}", i, a3); //с номером i и выводим его значение на экран
//выполняем рекуррентный пересчет для следующего шага цикла
a1 = a2; //в элемент с номером i-2 записываем значение элемента с номером i-1
a2 = a3; //в элемент с номером i-1 записываем значение элемента с номером i
}
}
Результат работы программы:
n состояние экрана 5 a1: 1 a2: 1 a3: 2 a4: 3 a5: 5
b1 =9 , bn=0.1bn-1+10b1 =5 , bn=bn-1/(n2+n+1)b1 =-1, b2 =1, bn =3 bn-1 - 2 bn-2b1 =1, b2 =2, bn=(nbn-2 - bn-1)/(n+1)h=0.1 Результат работы программы представить в виде следующей таблицы:| № | Значение x | Значение функции bn(x) |
| 1 | ||
| 2 | ||
| … |
х и n, и которым возвращается значение bn.b1 =x , bn=x+2bn-1b1 =x , bn=sin(bn-1)+pb1 =0 , b2n=b2n-1+x, b2n+1=2b2nb1 =x ,
b2=2x,
bn=bn-2/4+5/( bn-1)2Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.