Урок 5. Методы и функции в C#

Дата изменения: 25 февраля 2021
Лабораторные работы си шарп и задания по теме «Язык программирования c sharp: Методы и функции в си шарп»

Урок № 5. C# Теория

Сочетания клавиш для запуска и отладки приложений

    Ctrl + F5 запуск приложения без отладки
    F5 запуск приложения с отладкой
    Shift + F5 остановка отладки
    F9 вставка / удаление точки останова
    F10 шаг без захода в метод (во время отладки)
    F11 шаг с заходом в метод (во время отладки)
    Ctrl + Shift + F5 перезапуск отладки
    Shift + F11 шаг с выходом из метода (во время отладки)
    Ctrl + m + m свернуть код метода, когда курсор находится в каком-то месте этого кода; чтобы развернуть его, используйте ту же комбинацию клавиш

Объявление методов и функций

  • Методы позволяют нам инкапсулировать поведение и функциональность в объекты, которые мы создаем в нашем коде.
  • Метод объявляется с использованием сигнатуры.
  • Сигнатура метода состоит из:
      
    Модификатор доступа — откуда этот метод может быть вызван. Некоторые из них:

  • private — наиболее ограничительный, допускающий доступ к методу только из содержащего его класса или структуры
  • public — доступ из любого фрагмента кода в рамках приложения
  • protected — позволяет получить доступ из содержащего класса или из производных классов
  • internal — доступ из файлов внутри одной сборки
  • static — указывает, что метод является статическим членом класса, а не членом экземпляра конкретного объекта
  • Тип возвращаемого значения — используется для указания типа возвращаемого значения. Используйте void, если метод не возвращает значение
  • Идентификатор (имя) метода — все методы должны иметь идентификатор (имя), чтобы была возможность вызывать метод в коде. Правила идентификаторов применяются и к именам методов
  • Список аргументов (параметров) — разделенный запятыми список аргументов, передаваемых в метод
  • Пример функции (метода):

    public Boolean StartService(string serviceName)
    {
       // код функции
    }

    В примере:
    public модификатор доступа,
    Boolean тип возвращаемого значения,
    StartService идентификатор (имя),
    string serviceName параметр (аргумент).

  • Чтобы вернуть значение из функции, используйте оператор:
  • return выражение;
  • Если вместо возвращаемого типа у нас присутствует ключевое слово void, то это означает, что функция не вернет никакого значения.
  • static void SayHello()
    {
     Console.WriteLine("Hello");
    }
  • Можно определить функцию в том же классе, что и функцию Main(), или определить ее в другом классе.
  • Все методы или функции в си шарп должны быть статическими, что означает, что их можно вызвать без создания класса объекта.
  • Чтобы методы (функции), описываемые в одном классе, сделать видимыми в другом, они должны быть описаны с помощью модификатора доступа public
  • Если метод (функция) вызывается в том же классе, модификатор доступа public не требуется.

Вызов метода / функции

  • Чтобы вызвать метод в c sharp, необходимо указать имя метода и указать в скобках все аргументы, соответствующие параметрам метода.
  • 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;
            }

    В этом примере:
    aref аргумент (входно-выходной);
    resout аргумент (выходной).

    Возврат значения из функции / метода

    Три подхода для возврата значений в си шарп:

  • Возврат массива или коллекции
  • Использование ключевого слова 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";
            }

    Перегрузка методов / функций

  • Перегрузка обозначает наличие метода с тем же именем, но разными сигнатурами.
  • Задания и лабораторные си шарп

    Лабораторная работа 1. Функция, суммирующая два аргумента

    Выполнить: Создайте метод Sum(), который принимает два целочисленных аргумента и суммирует их. Метод не возвращает никакого значения (именно поэтому вы должны использовать ключевое слово void).

    Указание: Необходимо использовать ключевое слово static в сигнатуре метода, потому что основная функция статична, и мы не можем вызвать нестатический метод из статического метода.

    Пример выполнения:

    Введите два числа
    20 40 
    Сумма 20 + 40 = 60
    

    [Название проекта: Lesson_5Lab1, название файла L5Lab1.cs]

    ✍ Алгоритм:

    • Запустите Visual Studio.
    • Создайте консольное приложение, назовите проект Lesson_5Lab1.
    • В окне Solution Explorer (Обозреватель решений) найдите файл Program.cs и переименуйте его в L5Lab1.cs.
    • В главной функции запросите пользователя ввести два числа:
    • ...
      Console.WriteLine("Введите два числа");
      int a = int.Parse(Console.ReadLine());
      int b = int.Parse(Console.ReadLine());
      ...
      
    • Поместите курсор после закрывающей фигурной скобки функции Main() и нажмите клавишу enter. Мы делаем это потому, что нельзя помещать методы/функции внутри другой функции.
    • Объявите новый метод Sum(), который будет использоваться для суммы переданных в него значений:
    • ...
      static void Sum(int first, int second)
      {
          int sum = first + second;
          Console.WriteLine($"Сумма {first} + {second} = {sum}");
      }
      ...
      
      Метод не возвращает никакого значения основной программе, поэтому мы должны использовать ключевое слово void.
    • Теперь мы можем вызвать этот метод из основной функции. Введите следующий код в фигурные скобки Main():
    • static void Main(string[] args)
              {
                  ...
                  Sum(a, b);
              }
    • Щелкните CTRL+F5, чтобы запустить приложение без отладки.
    • Созданная нами функция Sum() не возвращает значения. Теперь мы изменим этот метод так, чтобы он возвращал результат вызывающему методу (основному методу, откуда он был вызван).
    • Закоментируйте код функции Sum(), используя горячие клавиши [CTRL]+k+c:
    • //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(...)).
      Обратите внимание, что имена параметров, которые мы указали здесь в сигнатуре метода, могут не совпадать с именами аргументов, которые мы передали. Эти параметры становятся локальными переменными в рамках этого метода.
    • Затем нам нужно изменить способ вызова метода. Объявите целочисленную переменную (в функции Main()), чтобы получить возвращаемое значение. Выведите результат в окно консоли
    • ...
      static void Main(string[] args)
        {
           int result = Sum(a, b);
           Console.WriteLine($"Сумма {a} + {b} = {result}");
        }
      ...
      
    • Запустите приложение. Результаты должны быть одинаковыми.
    •   
      Перегрузка метода / функции:

      Перегрузка метода означает наличие метода с тем же именем, но разными сигнатурами (обычно с разным количеством параметров).
    • Давайте теперь перегрузим наш метод Sum(). Для этого мы создадим два дополнительных метода с одинаковыми названиями.
    • Поместите курсор после метода Sum(). Сначала создайте метод, который принимает три целых числа:
    • static int Sum(int first, int second, int third)
      {
          int sum = first + second + third;
          return sum;
      }
      
    • Этот метод использует то же имя, что и предыдущий метод Sum(), который принимает два целых числа, но параметры здесь указывают, что метод ожидает три целых числа в качестве аргументов. Компилятор «узнает», какой метод следует вызвать, основываясь на количестве переданных аргументов.
    • Затем введите следующий код для создания метода Sum(), принимающего два вещественных аргумента (типа double):
    • ...
      static double Sum(double first, double second)
      {
          double result = first + second;
          return result;
      }
      ...
      
    • Наконец, измените код в Mai (), который вызывает данные методы:
    • 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}");
      }
      
    • Запустите приложение еще раз и проверьте выходные данные. Вы должны увидеть правильные результаты суммы для всех трех различных вызовов. Несмотря на то, что у всех них идентификатор Sum, компилятор выбирает правильный метод для вызова на основе сигнатуры метода. Именно так работает перегрузка метода.
    Задание 1:

    Выполнить: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter(), которая вычисляет периметр треугольника по длинам трех его сторон.
      
    Указание 1: Метод Perimeter() должен принимать в качестве аргументов три целых числа.
    Указание 2: Метод не должен возвращать никакого значения, поэтому вы должны использовать ключевое слово void в сигнатуре:

    static void Perimeter(...);

    Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:

    int a = int.Parse(Console.ReadLine());

      
    Пример выполнения:

    Введите значения для трех сторон треугольника:
    3 5 6
    Периметр: 14
    

      
    [Название проекта: Lesson_5Task1, название файла L5Task1.cs]

    Задание 2:

    Выполнить: Необходимо переделать предыдущую задачу, теперь функция периметр должна возвращать целое значение. Напомним задание: Вводятся три числа — длины трех сторон треугольника. Создайте функцию Perimeter(), которая вычисляет периметр треугольника по длинам трех его сторон.
      
    Указание 1: Метод Perimeter() должен принимать в качестве аргументов три целых числа.
    Указание 2: Метод должен возвращать значение типа integer, поэтому вы должны использовать ключевое слово int в сигнатуре:

    static int Perimeter(...);

    Указание 3: Не забудьте преобразовать введенные значения в целые числа. Например:

    int a = int.Parse(Console.ReadLine());

     
      
    Пример выполнения:

    Введите значения для трех сторон треугольника:
    3 5 6
    Периметр: 14
    

     
    [Название проекта: Lesson_5Task2, название файла L5Task2.cs]

    Лабораторная работа 2. Построение экспоненциальной функции

    Выполнить: Создайте метод 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:
    • static int GetPow(int baseNum, int powNum) {…}
      Функция принимает два целых числа — аргумент baseNum и аргумент powNum. Внутри функции необходимо возвести baseNum в степень powNum.
    • Объявите переменную result для хранения результата и возврата этого значения из функции.
    • int result = 1;
      …
      return result;
    • Внутри функции создайте цикл, в котором накапливается произведение числа. Цикл должен выполнится powNum раз:
    • for (int i=0; i<powNum; i++)
      {
      result = result * baseNum;
      }
      В первую итерацию цикла всегда будет выполняться 1 * baseNum, результат сохраняется в переменной result. За две итерации имеем baseNum * baseNum. За три – baseNum * baseNum * baseNum и т. д. Мы повторяем это действие каждую итерацию.
    • Вызовите созданный метод внутри функции Main:
    • Console.WriteLine("Число {baseNum} возведенное в степень {powNumNum}  = {GetPow(2,4)} ");
    • Запустите приложение и посмотрите на результат.
    • Теперь вместо конкретных чисел (2 и 4) запросите эти числа у пользователя. Затем измените код вызова функции:
    • Console.WriteLine ("Введите два числа – число и степень числа: ");
      int a = Int32.Parse(Console.ReadLine());
      int b = Int32.Parse(Console.ReadLine());
      Console.WriteLine(GetPow(a,b));
    • Запустите приложение и протестируйте результат с разными значениями.
    • Сохраните проект.

    Задание 3:

    Выполнить: Создайте метод 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]

    Задание 4:

    Выполнить: Необходимо переделать предыдущее задание. Создайте метод 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]

    Лабораторная работа 3. Ref аргументы (аргументы ввода-вывода)

    Выполнить: Создайте метод 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 попросите пользователя ввести два числа. Присвойте введенные значения переменным:
    • ...
      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());
      ...
      
    • Для добавления метода установите курсор после тела функции Main().
    • Объявите методMinmax(), который будет менять значения переменных, если это потребуется. Используйте модификатор ref для аргументов:
    • ...
      static void Minmax(ref int a, ref int b)
      {
          ...
      }
      ...
      
      Модификатор ref используется для того, чтобы значение аргумента передалось из основной программы в создаваемую функцию и, наоборот, из функции измененное значение должно возвратиться в основную программу. Ref аргументы должны быть инициализированы до их вызова, иначе возникнет ошибка. При вызове модификатор ref также указывается.
    • Найдите максимальное и минимальное значения, используя стандартные функции Min() и Max(). Присвойте найденные значения соответствующим переменным (первый аргумент должен быть больше второго):
    • 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.
    • Теперь можно вызвать созданный метод из функции Main:
    • ...
       Minmax(ref a,ref b);
       Console.WriteLine($"Результат после метода Minmax: {a}, {b}");
      ...
      
    • Запустите приложение и проверьте результат.
    • Чтобы свернуть или развернуть код какого-либо метода, можно использовать горячие клавиши Ctrl+M (дважды).
    • Перегруженный метод (функция):

    • Установите курсор после метода Minmax() и создайте перегруженный метод (с таким же именем) для трех аргументов:
    • ...
       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 еще раз, так как значения переменных могли уже поменяться к этому моменту.
    • Наконец добавьте вызов метода из функции Main():
    • ...
       Minmax(ref a,ref b, ref c);
       Console.WriteLine($"After overloaded Minmax the result is: {a}, {b}, {c}");
      ...
      
    • Запустите приложение и проверьте результат. Несмотря на то, что имена у созданных методов одинаковы, компилятор вызовет нужный метод, исходя из количества аргументов.

    Задание 5:

    Выполнить: Вводится двузначное целое число. Создайте метод ChangeDigits(), который принимает введенный аргумент по ссылке и изменяет его значение так, чтобы первая цифра нового числа была второй цифрой введенного числа и, наоборот, вторая цифра нового числа была первой цифрой введенного числа. Например, если ввести 45, то результирующее число будет равно 54.
      
    Указание 1: Метод ChangeDigits() принимает аргумент с модификатором ref.
    Указание 2: Метод не возвращает значения:

    static void ChangeDigits(...);

    Указание 3: Сначала необходимо получить цифры из числа. Затем, поменяв местами цифры, сделать новое число. Пример создания нового числа из двух цифр:

    если даны цифры 2, 3
    2*10 + 3 = 23
    

      
    Пример выполнения:

    Введите двузначное число:
    58
    Результат: 85
    

      
    [Название проекта: Lesson_5Task5, название файла L5Task5.cs]

    Задание 6:

    Выполнить: Вводятся два двузначных целых числа. Создайте функцию BitwiseSum(), которая вычисляет их побитовую сумму по модулю 10. Например, побитовая сумма чисел 34 и 59 является числом 83 (3 + 5 = 8; 4 + 9 = 13, 13%10 = 3).
      
    Указание 1: Функция BitwiseSum() имеет два аргумента.
    Указание 2:Функция возвращает целочисленное значение int:

    static int BitwiseSum(...);

    Указание 3: Сначала необходимо получить цифры из числа. Затем, поменяв местами цифры, сделать новое число. Пример создания нового числа из двух цифр:

    если даны цифры 2, 3
    2*10 + 3 = 23
    

     

    Введите двузначное число:
    34 59
    Побитовая сумма чисел 34 и 59 = 83
    

      
    [Название проекта: Lesson_5Task6, название файла L5Task6.cs]
     

    Lab 4. Ref arguments (input-output arguments)

    To do: Create MinmaxSeq() method that takes two integer arguments by reference, they are minimum and maximum values of the inputted sequence. User must input the sequence of integers and finish the inputting by entering 0. The method has to find a minimum and maximum and come back them to the Main function.

    Note 1: The method returns no value (which is why you have to use void in a signature). ref arguments are input-output arguments, which means that their values are changed within the method and passed from within the method to the main program.
    Note 2: We need to use static in the method signature because the Main function is static and we cannot call a non-static method from a static method.

    [Solution and Project name: Lesson_5Lab4, file name L5Lab4.cs]

    The resulting examples:

    Please enter the sequence, input 0 when it ends
    2  4  8  3  0
    minimum is: 2, maximum is: 8
    

    ✍ Algorithm:

    • Create Console Application with the name Lesson_5Lab4.
    • In the Solution Explorer window find a file Program.cs and rename it into L5Lab4.cs.
    • In the Main function declare two variables — to store a minimum and maximum values. Assign them the start values: for min variable the start value has to be the greatest value among integers, for max the start value has to be the smallest value within all the integers:
    • ...
      int max = int.MinValue;
      int min = int.MaxValue;
      ...
      
    • Our function/method will have the name MinmaxSeq() and it will take two arguments by reference — the variables min and max. First let’s call our method from within the Main function, just under initializations of min and max:
    •   int max = int.MinValue;
        int min = int.MaxValue;
        MinmaxSeq(ref max, ref min); // new code
      
    • C# can add the signature of the functions itself. Let’s ask it to do it. You have to hover the mouse above the calling of the function and click on the arrow next to the light bulb:
    • Click on the phrase «Generate method…». After, we have the ready signature for our method:
    • Clear the line inside of the function out.
    • Now we have to write down the code of the function. At first, we must request the user to input the sequence.
    • In order not to print always the classes Console and Math out, we can include them right in the beginning of the editor window:
    • Since now you don’t need to print Console.ReadLine() or Console.WriteLine(...), it is enough to print just ReadLine() or WriteLine(...).
    • Request the user:
    • ...
        private static void MinmaxSeq(ref int max, ref int min)
              {
                  WriteLine("Please enter the sequence, input 0 when it ends");
              }
      ...
      
    • To input the numbers of the sequence we will create the do..while loop:
    •     int a;
          do
          {
             a = Int32.Parse(ReadLine());
          }
          while (a != 0);
      
    • Within the loop, check to see if the value of variable a is maximum or minimum and reassign the values of max and min.
    •    ...
         if (a > max && a != 0) { max = a; }
         if (a < min && a != 0) { min = a; }
         ...
      
    • All we have to do now, it is to output the values of min and max in the Main function:
    • Run the application and check the output.
    • To upload the file into the moodle system, find the solution folder on the computer (d:\Projects\Lesson_5Lab4\) and upload the file L5Lab4.cs.

    Task 7 for Lesson #5:

    To do: Create PosNegSeq() method that takes two integer arguments by reference, they are counters for positive and negative values of the inputted sequence. User must input the sequence of integers and finish the inputting by entering 0. The method has to count positive and negative of the inputted numbers and return the values of counters to the main function.

    Note 1: The method returns no value (which is why you have to use void in signature). ref arguments are input-output arguments, which means that their values are changed within the method and passed from within the method to the main program.
    Note 2: A ref arguments have to be initialized before the calling of the function. So, first, you have to do is to initialize the arguments. The start value for the counters — the arguments of the function — is 0:

    ...
    int counterPositive = 0;
    int counterNegative = 0;
    ...

      
      
    [Solution and Project name: Lesson_5Task7, file name L5Task7.cs]
      
    The resulting example:

    Please enter the sequence, input 0 when it ends
    2  -4  8  -3  5  0
    counter for positive is: 3, counter for positive is: 2
    

    Приложения для windows forms

    Lab 5. Пользовательские функции

    To do: Создайте проект для вычисления факториала числа. Вычисление должно быть оформлено в виде пользовательской функции. Запускать функции следует по щелчку на кнопке Вычислить (btnCalc). Выводить результата следует в текстовое поле (txtFactorial).

    [Solution and Project name: Lesson_5Lab5, file name L5Lab5.cs]

    ✍ Решение:

    1. Создайте новый проект и самостоятельно разработайте интерфейс новой формы.
    2. Необходимо создать функцию пользователя. Щёлкните дважды по кнопке. Во открывшемся окне добавьте код перед кодом для кнопки:
    3. private long Factorial(int n)
              {
                 //...
              }
      Как мы видим из описания функции, ее аргументом будет являться целое число (n), а значение (возвращаемое значение) будет типа Long.
    4. В тело функции необходимо поместить следующий код:
    5. long p = 2;
      for (int i = 3; i <= n; i++)
          p = p * i;
      return p;
    6. Теперь, чтобы вычислить значение факториала при нажатии кнопки Вычислить, необходимо запрограммировать событие Click кнопки следующим образом:
    7. int numb;
                  if (int.TryParse(txtN.Text, out numb))
                  {
                      txtFactorial.Text = Factorial(numb).ToString();
                  }
                  else
                      MessageBox.Show("введите число");
      Метод TryParse() используется для проверки введенного числа. Если введено действительно число, то результат преобразования в целое число сохранится в переменной numb. При вводе неверного значения выводится сообщение.
    8. Запустите и отладьте приложение.
    9. Программа работает, но есть недостаток. Так как наша функция описана с помощью оператора Private, то доступна она будет только из модуля данной формы. Для того чтобы сделать ее доступной для любого модуля нашего приложения, необходимо описать ее в стандартном модуле, исправив Private на Public:
    10. С помощью меню Project (Проект) и пункта Add Class (Добавить класс) добавьте в Ваш проект стандартный класс, изменив ключевое слово private на public и добавив static.
    11. class Class1
          {
              public static long Factorial(int n)
              {
                  long p = 2;
                  for (int i = 3; i <= n; i++)
                      p = p * i;
                  return p;
              }
          }
    12. В коде для кнопки измените вызов функции на Class1.Factorial(numb).ToString().
    13. Запустите и отладьте программу.
    Дополнительное задание:

    1. Добавьте в стандартный модуль описание следующей функции: xn, n – натуральное число. Измените внешний вид формы.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    *
    *


    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить