Си шарп как сделать функцию

Добавил пользователь Алексей Ф.
Обновлено: 08.09.2024

Backend-разработка и создание утилит командной строки невозможно без консольного ввода\вывода. В рамках данной статьи будут рассмотрены методы класса Console для чтения и записи информации в консоль.

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Консольный ввод\вывод

Класс Console. Вывод данных в консоль

Класс Console содержит методы для работы с консольным вводом\выводом, управлением потоком с ошибками и окном консоли. Начнем с вывода информации в консоль, для решения этой задачи класс Console предоставляет два метода: Write и WriteLine.

Для знакомства с методами класса Console создайте в удобном для вас каталоге проект с именем CSharpLesson3:

Метод Write

Метод Write – направляет в стандартный выходной поток текстовое представление переданного в него объекта. Дополнительно, предоставляет возможность задать форматирование.

Откройте файл Program.cs в созданном ранее проекте и добавьте в метод Main следующие строки, демонстрирующие работу с методом Write:

Более подробно про форматирование будет написано в уроке, посвященном работе со строками.

Сохраните документ, откройте консоль, перейдите в каталог с проектом и выполните команду:

Результат работы программы будет выглядеть примерно следующим образом:

Обратите внимание на первые три вызова метода Write, если не поставить символ перевода строки, то данные будут выдаваться в одну строку друг за другом, это не всегда удобно. Если требуется, чтобы вывод каждый раз осуществлялся с новой строки, то воспользуйтесь методом WriteLine.

Метод WriteLine

Метод WriteLine записывает указанные данные в выходной поток и добавляет символ перевода строки. Добавьте в программу следующие строки:

Теперь надпись “Текущая дата:” и дата со временем будут выведены в разных строках.
WriteLine (также как Write) может принимать не только строковые значения, но и переменные разных типов:

Удобным и наглядным способом вывода значений переменных в консоль с дополнительным текстовым пояснением является использование строковой интерполяции:

Запустите проект и в консоли увидите результат выполнения программы:

Прием интерполяции позволяет внутри строки, используя фигурные скобки, указывать имена переменных, которые будут заменены значениями. Перед такой строкой ставится знак $.
Методы WriteLine и Write позволяют использовать форматирование:

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

Класс Console. Чтение данных из консоли

В классе Console, помимо рассмотренных выше методов вывода в консоль, присутствуют методы для считывания вводимых данных из консоли.

Метод Read

Метод Read возвращает числовой код последнего введенного символа во входном потоке, если символ введен не был, то будет возвращен код -1. Для завершения работы метода, после ввода символа необходимо нажать клавишу “Enter”. Рассмотрим работу с методом Read на примере:

Если после надписи “Нажмите любую клавишу, а затем Enter” будет введено более одного символа, то Read вернет только первый.

Для представления кода в виде символа необходимо переменную key1 привести к типу Char, для этого можно воспользоваться методом Convert.ToChar().

Метод ReadLine

Метод ReadLine возвращает введенную строку символов до нажатия клавиши “Enter”. Добавим несколько строк в файл с исходным кодом, для демонстрации работы с методом ReadLine :

Если необходимо получить с консоли численные данные, то следует воспользоваться методами из класса Convert для приведения типа String к соответствующему числовому типу:

Метод ReadKey

ReadKey возвращает объект класса ConsoleKeyInfo, в который помещается информация о нажатой клавише. Этот метод, как правило, используют для остановки выполнения программы или чтобы получить ответ от пользователя. Добавим строки для работы с ReadKey:

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Работая с этим сайтом, Вы даете согласие на использование файлов Cookie.

Класс Math для работы с математическими функциями

  • PI - число p;
  • E - число e.

Методы определения модуля и получения знака — Abs , Sign

  • -1 для отрицательного числа,
  • 0 для нуля,
  • 1 для положительного числа.

Методы определения минимума и максимума — Min , Max

Методы Min() и Max() возвращают соответственно минимальное или максимальное значение из двух чисел, переданных этим методам в качестве аргументов. Эти методы работают со всеми базовыми числовыми типами данных, но при условии, что типы двух передаваемых аргументов совпадают.
Рассмотрим пример поиска минимального элемента в массиве из 10 элементов с использованием метода Min() .

using System;
namespace MyProgram
class Program
static void Main( string [] args)
int []a = new int [10];
Random rnd = new Random ();
for ( int i = 0; i Console .Write( " " ,a[i]);
>
Console .WriteLine();
int min = a[0];
for ( int i = 1; i Console .WriteLine( "Минимальное значение: " + min);
Console .ReadKey();
>
>
>

image articles/523/523_1.jpg

Методы округления

  • Round( double Число, int КоличествоРазрядов) , Round( decimal Число, int КоличествоРазрядов) — округляет указанное число до указанного числа десятичных разрядов после запятой.
  • Round( double Число) , Round( decimal Число) — округляет указанное число до ближайшего целого по правилам арифметики.
  • Round( double Число, int КоличествоРазрядов, MidpointRounding ) , Round( decimal Число, int КоличествоРазрядов, MidpointRounding ) — округляет указанное число до указанного числа десятичных разрядов после запятой. Третий аргумент задает правила округления если значение находится ровно посередине между двумя числами и может принимать значения:
    • MidpointRounding .AwayFromZero - до ближайшего числа в сторону большего по модулю значения;
    • MidpointRounding .ТоEven - до ближайшего четного числа.

    using System;
    namespace MyProgram
    class Program
    static void Main( string [] args)
    double a = double .Parse( Console .ReadLine());
    Console .WriteLine( "Math.Round(a, 3)"
    + Math.Round(a, 3));
    Console .WriteLine( "AvayFromZero "
    + Math.Round(a, 3, MidpointRounding .AwayFromZero));
    Console .WriteLine( "ToEven "
    + Math.Round(a, 3, MidpointRounding .ToEven));
    Console .ReadKey();
    >
    >
    >

    image articles/523/523_3.jpg

    image articles/523/523_4.jpg

    image articles/523/523_2.jpg

    • Ceiling( double число) , Ceiling( decimal число) - округление до ближайшего целого числа в большую сторону.
    • Floor( double число) , Floor( decimal число) - округление до ближайшего целого числа в меньшую сторону.
    • Truncate( double число) , Truncate( decimal число) - отбрасывает дробную часть числа.

    using System;
    namespace MyProgram
    class Program
    static void Main( string [] args)
    double a = double .Parse( Console .ReadLine());
    Console .WriteLine( "Ceiling: " + Math.Ceiling(a));
    Console .WriteLine( "Floor: " + Math.Floor(a));
    Console .WriteLine( "Truncate: " + Math.Truncate(a));
    Console .ReadKey();
    >
    >
    >

    image articles/523/523_5.jpg

    image articles/523/523_6.jpg

    Методы тригонометрических функций

    Для вычисления тригонометрических функций класс Math предусматривает ряд методов. Все методы оперируют значениями углов типа double , заданными в радианах и возвращают значение типа double .
    Если угол задан в градусах, его можно перевести в радианы при помощи формулы:

    • Sin(угол) - вычисление синуса угла.
    • Cos(угол) - вычисление косинуса угла.
    • Tan(угол) - вычисление тангенса угла.
    • Asin(значение) - вычисление арксинуса значения из диапазона [-1; 1], возвращаемое значение лежит в диапазоне [-p/2; p/2].
    • Acos(значение) - вычисление арккосинуса значения из диапазона [-1; 1], возвращаемое значение лежит в диапазоне [0; p].
    • Atan(значение) - вычисление арктангенса значения, возвращаемое значение лежит в диапазоне [-p/2; p/2].
    • Sinh(угол) - вычисление гиперболического синуса угла.
    • Cosh(угол) - вычисление гиперболического косинуса угла.
    • Tanh(угол) - вычисление гиперболического тангенса угла.

    Логарифмические функции

    • Exp( double степень) - возвращает значение числа e ( Math .E ) в указанной степени.
    • Log( double число) - возвращает натуральный логарифм указанного числа.
    • Log10( double число) - возвращает десятичный логарифм указанного числа.
    • Log( double число, double основание) - возвращает логарифм указанного числа по указанному основанию.

    Возведение в степень и извлечение квадратного корня

    Для возведения числа в степень предусмотрен метод Pow( double , double ) , в качестве первого аргумента которого указывается число, возводимое в степень, а в качестве второго аргумента — показатель степени.
    Для извлечения квадратного корня из числа типа double можно также использовать метод Sqrt( double ) .

    Автор: Вставская Елена Владимировна

    Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

    С переходом от императивного языка C к объектно-ориентированному языку C++ понятие функции (как подпрограммы) сохранилось, однако каждая функция стала принадлежать какому-либо классу. Отметим что в С++ были добавлены специальные функции – конструкторы и деструкторы.

    Разберемся с терминами и понятиями более подробно.

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

    Авторы языка определили, что функции-члены — это члены, которые обеспечивают некоторую функциональность для манипулирования данными класса. Они включают методы, свойства, конструкторы, финализаторы (деструкторы в С++), операции и индексаторы.

    Для начинающего программиста важно освоить, прежде всего, работу с методами класса, а по сути (в прежнем понимании) – с функциями как подпрограммами. К этому добавим работу с конструкторами классов, а все остальное будет рассмотрено позже.

    Шаблон объявления метода

    Возврат из метода и возврат значения

    Если метод возвращает значение, то для указания точки выхода должен использоваться оператор возврата return вместе с возвращаемым значением. Если метод не возвращает ничего, то в качестве типа возврата указывается void (опустить тип возврата невозможно).

    Если метод не принимает параметров, то все равно после имени метода должны присутствовать пустые круглые скобки (. ). При этом включать в тело метода оператор возврата не обязательно — метод возвращает управление автоматически по достижении закрывающей фигурной скобки.

    В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.

    Использование параметров

    При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром.

    Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.

    Два способа передачи параметров. В общем случае параметры могут передаваться методу либо по значению, либо по ссылке в зависимости от типа данных.

    Если переменная, указанная в списке параметров, относится к типу значений (int, double, bool и т.п.), то вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней, выполненные внутри метода будут утеряны.

    Если переменная из списка параметров относится к ссылочному типу (например, массив), то параметр передается по ссылке, вызываемый метод получает саму переменную, поэтому любые изменения, которым она подвергнется внутри метода, останутся в силе после его завершения.

    Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

    Передача структуры (struct) как параметра через ее имя также произойдет через копирование (помните, структура относится к типу значений).

    Если же для каких-либо типов данных необходима передача по ссылке (она более эффективна при большом объеме данных, который приходится копировать), то перед указанием типа параметра достаточно указать модификатор ref (reference – ссылка, англ.).

    Рассмотрим три примера.

    ПРИМЕР 1. В статье Первая программа на языке Си шарп мы разбирали программу:

    В классе Program объявляется метод Main() (главная функция приложения), при выполнении которого вызываются два метода класса Console: WriteLine() (вывод строки текста) и ReadKey() (чтение символа с клавиатуры).

    Ключевое слово static означает, что данный метод принадлежит классу Program.

    Модификатор void указывает, что метод не возвращает никаких параметров.

    Метод Main() в качестве списка параметров имеет массив строк. Отметим, что список параметров args в Main() пропустить. Метод WriteLine() имеет один параметр – строку, метод ReadKey() параметров не имеет.

    ПРИМЕР 2. Объявление метода в примере Вычисление функции sin(x) выглядит так:

    Параметром (аргументом) функции объявляется переменная x типа double, метод возвращает результат также типа double (последний оператор метода return s;). Метод является статическим. Для вызова метода достаточно написать оператор y=Sin2(x);

    ПРИМЕР 3. Передача параметров по значению, ссылке и через статическую переменную

    Объявим в классе Program структуру West с двумя полями, статическую переменную f и метод vp( ):
    static void vp(int[] b, West u, string t, double d, ref decimal y)
    где b – массив, u – структура, t – строка, d – вещественное число, y – десятичный тип, передается по ссылке (модификатор ref).

    В методе изменим эти переменные, а также и f для того, чтобы проверить способы передачи параметров (копированием или по ссылке).

    Напечатаем эти значения до и после вызова метода vp().

    48

    Результат:

    Обратите внимание, что второй элемент массива a[1], десятичное число x (передаваемое через ссылку — ref) и статическая переменная f изменились, а структура u, строка t и вещественное число d не изменились.

    Отметим, что статическое поле f, объявленное в классе, доступно методам этого класса без механизма передачи параметров.

    Некоторые итоги:

    1) переменные, объявленные внутри метода или в списке его параметров, являются локальными переменными;

    2) при вызове метода параметры из списка в заголовке метода либо копируются в локальные переменные метода, либо передаются по ссылке;

    3) копируются все встроенные типы значений, структуры и (по сути) строки, хотя и они относятся к ссылочным типам;

    4) по ссылке передаются массивы и другие объекты. Если их поля будут изменены внутри вызываемого метода, то эти изменения сохранятся при возврате в вызывающий метод;

    7) для доступа к данным-членам и функциям-членам других классов необходимо указать имя класса, поставить точку, указать имя члена класса, например: Math.PI — константа, число пи=3,14158… , Math.Tan(x) — тангенс числа x, заданного в радианах;

    8) доступ к членам других классов зависит от уровня его приватности (public, но не private или protected).

    Завершим раздел рассмотрением двух из трех ключевых принципов ООП — наследования и полиморфизма, считаю принцип инкапсуляции (объединение данных и и методов в класс) уже достаточно ясным.

    Объявление методов

    Каждый параметр состоит из имени типа параметра и имени, по которому к нему можно обратиться в теле метода. Вдобавок, если метод возвращает значение, то для указания точки выхода должен использоваться оператор возврата return вместе с возвращаемым значением.

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

    Возврат из метода и возврат значения

    В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения (возврат значения).

    Давайте рассмотрим пример:

    Вызов из метода

    Использование параметров

    При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром. Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.

    В общем случае параметры могут передаваться методу либо по значению, либо по ссылке. Когда переменная передается по ссылке, вызываемый метод получает саму переменную, поэтому любые изменения, которым она подвергнется внутри метода, останутся в силе после его завершения. Но если переменная передается по значению, вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней по завершении метода будут утеряны. Для сложных типов данных передача по ссылке более эффективна из-за большого объема данных, который приходится копировать при передаче по значению.

    Давайте рассмотрим пример:

    Обратите внимание, что значение i осталось неизменным, но измененные значения в myArr также изменились в исходном массиве arr1, так как массивы являются ссылочными типами.

    Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

    Читайте также: