Введение в программирование на языке C#

Visual Studio

Microsoft Visual Studio – интегрированная среда разработки (IDE), поддерживающая языки программирования C, C++, C#, F#, Python и Visual Basic. В общем смысле, IDE - это продвинутый текстовый редактор, обладающий функциями подсветки синтаксиса, управления файлами проектов и интегрированного отладчика.

Наиболее крупной единицей управления файлами в Visual Studio является решение (Solution). В каждый момент времени в IDE может быть открыто только одно решение. Внутри решения может содержаться произвольное число проектов. Проекты, в свою очередь, содержат отдельные файлы с кодом или данными. Каждый проект характеризуется типом (приложение или библиотека) и языком программирования, используемым в нем. В рамках одного решения могут объединяться проекты на разных языках программирования.

При открытом решении, нажатие комбинации клавиш Ctrl+Shift+B приведет к сборке решения, т.к. компиляции всех проектов, входящих в него. Нажатие Ctrl+B соберёт текущий активный проект решения. Нажатие F5 произведет сборку и последующий запуск текущего проекта под контролем отладчика. При возникновении ошибок в процессе компиляции, IDE предложит пользователю либо отменить запуск, либо запустить последний успешно скомпилированный вариант.

При создании нового проекта Visual Studio предложит пользователю выбор среди множества готовых шаблонов проектов. Наиболее распространенными шаблонами являются консольное приложение, приложение Windows Forms и библиотека классов.

Основы синтаксиса C#

Минимальный код консольного приложения на языке C# имеет следующий вид:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Здесь

Код методов, в общем случае, представляется последовательностью высказываний (statements), разделенных символом “;”. Некоторые высказывания являются составными, т.е. содержат другие высказывания. Рассмотрим наиболее часто используемые виды высказываний.

Объявление переменных и инициализация

int x = 123;

Здесь int - тип переменной, x - её имя, а справа от символа “=” располагается инициализатор. Имена переменных могут содержать строчные и прописные латинские и кириллические буквы, а так же цифры, однако не могут начинаться с цифры.

Модификация переменных

В C# (как и во многих императивных языках программирования) символ “=” означает не “равно”, а “становится равно”. Как следствие, код, изменяющий значение переменной, имеет вид

x = x + 1;

Не смотря на то, что в математике данное высказывание не имеет смысла, в императивном программировании оно читается как “значение переменной x становится равным значению переменной x плюс 1”.

Арифметические операции

Операции сложения, вычитания, умножения и деления производятся с помощью операторов +, -, * и /, соответственно.

Оператор % вычисляет остаток от деления первого операнда на второй. Например, 5 % 2 даст 1.

Выражение Math.Pow(x, y), где x и y - числа или переменные, возводит x в степень y.

Выражение Math.Sqrt(x) позволяет вычислить квадратный корень x.

Выражение Math.Abs(x) вычисляет модуль x.

Выражения Math.Cos(x), Math.Sin(x) и Math.Tan вычисляют соответствующие тригонометрические функции.

Выражение Math.Exp(x) позволяет вычислить экспоненту x (\(e^x\)).

Выражения x++ и x-- увеличивают или уменьшают переменную x на 1, соответственно.

Примитивные типы данных

В предыдущих примерах кода в качестве типа переменных был использован тип int - целое знаковое число длиной в 32 бита.

Другие распространенные типы данных в C#:

Над числовыми типами данных можно производить арифметические операции: +, -, *, /. Деление целочисленных значений производит целочисленный результат.

Ввод и вывод текстовых данных с консоли

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

string s = Console.ReadLine();

Вывод текста на консоль производится с помощью метода Console.WriteLine:

Console.WriteLine("Hello!");

Конверсия типов

Зачастую возникает необходимость изменить тип некоторой переменной. Эта операция называется конверсией типов и имеет два вида:

Явная конверсия числовых типов данных осуществляется путем приписывания нужного типа в скобках перед выражением, которое нужно сконвертировать:

double x = (double)123 / (double)456;

В примере выше конверсия типов заставляет C# произвести деление над числами с плавающей точкой. Если же убрать (double), то деление будет произведено над целыми числами и в результате будет получен 0.

Сконвертировать любой тип в string можно с помощью метода ToString:

int x = 123;
string s = x.ToString();

Сконвертировать строку, содержащую число, можно с помощью статичного метода Parse:

string s = "123";
int x = int.Parse(s);

Оператор ветвления

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

if(условие)
{
}
else
{
}

Внутри фигурных скобок могут находиться любые высказывания, в том числе вложенные if. В качестве условия может быть подставлено любое выражение типа bool. Код в скобках под if будет выполнен, если условие принимает значение true, а код в скобках под else - в противном случае. Ветвь else не является обязательной частью синтаксиса и может быть опущена.

Операторы сравнения

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

Оператор switch-case

Если число случаев, которые нужно обработать с помощью if велико, можно воспользоваться оператором switch-case:

switch(x)
{
case 1:
    ...
    break;
case 2:
    ...
    break;
default:
    ...
    break;
}

С помощью ключевого слова case перечисляются возможные варианты действий при соответствующих значениях переменной, указанной в switch(). Важной особенностью этого оператора является то, что блоки кода отделяются друг от друга не фигурными скобками, а специальным ключевым словом break. Случай default выполняется, если ни одно из заданных значений в case не подошло к рассматриваемой переменной.

Организация циклов

С помощью определенных ключевых слов можно повторять выполнение произвольных участков кода. Такие участки называются циклами. Ключевое слово while позволяет организовывать цикл с пред- и постусловием:

while(условие)
{
}

do
{
}
while(условие);

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

Еще один способ организовать цикл - ключевое слово for:

for(int i = 0; i < 10; i++)
{
}

Внутри круглых скобок после for находятся три секции, разделенные символом “;”:

Выполнение любого вида циклов может быть прервано с помощью команды ключевого слова break. Например, следующий цикл совершит лишь 5 итераций, а не 10:

for(int i = 0; i < 10; i++)
{
    if(i == 5)
        break;
}

Ключевое слово continue позволяет прервать текущую итерацию цикла и сразу перейти к следующей.

Массивы

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

Инициализированный массив значений типа int можно создать следующим образом:

int[] a = {1, 2, 3};

Символы [] возле типа означают, что объявляемая переменная является массивом. В таких объявлениях можно использовать особый инициализатор с фигурными скобками, внутри которых перечисляются элементы массива.

Приведенный выше код идентичен следующему, в котором элементы массива заполняются “вручную”:

int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

В этом случае инициализатор просто указывает, какой размер должен иметь создаваемый массив. С помощью квадратных скобок, размещенных рядом с именем переменной, можно получать доступ к произвольному элементу массива по его номеру. Важно отметить, что индексирование массивов происходит со значения 0, поэтому чтобы получить доступ к, например, 3-му элементу, необходимо писать a[2], а не a[3].

Для того, чтобы совершить какое-либо действие над каждым элементом массива, можно использовать цикл:

int[] a = {1, 2, 3};
for(int i = 0; i < 3; i++)
    Console.WriteLine(a[i]);

В примере выше, цикл организуется для того, чтобы переменная i пробегала значения от 0 до 2, и могла быть использована в качестве индекса для доступа к очередному элементу массива.

Контрольные вопросы

  1. В чем отличие компилятора языка программирования и IDE?
  2. int.Parse - это явная или неявная конверсия типов?
  3. С помощью какого выражения можно проверить что переменная x находится в промежутке [a;b)?
  4. Являются ли операторы if-else и switch-case взаимозаменяемыми?
  5. Каким образом можно организовать бесконечный цикл?

Задание на лабораторную работу

  1. Установить Visual Studio Community Edition.
  2. Написать и скомпилировать программу, соответствующую своему варианту. Программа должна принимать от пользователя 2 числовых значения \(x\) и \(y\), а так же интервал \(n\). Интервал может быть десятичным числом. Затем программа расчитывает значение функции \(f(x, y)\), где первый аргумент пробегает интервал \([x, x+10]\) с шагом \(n\). Результаты расчёта на каждом шаге заносятся в массив, а так же выводятся на экран.
  3. Запустить скомпилированную программу и убедиться в ее правильном функционировании.
  4. Продемонстрировать владение отладчиком.

Варианты заданий

Вариант 1

\(f(x) = \begin{cases} (x^2 + y)^2 - \sqrt{x^2 y} & \quad \text{, при } xy > 0 \\ (x^2 + y)^2 - \sqrt{\mid x^2 y \mid} & \quad \text{, при } xy < 0 \\ (x^2 + y)^2 + 1 & \quad \text{, при } xy = 0 \\ \end{cases}\)

Вариант 2

\(f(x) = \begin{cases} ln(x^2) + (x^2 + y)^3 & \quad \text{, при } x/y > 0 \\ ln{\mid \frac {x^2} y \mid} + (x + y)^3 & \quad \text{, при } x / y < 0 \\ (x^2 + y)^3 & \quad \text{, при } x = 0 \\ 0 \quad \text{, при } y = 0 \\ \end{cases}\)

Вариант 3

\(f(x) = \begin{cases} x^2 + y^2 + sin(y) & \quad \text{, при } x - y = 0 \\ (x^2 - y)^2 + cos(y) & \quad \text{, при } x - y > 0 \\ (y - x^2)^2 + tg(x) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 4

\(f(x) = \begin{cases} (x^2 - y)^3 + arctg(x^2) & \quad \text{, при } x > y \\ (y - x^2)^3 + arctg(x^2) & \quad \text{, при } x < y \\ (y + x^2)^3 + 0.5 & \quad \text{, при } x = y \\ \end{cases}\)

Вариант 5

\(f(x) = \begin{cases} y \sqrt x^3 & \quad \text{, если } y \text { - нечетное и } x > 0 \\ \frac y 2 \sqrt {\mid x^2 \mid} & \quad \text{, если } y \text { - четное и } x < 0 \\ \sqrt {\mid y x^2 \mid} & \quad \text{ иначе } \\ \end{cases}\)

Вариант 6

\(f(x) = \begin{cases} e^{x^2 - \mid y \mid} & \quad \text{, при } 0.5 < xy < 10 \\ \sqrt {\mid x^2 + y \mid} & \quad \text{, при } 0.1 < xy \leq 0.5 \\ 2 x^2 & \quad \text{ иначе } \\ \end{cases}\)

Вариант 7

\(f(x) = \begin{cases} e^{x^2} & \quad \text{, при } 1 < xy < 10 \\ \sqrt {\mid x^2 + 4y \mid} & \quad \text{, при } 12 < xy < 40 \\ x^2 y & \quad \text{ иначе } \\ \end{cases}\)

Вариант 8

\(f(x) = \begin{cases} sin(5 x^2 + 3y \mid x^2 \mid) & \quad \text{, при } -1 < y < x \\ cos(3 x^2 + 5y \mid x^2 \mid) & \quad \text{, при } x > y \\ (x + y)^2 & \quad \text{, при } x = y \\ x & \quad \text { иначе } \\ \end{cases}\)

Вариант 9

\(f(x) = \begin{cases} 2 x^3 + 3 y^2 & \quad \text{, при } x > \mid y \mid \\ \mid x^2 - y \mid & \quad \text{, при } 3 < x < \mid y \mid \\ (x^2 - y)^2 & \quad \text{, при } x = \mid y \mid \\ y & \quad \text { иначе } \\ \end{cases}\)

Вариант 10

\(f(x) = \begin{cases} ln(\mid x^2 \mid + \mid y \mid) & \quad \text{, при } \mid xy \mid > 10 \\ e^{x^2 + y} & \quad \text{, при } \mid xy \mid < 10 \\ x^2 + y & \quad \text{, при } \mid xy \mid = 10 \\ \end{cases}\)

Вариант 11

\(f(x) = \begin{cases} sin(x)^2 + sin(y) & \quad \text{, при } x - y = 0 \\ cos(x) + cos(y) & \quad \text{, при } x - y > 0 \\ (y - tg(x))^2 + tg(y) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 12

\(f(x) = \begin{cases} \frac {x^2 y + 2} {x^2 + 1} & \quad \text{, при } 1 < \mid x \mid < 3 \\ y^2 + x^2 & \quad \text{, при } \mid x \mid \geq 3 \\ y \frac {x^2} {x + 2} & \quad \text{, при } \mid x \mid \leq 1 \\ \end{cases}\)

Вариант 13

\(f(x) = \begin{cases} sin(x^2) + cos(y) & \quad \text{, при } x - y = 0 \\ tg(x^2+y) & \quad \text{, при } x - y > 0 \\ sin(x)^2 + cos(y^2) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 14

\(f(x) = \begin{cases} ln(\mid x^2 \mid + \mid y \mid) & \quad \text{, при } \mid xy \mid > 10 \\ 3^{x^2 + y} & \quad \text{, при } \mid xy \mid < 10 \\ x^2 - y & \quad \text{, при } \mid xy \mid = 10 \\ \end{cases}\)

Вариант 15

\(f(x) = \begin{cases} x^3 - y^3 cos(x) & \quad \text{, при } x + y = 0 \\ (xy)^2 - cos(y) & \quad \text{, при } x + y > 0 \\ 3xy^2 & \quad \text{, при } x + y < 0 \\ \end{cases}\)