Содержание:
Урок № 5. C# Теория
Сочетания клавиш для запуска и отладки приложений
-
Ctrl + F5 запуск приложения без отладки
F5 запуск приложения с отладкой
Shift + F5 остановка отладки
F9 вставка / удаление точки останова
F10 шаг без захода в метод (во время отладки)
F11 шаг с заходом в метод (во время отладки)
Ctrl + Shift + F5 перезапуск отладки
Shift + F11 шаг с выходом из метода (во время отладки)
Ctrl + m + m свернуть код метода, когда курсор находится в каком-то месте этого кода; чтобы развернуть его, используйте ту же комбинацию клавиш
Объявление методов и функций
- Методы позволяют нам инкапсулировать поведение и функциональность в объекты, которые мы создаем в нашем коде.
- Метод объявляется с использованием сигнатуры.
- private — наиболее ограничительный, допускающий доступ к методу только из содержащего его класса или структуры
- public — доступ из любого фрагмента кода в рамках приложения
- protected — позволяет получить доступ из содержащего класса или из производных классов
- internal — доступ из файлов внутри одной сборки
- static — указывает, что метод является статическим членом класса, а не членом экземпляра конкретного объекта
- Тип возвращаемого значения — используется для указания типа возвращаемого значения. Используйте void, если метод не возвращает значение
- Идентификатор (имя) метода — все методы должны иметь идентификатор (имя), чтобы была возможность вызывать метод в коде. Правила идентификаторов применяются и к именам методов
- Список аргументов (параметров) — разделенный запятыми список аргументов, передаваемых в метод
- Чтобы вернуть значение из функции, используйте оператор:
- Если вместо возвращаемого типа у нас присутствует ключевое слово
void
, то это означает, что функция не вернет никакого значения. - Можно определить функцию в том же классе, что и функцию
Main()
, или определить ее в другом классе. - Все методы или функции в си шарп должны быть статическими, что означает, что их можно вызвать без создания класса объекта.
- Чтобы методы (функции), описываемые в одном классе, сделать видимыми в другом, они должны быть описаны с помощью модификатора доступа
public
- Если метод (функция) вызывается в том же классе, модификатор доступа
public
не требуется.
Сигнатура метода состоит из:
Модификатор доступа — откуда этот метод может быть вызван. Некоторые из них:
Пример функции (метода):
public Boolean StartService(string serviceName) { // код функции } |
В примере:
public
модификатор доступа,
Boolean
тип возвращаемого значения,
StartService
идентификатор (имя),
string serviceName
параметр (аргумент).
return выражение; |
static void SayHello() { Console.WriteLine("Hello"); } |
Вызов метода / функции
static void Main(string[] args) { int res; Square(5, out res); Console.WriteLine(res); } static void Square(int a, out int res) { res = a * a; } |
В этом примере:
a
— ref аргумент (входно-выходной);
res
— out аргумент (выходной).
Возврат значения из функции / метода
Три подхода для возврата значений в си шарп:
ref
(входно-выходной параметр)out
(выходной параметр)out
и ref
— параметры. Out
– выходные, ref
– входно-выходные. ref
-параметры перед вызовом функции обязательно должны быть инициализированы, иначе – ошибка компилятора. При вызове функции также указываются ключевые слова out и refюref
, второй — с ref
:// 1. без ref static void Main(string[] args) { int a = 1; Plas2(a); Console.WriteLine(a); // результат 1 } static void Plas2(int a) { a += 2; } |
// 2. с ref static void Main(string[] args) { int a = 1; Plas2(ref a); Console.WriteLine(a); // результат 3 } static void Plas2(ref int a) { a += 2; } |
out
, чтобы указать, что значения тих параметров будут возвращены. При вызове также указывается ключевое слово out
:static void Main(string[] args) { int a; // здесь не нужно инициализировать будущий параметр значением Plas2(out a); Console.WriteLine(a); // 3 } static void Plas2(out int a) { a = 1; // здесь необходимо присвоить какое-то значение a += 2; } |
out
:static void Main(string[] args) { int first; String sValue; ReturnMultiOut(out first, out sValue); Console.WriteLine($"{first.ToString()}, {sValue}"); } static void ReturnMultiOut(out int i, out string s) { i = 25; s = "использование out"; } |
Результат будет:
25 использование out
ref
используется для возврата значений из метода. При использовании ref модификатор необходимо, чтобы сначала данные аргументы были инициализированы значениямиstatic void Main(string[] args) { // сначала инициализируем значением, так как ref int first =0; String sValue=""; ReturnMultiOut(ref first, ref sValue); Console.WriteLine($"{first.ToString()}, {sValue}"); } static void ReturnMultiOut(ref int i, ref string s) { i = 25; s = "использование ref"; } |
Перегрузка методов / функций
Задания и лабораторные си шарп
Выполнить: Создайте метод Sum()
, который принимает два целочисленных аргумента и суммирует их. Метод не возвращает никакого значения (именно поэтому вы должны использовать ключевое слово void
).
Указание: Необходимо использовать ключевое слово static
в сигнатуре метода, потому что основная функция статична, и мы не можем вызвать нестатический метод из статического метода.
Пример выполнения:
Введите два числа 20 40 Сумма 20 + 40 = 60
[Название проекта: Lesson_5Lab1
, название файла L5Lab1.cs
]
✍ Алгоритм:
- Запустите Visual Studio.
- Создайте консольное приложение, назовите проект
Lesson_5Lab1
. - В окне Solution Explorer (Обозреватель решений) найдите файл
Program.cs
и переименуйте его вL5Lab1.cs
. - В главной функции запросите пользователя ввести два числа:
- Поместите курсор после закрывающей фигурной скобки функции
Main()
и нажмите клавишу enter, чтобы вводить новую функцию уже после функцииMain()
(Мы делаем это потому, что нельзя помещать методы/функции внутри другой функции). - Объявите новый метод
Sum()
, который будет использоваться для суммы переданных в него значений: - Теперь мы можем вызвать этот метод из основной функции. Введите следующий код в фигурные скобки
Main()
: - Щелкните
CTRL+F5
, чтобы запустить приложение без отладки. - Созданная нами функция
Sum()
не возвращает значения. Теперь мы изменим этот метод так, чтобы он возвращал результат вызывающему методу (основному методу, откуда он был вызван). - Закоментируйте код функции
Sum()
, используя горячие клавиши[CTRL]+k+c
: - Установите курсор после комментариев и введите следующий код:
- Затем нам нужно изменить способ вызова метода. Объявите целочисленную переменную (в функции
Main()
), чтобы получить возвращаемое значение. Выведите результат в окно консоли - Запустите приложение. Результаты должны быть одинаковыми.
- Давайте теперь перегрузим наш метод
Sum()
. Для этого мы создадим два дополнительных метода с одинаковыми названиями. - Поместите курсор после метода
Sum()
. Сначала создайте метод, который принимает три целых числа: - Этот метод использует то же имя, что и предыдущий метод
Sum()
, который принимает два целых числа, но параметры здесь указывают, что метод ожидает три целых числа в качестве аргументов. Компилятор «узнает», какой метод следует вызвать, основываясь на количестве переданных аргументов. - Затем введите следующий код для создания метода
Sum()
, принимающего два вещественных аргумента (типаdouble
): - Наконец, измените код в
Main()
, который вызывает данные методы: - Запустите приложение еще раз и проверьте выходные данные. Вы должны увидеть правильные результаты суммы для всех трех различных вызовов. Несмотря на то, что у них всех идентификатор
Sum
, компилятор выбирает правильный метод для вызова на основе сигнатуры метода. Именно так работает перегрузка метода.
... Console.WriteLine("Введите два числа"); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); ...
... static void Sum(int first, int second) { int sum = first + second; Console.WriteLine($"Сумма {first} + {second} = {sum}"); } ...
void
.static void Main(string[] args) { ... Sum(a, b); } |
//static void Sum(int first, int second) //{ // int sum = first + second; // Console.WriteLine($"The sum of {first} and {second} is: {sum}"); //} |
... static int Sum(int first, int second) { int sum = first + second; return sum; } ...
int
в сигнатуре (static int Sum(...)
).Обратите внимание, что имена параметров, которые мы указали здесь в сигнатуре метода, могут не совпадать с именами аргументов, которые мы передали. Эти параметры становятся локальными переменными в рамках этого метода.
... static void Main(string[] args) { int result = Sum(a, b); Console.WriteLine($"Сумма {a} + {b} = {result}"); } ...
Перегрузка метода / функции:
static int Sum(int first, int second, int third) { int sum = first + second + third; return sum; }
... static double Sum(double first, double second) { double result = first + second; return result; } ...
static void Main(string[] args) { ... int result = Sum(a, b); Console.WriteLine($"Вызов Sum() с двумя аргументами: {result}"); int result3 = Sum(10, 50, 80); Console.WriteLine($"Вызов Sum() с тремя аргументами: {result3}"); double dblResult = Sum(20.5, 30.6); Console.WriteLine($"Вызовg Sum() с вещественными аргументами: {dblResult}"); }
Выполнить: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter(
), которая вычисляет периметр треугольника по длинам трех его сторон.
Указание 1: Метод Perimeter()
должен принимать в качестве аргументов три целых числа.
Указание 2: Метод не должен возвращать никакого значения, поэтому вы должны использовать ключевое слово void
в сигнатуре:
static void Perimeter(...); |
Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:
int a = int.Parse(Console.ReadLine()); |
Пример выполнения:
Введите значения для трех сторон треугольника: 3 5 6 Периметр: 14
[Название проекта: Lesson_5Task1
, название файла L5Task1.cs
]
Выполнить: Необходимо переделать предыдущую задачу, теперь функция периметр должна возвращать целое значение. Напомним задание: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter(
), которая вычисляет периметр треугольника по длинам трех его сторон.
Указание 1: Метод Perimeter()
должен принимать в качестве аргументов три целых числа.
Указание 2: Метод должен возвращать значение типа integer, поэтому вы должны использовать ключевое слово int
в сигнатуре:
static int Perimeter(...); |
Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:
int a = int.Parse(Console.ReadLine()); |
Пример выполнения:
Введите значения для трех сторон треугольника: 3 5 6 Периметр: 14
[Название проекта: Lesson_5Task2
, название файла L5Task2.cs
]
Выполнить: Создайте метод GetPow()
, который принимает два целочисленных аргумента — число и степень. Метод возвращает результат возведения числа в степень.
Указание 1: Необходимо использовать служебное слово static
, потому что основная функция статичная (static), а мы не можем вызвать нестатический метод из статического метода.
Указание 2: Функция возвращает целочисленное значение, поэтому необходимо использовать int
в сигнатуре функции:
static int GetPow(int baseNum, int powNum) {…} |
Пример выполнения:
Введите два числа – число и степень: 2 4 число 2 возведенное в степь 4 = 16
[Название проекта: Lesson_5Lab2
, название файла L5Lab2.cs
]
✍ Алгоритм:
- Запустите Visual Studio.
- Создайте консольное приложение, назовите проект
Lesson_5Lab2
. - После закрывающей скобки функции
Main
создайте функциюGetPow
: - Объявите переменную
result
для хранения результата и возврата этого значения из функции. - Внутри функции создайте цикл, в котором накапливается произведение числа. Цикл должен выполнится
powNum
раз: - Вызовите созданный метод внутри функции
Main
: - Запустите приложение и посмотрите на результат.
- Теперь вместо конкретных чисел (2 и 4) запросите эти числа у пользователя. Затем измените код вызова функции:
- Запустите приложение и протестируйте результат с разными значениями.
- Сохраните проект.
static GetPow( baseNum, powNum) {…}
baseNum
и аргумент powNum
. Внутри функции необходимо возвести baseNum
в степень powNum
.1; … return result;result =
for ( i=0; i<powNum; i++) { result = result * baseNum; }
1 * baseNum
, результат сохраняется в переменной result
. За две итерации имеем baseNum * baseNum
. За три – baseNum * baseNum * baseNum
и т. д. Мы повторяем это действие каждую итерацию.Console.WriteLine($"Число 2 возведенное в степень 4 = {GetPow(2,4)} ");
Console.WriteLine ("Введите два числа – число и степень числа: "); a = Int32.Parse(Console.ReadLine()); b = Int32.Parse(Console.ReadLine()); Console.WriteLine(GetPow(a,b));
Выполнить: Создайте метод Distance
который вычисляет расстояние между двумя точками на плоскости. Координаты точек вводятся (переменные x1
,y1
— для первой точки, и x2
,y2
— для второй).
Указание 1: Метод Distance()
принимает 4 аргумента (координаты точек).
Указание 2: Метод не должен возвращать значение, поэтому следует использовать ключевой слово void
в сигнатуре:
static void Distance(...); |
Указание 3: Для подсчета расстояния между двумя точками на плоскости используйте формулу:
квадратный корень: Math.Sqrt(...); степень числа: Math.Pow(number, power); |
Пример выполнения:
Введите координаты двух точек (четыре целых числа: x1, y1, x2, y2): 1 -2 4 2 Расстояние: 5
[Название проекта: Lesson_5Task3
, название файла L5Task3.cs
]
Выполнить: Необходимо переделать предыдущее задание. Создайте метод Distance
который вычисляет расстояние между двумя точками на плоскости. Координаты точек вводятся (переменные x1
,y1
— для первой точки, и x2
,y2
— для второй).
Указание: Метод должен возвращать вещественное значение (double):
static double Distance(...); |
Пример выполнения:
Введите координаты двух точек (четыре целых числа: x1, y1, x2, y2): 3.2 3.4 8 7.1 Расстояние: 6.0605
[Название проекта: Lesson_5Task4
, название файла L5Task4.cs
]
Выполнить: Создайте метод Minmax()
который принимает два целочисленных аргумента по ссылке (ref) и меняет их значения таким образом, что первый становится максимальным, а второй — минимальным (меняет значения аргументов, если требуется). Создайте перегруженный метод Minmax
для трех параметров.
Указание 1: Необходимо использовать ключевое слово static
в сигнатуре создаваемого метода, т.к. функция Main
тоже static, невозможно вызвать не static метод из static метода.
Указание 2: Метод не возвращает значения значит, используется ключевое слово void
в сигнатуре).
Пример выполнения:
Введите два числа 2 4 Результат после метода Minmax : 4 2 Введите три числа 2 4 3 Результат после перегрузки метода Minmax : 4 3 2
[Название проекта: Lesson_5Lab3
, название файла L5Lab3.cs
]
✍ Алгоритм:
- Создайте консольное приложение, назовите проект
Lesson_5Lab3
. - В окне Solution Explorer (Обозреватель решений) найдите файл
Program.cs
и переименуйте его вL5Lab3.cs
. - В теле функции
Main
попросите пользователя ввести два числа. Присвойте введенные значения переменным: - Затем, то же самое сделайте для перегруженной функции с тремя аргументами. Попросите пользователя ввести три числа и присвойте введенные значения переменным:
- Для добавления метода установите курсор после тела функции
Main()
. - Объявите метод
Minmax()
, который будет менять значения переменных, если это потребуется. Используйте модификаторref
для аргументов: - Найдите максимальное и минимальное значения, используя стандартные функции
Min()
иMax()
. Присвойте найденные значения соответствующим переменным (первый аргумент должен быть больше второго): - Поскольку созданный метод
Minmax
не возвращает никакого значения, то новые значения переменных будут передаваться в основную программу, благодаря модификаторуref
. - Теперь можно вызвать созданный метод из функции
Main
: - Запустите приложение и проверьте результат.
- Чтобы свернуть или развернуть код какого-либо метода, можно использовать горячие клавиши
Ctrl+M (дважды)
. - Установите курсор после метода
Minmax()
и создайте перегруженный метод (с таким же именем) для трех аргументов: - Наконец добавьте вызов метода из функции
Main()
: - Запустите приложение и проверьте результат. Несмотря на то, что имена у созданных методов одинаковы, компилятор вызовет нужный метод, исходя из количества аргументов.
... Console.WriteLine("Введите два числа"); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); ...
... Console.WriteLine("Введите три числа"); a = int.Parse(Console.ReadLine()); b = int.Parse(Console.ReadLine()); int c = int.Parse(Console.ReadLine()); ...
... static void Minmax(ref int a, ref int b) { ... } ...
ref
используется для того, чтобы значение аргумента передалось из основной программы в создаваемую функцию и, наоборот, из функции измененное значение должно возвратиться в основную программу. Ref аргументы должны быть инициализированы до их вызова, иначе возникнет ошибка. При вызове модификатор ref
также указывается.static void Minmax(ref int a, ref int b) { int max = Math.Max(a, b); int min = Math.Min(a, b); a = max; b = min; ...
... Minmax(ref a,ref b); Console.WriteLine($"Результат после метода Minmax: {a}, {b}"); ...
Перегруженный метод (функция):
... static void Minmax(ref int a, ref int b, ref int c) { Minmax(ref a, ref b); Minmax(ref b, ref c); Minmax(ref a, ref b); } ...
a
и b
, затем из b
и c
, и после — из a
и b
еще раз, так как значения переменных могли уже поменяться к этому моменту.... Minmax(ref a,ref b, ref c); Console.WriteLine($"Результат после перегрузки метода Minmax: {a}, {b}, {c}"); ...
Выполнить: Вводится двузначное целое число. Создайте метод ChangeDigits()
, который принимает введенный аргумент по ссылке и изменяет его значение так, чтобы первая цифра нового числа была второй цифрой введенного числа и, наоборот, вторая цифра нового числа была первой цифрой введенного числа. Например, если ввести 45, то результирующее число будет равно 54.
Указание 1: Метод ChangeDigits()
принимает аргумент с модификатором ref.
Указание 2: Метод не возвращает значения:
static void ChangeDigits(...); |
Указание 3: Сначала необходимо получить цифры из числа. Затем, поменяв местами цифры, сделать новое число. Пример создания нового числа из двух цифр:
если даны цифры 2, 3 2*10 + 3 = 23
Пример выполнения:
Введите двузначное число: 58 Результат: 85
[Название проекта: Lesson_5Task5
, название файла L5Task5.cs
]
Выполнить: Вводятся два двузначных целых числа. Создайте функцию BitwiseSum()
, которая вычисляет их побитовую сумму по модулю 10. Например, побитовая сумма чисел 34 и 59 является числом 83 (3 + 5 = 8; 4 + 9 = 13, 13%10 = 3).
Указание 1: Функция BitwiseSum()
имеет два аргумента.
Указание 2:Функция возвращает целочисленное значение int
:
static int BitwiseSum(...); |
Введите двузначное число: 34 59 Побитовая сумма чисел 34 и 59 = 83
[Название проекта: Lesson_5Task6
, название файла L5Task6.cs
]
Выполнить: Создайте функцию MinmaxSeq()
, которая принимает два аргумента по ссылке (ref аргументы) — минимальное и максимальное значение вводимой последовательности чисел. Запросите у пользователя ввести последовательность, которая должна закончиться 0
(если вводится 0, то ввод завершается). Функция должна выполнять поиск максимального и минимального значения последовательности и возвращать результат.
Указание 1: Функция не должна возвращать значениен (поэтому в объявлении функции используется void
). Параметры ref
— это параметры ввода-вывода, это говорит о том, что значения этих параметров меняются внутри функции и возвращаются в основную программу с вызовом фнукции.
Указание 2: Необходимо использовать ключевое слово static
в объявлении метиода, так как функция Main
тоже статическая, а нестатическая фнукция не может быть вызвана внутри статической.
[Название проекта: Lesson_5Lab4
, название файла L5Lab4.cs
]
Пример вывода:
Введите полседовательность и закончите ввод нулем: 2 4 8 3 0 минимальное: 2, максимальное: 8
✍ Алгоритм:
- Создайте Консольное приложение и назовите его
Lesson_5Lab4
. - В окне Обозреватель решений найдите файл
Program.cs
и переименуйте его вL5Lab4.cs
. - В функции
Main
объявите две переменные для хранения минимального и максимального значения последовательности. Присвойте им начальные значения: для переменнойmin
— наибольшее возможное целое число, для переменнойmax
— наименьшее возможное целое число: - Функцию, которую мыходит создать, будет называться
MinmaxSeq()
, и она будет принимать два аргумента по ссылке — переменныеmin
иmax
. Сначала давайте вызовем пока еще несозданный метод из функцииMain
, сразу после инициализации переменныхmin
иmax
: - C# может «самостоятельно» добавлять объявления фнукций. Давайте попросим сделать это. Наведите курсор мыши на вызов функции и щелкните стрелку рядом с появившейся лампочкой:
- Щелкните по фразе «Сгенерировать метод…». Псоле этого у нас готово объявление функции:
- Удалите строку внутри функции.
- Теперь необходимо добавить код функции. Но сначала попросим пользователя ввести числа последовательности.
- Чтобы постоянно не печатать класс
Console
иMath
, подключите их в виде директив в самом начале кода: - Теперь нет необходимости полностью печатать
Console.ReadLine()
илиConsole.WriteLine(...)
, достаточно напечататьReadLine()
илиWriteLine(...)
. - Попросите пользователя ввести последовательность:
- Чтобы ввести числа последовательности необходимо использовать цикл
do..while
: - Внутри цикла необходимо проверять элементы последовательности на максимум и минимум.
- Теперь осталось вывести
min
иmax
значения в функцииMain
: - Запустите приложение и проверьте результат.
... int max = int.MinValue; int min = int.MaxValue; ...
int max = int.MinValue; int min = int.MaxValue; MinmaxSeq(ref max, ref min); // новый код
... private static void MinmaxSeq(ref int max, ref int min) { WriteLine("Введите последовательность и закончите ввод нулем"); } ...
int a; do { a = Int32.Parse(ReadLine()); } while (a != 0);
... if (a > max && a != 0) { max = a; } if (a < min && a != 0) { min = a; } ...
Выполнить: Создайте функцию PosNegSeq()
, которая принимает два аргумента по ссылке — счетчики положительных чисел последовательности и отрицательных чисел. Пользователь вводит последовательность целых чисел, завершая ввод 0
. Функция должна посчитать количество отрицательных и положительных чисел и вернуть значения счетчиков в главную программу.
Указание 1: Функция не должна возвращать значение (поэтому используется ключевое слово void
в объявлении функции). Параметр ref
— это параметр ввода-вывода, что означает, что значения параметров будут изменены внутри функции и возвращены в основную программу.
Указание 2: Параметры ref должны быть инициализированы до вызова функции. Поэтому сначала вам необхзодимо инициализировать такие параметры значениями. Установите начальные значения для этих параметров, равные 0
:
... int counterPositive = 0; int counterNegative = 0; ... |
[Название проекта: Lesson_5Task7
, название файла L5Task7.cs
]
Пример вывода:
Введите последовательность, завершите ввод 0 2 -4 8 -3 5 0 кол-во отрицательных: 2, количество положительных: 3