Лекция №1 Введение. Платформа .NET. Среда Visual Studio.
Лекция №1 Введение. Платформа .NET. Среда Visual Studio.
Алгоритм – это последовательность команд, предназначенная исполнителю, в результате выполнения которой он должен решить поставленную задачу.
Алгоритм должен описываться на формальном языке, исключающем неоднозначность толкования. Исполнитель может быть человеком или машиной. Исполнитель должен уметь выполнять все команды, составляющие алгоритм. Множество возможных команд конечно и изначально строго задано. Действия, выполняемые по этим командам, называются элементарными.
Запись алгоритма на формальном языке называется программой.
Компьютерная программа – последовательность инструкций, определяющих процедуру решения конкретной задачи компьютером
Известно, что компьютер может понимать только машинный язык, состоящий из 0 и 1. Ранее программисты писали программы на этом языке. Затем появились машинно-ориентированные языки ассемблера. Теперь люди стали использовать мнемонические команды взамен машинных команд. Затем появились языки программирования высокого уровня, которые имитируют естественный язык. Но компьютер до сих пор воспринимает только 1 и 0. Поэтому для перевода программы на компьютерный язык требуется некоторая другая программа. Рассмотрим, что же нам предлагает современный мир.
Итак, что же нам потребуется для того, чтобы написать программу?
Этапы построения программы
1.Постановка задачи — выполняется специалистом в предметной области на естественном языке (русском, английском и т. д.). Необходимо определить цель задачи, ее содержание и общий подход к решению.
2.Анализ задачи и моделирование — определяются исходные данные и результат, выявляются ограничения на их значения, выполняется формализованное описание задачи и построение математической модели, пригодной для решения на компьютере.
3.Разработка или выбор алгоритма решения задачи — выполняется на основе ее математического описания. Многие задачи можно решить различными способами. Программист должен выбрать оптимальное решение. Неточности в постановке, анализе задачи или разработке алгоритма могут привести к скрытой ошибке — программист получит неверный результат, считая его правильным.
4.Проектирование общей структуры программы — формируется модель решения с последующей детализацией и разбивкой на подпрограммы, определяется "архитектура" программы, способ хранения информации (набор переменных, массивов и т. п.).
5. Кодирование — запись алгоритма на языке программирования.
6.Отладка и тестирование программы.
Тестирование – поиск ошибок в программе.
Отладка – устранение ошибок.
Тестирование должно охватывать все возможные ветвления в программе, т. е.проверять все ее инструкции, и включать такие исходные данные, для которых решение невозможно.
В программе могут возникать ошибки.
Виды ошибок:
Синтаксические– неверно написан код, ошибка в названии функции и т.п.
Логические– программа работает, но выдает неверный результат, ошибка при составлении мат. модели
Ошибки времени выполнения– происходят в том случае, когда программа пытается выполнить недопустимую операцию. Например, деление на переменную, которая в какой-то момент времени приняла значение ноль.
Лекция №2 Общая структура программы. Данные. Типы данных. Оператор присваивания. Арифметические операции. Пространства имен.
Понятие класса
Для представления объектов в C# используется понятие класс, аналогичное обыденному смыслу этого слова в контексте "класс членистоногих", "класс млекопитающих", "класс задач" и т.п. Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами класса.
"Классический" класс содержит данные, задающие свойства объектов класса, и функции, определяющие их поведение.
Все классы библиотеки .NET, а также все классы, которые создает программист в среде .NET, имеют одного общего предка — класс object, и организованы в единую иерархическую структуру. Внутри нее классы логически сгруппированы в так называемые пространства имен, которые служат для упорядочивания имен классов и предотвращения конфликтов имен: в разных пространствах имена могут совпадать. Пространства имен могут быть вложенными, их идея аналогична знакомой вам иерархической структуре каталогов на компьютере.
Любая программа, создаваемая в .NET, использует пространство имен System. В нем определены классы, которые обеспечивают базовую функциональность, например, поддерживают выполнение математических операций, управление памятью и ввод-вывод.
Общая структура программы на С# выглядит следующим образом:
using System;
namespace MyProgram
{
class Program
{
static void Main()
{
}
}
}
Директива using System разрешает использовать имена стандартных классов из пространства имен Systemнепосредственно (без указания имени пространства).
Ключевое слово namespace создает для проекта собственное пространство имен, названное по умолчанию ConsoleApplication1. В нашем случае MyProgram. Это сделано для того, чтобы можно было давать программным объектам имена, не заботясь о том, что они могут совпасть с именами в других пространствах имен.
C# — объектно-ориентированный язык, поэтому написанная на нем программа представляет собой совокупность взаимодействующих между собой классов. В нашей заготовке программы всего один класс, которому по умолчанию задано имя Program. Описание классаначинается с ключевого слова class, за которым следуют его имя и далее в фигурных скобках — список элементов класса (его данных и функций, называемых также методами).
Фигурные скобки являются важным элементом синтаксиса. Каждой открывающей скобке соответствует своя закрывающая, которая обычно располагается ниже по тексту с тем же отступом. Эти скобки ограничивают блок, внутри которого могут располагаться другие блоки, вложенные в него, как матрешки. Блок может применяться в любом месте, где допускается отдельный оператор.
В данном случае внутри класса только один элемент — метод Main. Каждое приложение должно содержать метод Main — с него начинается выполнение программы.
Все языки программирования состоят из алфавита, синтаксиса и семантики.
Алфавит - это набор различимых символов: букв, цифр, специальных знаков и т.п. Например, алфавит машинного языка состоит из двух символов: 0 и 1
Синтаксис – правила построения конструкций языка
Семантика – совокупность правил истолкования конструкций языка, образованных в соответствии с синтаксисом.
Алфавит C# включает:
- Буквы (латинские и национальных алфавитов) и символ подчеркивания ( _ ), который употребляется наряду с буквами;
- цифры;
- специальные символы, например +, *, { и &;
- пробельные символы (пробел и символы табуляции);
- символы перевода строки.
Из символов составляются более крупные строительные блоки: лексемы, директивы препроцессора и комментарии.
Имена, или идентификаторы, служат для того чтобы обращаться к программным объектам и различать их, то есть идентифицировать. В идентификаторе могут использоваться буквы, цифры и символ подчеркивания. Прописные и строчные буквы различаются, например, hacker, Hacker и hAcKeR — три разных имени.
Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Длина идентификатора не ограничена. Пробелы внутри имен не допускаются.
Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. В редакторе кода они выделены голубым цветом.
Любая программа обрабатывает данные. Данные могут быть постоянными (константы) и переменными. Константы записываются следующим образом:
Целое число 123 или -12
Вещественное число должно содержать точку в качестве разделителя и суффикс, например 0.3f или 0.25d – позже подробнее.
Одиночный символ заключается в одинарную кавычку ''
'А' или '3'
Строка заключается в двойную кавычку ""
"HELLO" или "WORLD"
Существуют также зарезервированные константы, например
Логические: TRUE, FALSE
Неопределенно: NULL.
Комментарии предназначены для записи пояснений к программе и формирования документации. Компилятор комментарии игнорирует. Внутри комментария можно использовать любые символы. В C# есть два вида комментариев: однострочные и многострочные.
Однострочный комментарий начинается с двух символов прямой косой черты (//) и заканчивается символом перехода на новую строку, многострочный заключается между символами-скобками /* и */ и может занимать часть строки, целую строку или несколько строк. Комментарии не вкладываются друг в друга.
Типы данных в С#
Тип данных – это множество значений, которое может принимать переменная.
Данные, с которыми работает программа, хранятся в оперативной памяти. Естественно, что компилятору необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа.
Тип данных однозначно определяет:
- внутреннее представление данных, а, следовательно, и множество их возможных значений;
- допустимые действия над данными (операции и функции).
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разные диапазоны возможных значений.
Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при проверке допустимости описанных в программе действий.
Память, в которой хранятся данные во время выполнения программы, делится на две области: стек (stack) и динамическая область, или хип (heap), чаще называемый кучей. Стек используется для хранения величин, память под которые выделяет компилятор, а в динамической области память резервируется и освобождается во время выполнения программы с помощью специальных команд. Основным местом для хранения данных в C# является хип.
Все типы можно разделить на простые (не имеют внутренней структуры) и структурированные (состоят из элементов других типов).
Встроенные типы не требуют предварительного определения. Для каждого типа существует ключевое слово, которое используется при описании переменных, констант и т.д. Встроенные типы C# приведены в таблице Они однозначно соответствуют стандартным классам библиотеки .NET, определенным в пространстве имен System. Как видно из таблицы, существуют несколько вариантов представления целых и вещественных величин. Программист выбирает тип каждой величины, используемой в программе, с учетом необходимого ему диапазона и точности представления данных.
Переменная — это именованная область памяти, предназначенная для хранения данных определенного типа. Во время выполнения программы значение переменной можно изменять. Все переменные, используемые в программе, должны быть описаны явным образом. При описании для каждой переменной задаются ее имя и тип.
Пример описания целой переменной с именем a и вещественной переменной x:
int a; float x;
Имя переменной служит для обращения к области памяти, в которой хранится значение переменной. Имя дает программист. Тип переменной выбирается, исходя из диапазона и требуемой точности представления данных. При объявлении можно присвоить переменной некоторое начальное значение, то есть инициализировать ее, например:
int a, b = 1;
float x = 0.1f, y = 0.1f;
Здесь описаны:
Переменная a типа int, начальное значение которой не присваивается;
Переменная b типа int, ее начальное значение равно 1;
Переменные х и y типа float, которым присвоены одинаковые начальные значения 0.1. Рекомендуется всегда инициализировать переменные при описании. При инициализации можно использовать не только константу, но и выражение — главное, чтобы на момент описания оно было вычисляемым, например:
int b = 1, a = 100;
int x = b * a + 25;
Операции и выражения
Выражение — это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами простейшего выражения могут быть константы, переменные и вызовы функций.
Например, a + 2— это выражение, в котором + является знаком операции, а a и 2 — операндами. Пробелы внутри знака операции, состоящей из нескольких символов, не допускаются.
Операции:
Операции в выражении выполняются в определенном порядке в соответствии с приоритетами, как и в математике. Результат вычисления выражения характеризуется значением и типом. Например, пусть a и b— переменные целого типа и описаны так:
int a = 2, b = 5;
Тогда выражение a + b имеет значение 7 и тип int
Пример Типы, преобразование типов.
using System;
namespace MyProgram
{ class Program
{ static void Main(string[] args)
{ decimal A=0.3m;
float x = 0.1f, y=0.2f;
int b = 0;
double Z = 0.3;
b = A + 1; //недопустимо
x = b + 2; // Допускается
x = A + 2; //недопустимо
b = Z * 2;//недопустимо
Z = A * 2;//недопустимо
Z = x * 2; // Допускается
} }}
Пример Операция присваивания. Работа в отладчике.
Для запуска отладчика, достаточно поставить точку остановы (F9) в требуемом месте. Для того чтобы перейти к следующей строке кода в отладчике используется клавиша F10, чтобы продолжить отладку целиком F5.
В отладчике рассмотрим операции присваивания.
Стандартный ввод-вывод.
Для работы с консолью в C# применяется класс Console, определенный в пространстве имен System. Методы этого класса Write и WriteLine служат для вывода данных на экран. Рассмотрим их поподробнее. Первая из них, напечатав на экране все, о чем ее просили, оставит курсор в конце выведенной строки, а вторая переведет его в начало следующей строчки.
Вывести на экран можно какой-либо текст, текст должен быть заключен в ковычки:
Console. WriteLine("Укажите свой возраст");
Текст может содержать так называемые управляемые символы. Они начинаются с символа \ (бэкслэш), далее идет латинская буква. К управляющим символам относятся:
\n - аналогично клавише enter
\t – аналогично клавише tab
Иными словами, если команда будет такой:
Console. WriteLine("Укажите \n свой возраст");
То в результате мы получим:
Укажите
свой возраст
Вывести на экран можно значение некоторой переменной:
int S = 5;
Console.WriteLine(S);
В результате мы увидим число 5.
Еще пример вывода переменной:
String S = "Вася";
Console.WriteLine(S);
На экран будет выведена строка Вася
Далее, можно комбинировать вывод информации в одной команде. Т.е. вывести и текст, и значение переменных одновременно.
Примеры:
int S = 5;
Console.WriteLine("S = " + S);
Здесь происходит неявное преобразование типов. Значение переменной S преобразуется в строку. На экран будет выведена строка: S = 5
Более сложно:
int S = 5, C = 3;
String d = "Вася"
Console.WriteLine("S = " + S + " С = " + С);
На экран будет выведена строка: S = 5 С = 3
Здесь также можно добавить управляемый символ:
int S = 5, C = 3;
String d = "Вася"
Console.WriteLine("S = " + S + "\nС = " + С);
В таком случае результат будет следующим:
S = 5
С = 3
Еще один способ вывода значений переменных в строке – это использование параметров. Параметры заключаются в фигурные скобки.
Пример.
int S = 5, C = 3;
Console.WriteLine("S = {0} С = {1}", S, С);
Здесь на экран будет выведена строка, заключенная в кавычки, но вместо параметров, заключенных в фигурные скобки будут выведены значения переменных соответственно номеру. Нумерация начинается с 0.
Консольный ввод.
В классе Console определены методы ввода строки и отдельного символа, но нет методов, которые позволяют непосредственно считывать с клавиатуры числа. Ввод числовых данных выполняется в два этапа:
· Символы, представляющие собой число, вводятся с клавиатуры в строковую переменную.
· Выполняется преобразование из строки в переменную соответствующего типа.
Преобразование можно выполнить либо с помощью специального класса Convert, определенного в пространстве имен System, либо с помощью метода Parse, имеющегося в каждом стандартном арифметическом классе.
На примере рассмотрим ввод данных.
Условные операторы
Разветвляющимся называется такой алгоритм, в котором выбирается один из нескольких возможных вариантов вычислительного процесса. Каждый подобный путь называется ветвью алгоритма.
Для разработки таких алгоритмов применяют условный оператор. Условный оператор может использоваться в форме полной или неполной развилки.
В случае неполной развилки если условие истинно, то блок операций выполняется, если условие ложно, то блок операций не выполняется. В случае полной развилки если условие истинно, то выполняется блок операций 1, иначе выполняется блок операций 2.
Условие может быть простым и составным.
В простых условия используются операторы сравнения:
< - меньше, чем..
> - больше, чем...
<= - меньше, чем... или равно
>= - больше, чем... или равно
<> - не равно
= = - равно
Например, простыми отношениями являются следующие:
x-y>10; k<= (a+b); s = = 0;
Составные условия строятся из простых с помощью логических операторов:
&& - И
|| - ИЛИ
! – НЕ
Например
((y>10) && (k<= a))
На языке С# условный оператор имеет вид:
Оператор условия может быть вложенным.
Задачи
1. Если введенное значение переменной a равно7, то на экране мы увидим слово Привет!Если не равно — то на экран ничего выводится не будет.
2. Пример без фигурных скобок, объяснение.
3. Найти максимальное из трех чисел.
4. Сумма покупки составляета рублей. Если а больше 1000 рублей, то предоставляется скидка 15%. Вывести на экран сумму покупки с учетом скидки либо сообщение о том, что скидка не предоставляется.
5. Проверить, принадлежит ли число введенное с клавиатуры, интервалу (-5;3)
Дано двузначное число. Определить:
· входит ли в него цифра 3
· входит ли в него цифра а
Оператор ветвления switch (оператор множественного выбора)
Оператор if позволяет осуществить выбор только между двумя вариантами. Для того, чтобы производить выбор одного из нескольких вариантов необходимо использовать вложенный оператор if. С этой же целью можно использовать оператор ветвления switch.
Общая форма записи
switch (целое выражение) {
case константа1: блок операций1;
break;
case константа2: блок операций2;
break;. . .
case константаn: блок операцийn;
break;
default: блок операций по умолчанию;
break;}
Оператор ветвления switch выполняется следующим образом:
· вычисляется целочисленное выражение в скобках оператора switch;
· полученное значение сравнивается с метками (константами) в опциях case, сравнение производится до тех пор, пока не будет найдена метка, соответствующая вычисленному значению целочисленного выражения;
· выполняется оператор соответствующей метки case;
· если соответствующая метка не найдена, то выполнится оператор в опции default.
Альтернатива default может отсутствовать, тогда не будет произведено никаких действий.
Опция break; осуществляет выход из оператора switch и переход к следующему за ним оператору. При отсутствии опции break будут выполняться все операторы, начиная с помеченного данной меткой и кончая оператором в опции default.
Задачи:
Циклические алгоритмы
Цикл – набор команд, который выполняется многократно.
Тело цикла – последовательность выполняемых команд.
Параметр цикла – переменная управляющая выполнением цикла. Параметр изменяет свое значение при каждом прохождении тела цикла.
Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
1. Цикл с предусловием.
Блок схема:
Сначала проверяется условие, если оно истинно, то выполняется тело цикла, затем условие проверяется снова и так до тех пор, пока условие не станет ложным.
while(условие)
{
Блок команд
}
Пример. Напечатать квадраты чисел от 1 до 10. Здесь переменная i является параметром цикла, она участвует в условии и она же изменяется при каждом прохождении тела цикла.
int i=1;
While (i<=10)
{
Console.WriteLine( i*i);
i = i +1;
}
Еще пример. Найдем сумму чисел от i до k.
int k=5;
int i=1;
int sum=0;
while(i <=k) {
sum = sum + i;
i++;
}
2. Цикл с постусловием
Сначала выполняется тело цикла, затем проверяется условие, если условие истинно, то тело цикла выполняется еще раз. И так до тех пор, пока условие не станет ложным.
do
{
тело цикла
}
while (условие);
Пример. Напечатать квадраты чисел от 1 до 10.
int i=1;
do
{ Console.WriteLine( i*i);
i = i +1;
}
while (i<=10)
Поскольку условие проверяется после выполнения тела цикла, то тело цикла с постусловием всегда будет выполнено хотя бы один раз, независимо от истинности условия.
3. Цикл с заданным числом повторений (параметрический цикл)
for (Параметр = НачЗн; Условие; Шаг)
{
Тело цикла;
}
Условие проверяется перед каждым повторением тела цикла. Если оно истинно, то тело цикла выполняется и так до тех пор, пока параметр цикла будет удовлетворять условию.
Пример. Напечатать квадраты чисел от 1 до 10.
int i;
for(i=1;i<=10;i=i+1)
{ Console.WriteLine( i*i);
}
Оператор break делает принудительный выход из цикла, даже когда условие цикла — истинно. Оператор break удобно использовать, когда необходимо выйти из цикла при особых обстоятельствах. Оператор continue нужен если необходимо пропустить какой-то блок кода, но при этом не прекращать работу цикла.
Упражнения:
1. Найти сумму четных чисел от 1 до 100
2. Вывести все числа от 1 до 100 кратные пяти
Массивы
Массив представляет набор однотипных переменных. Объявление массива похоже на объявление переменной: тип_переменной[] название_массива. Например,
int[] nums = new int[4];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 5;
Console.WriteLine(nums[3]);
Здесь вначале мы объявили массив nums, который будет хранить данные типа int. Далее используя операцию new, мы выделили память для 4 элементов массива: new int[4]. Число 4 еще называется длиной массива.
Отсчет элементов массива начинается с 0, поэтому в данном случае, чтобы обратиться к четвертому элементу в массиве, нам надо использовать выражение nums[3].
И так как у нас массив определен только для 4 элементов, то мы не можем обратиться, например, к шестому элементу: nums[5] = 5;. Если мы так попытаемся сделать, то мы получим исключение IndexOutOfRangeException.
В предыдущем примере мы сначала создали массив, а потом определили для всех его элементов значения. Но есть и альтернативные пути инициализации массивов:
// эти два способа равноценны
int[] nums2 = new int[] { 1, 2, 3, 5 };
int[] nums3 = { 1, 2, 3, 5 };
Массивы бывают одномерными и многомерными. В предыдущих примерах мы создавали одномерные массивы, а теперь также создадим двухмерный:
int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 }; int[,] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } }; |
Визуально оба массива можно представить следующим образом:
Одномерный массив nums1
Двухмерный массив nums2
Поскольку массив nums2 двухмерный, он представляет собой простую таблицу.
Методы
Много раз мы уже использовали различные методы в работе. Например, метод Convert.ToDouble(s). Результатом работы этого метода является число, которое было получено с помощью конвертации строки в число. В данном случае s – это аргумент функции. Полученное число – результат метода или возвращаемое значение. Мы с вами можем писать свои собственные методы и помещать их в свои собственные библиотеки.
Для этого обязательно нужно указать:
1. Тип результата метода;
2. Имя метода;
3. Информацию о параметрах метода;
4. Тело метода.
Синтаксис следующий:
ТипВозвращаемогоЗначения ИмяМетода(СписокФормальныхПараметров)
{
ТелоМетода;
...
return(ВозвращаемоеЗначение);
}
Для чего используют функции:
1. Если какой-то фрагмент кода встречается несколько раз, то его лучше поместить в функцию и вызывать из текста основной программы. Это упростит код.
2. Память под переменные, которые используются в функциях выделяется только в момент обращения к функции и высвобождается после завершения ее работы.
Вызов функции осуществляется из основного текста программы следующим способом:
переменная = ИмяМетода(СписокФактическихАргументов);
Как только в программе зафиксирован вызов функции, управление передается телу функции. В ходе выполнения тела функции, получаем некоторый результат, который необходимо вернуть в тело основной программы. Для этого предназначен оператор return. Оператор return говорит о том, что выполнение функции надо завершить. Оператор return может находится не только в конце функции. Тип функции и тип результата должны совпадать. Оператор return может отсутствовать совсем. Тогда функция называется процедурой и тип возвращаемого ей значения указывается void.
Пример без параметров
static void Main(string[] args)
{
string message = Hello(); // вызов первого метода
Console.WriteLine(message);
Sum(); // вызов второго метода
Console.ReadLine();
}
static string Hello()
{
return "Hell to World!";
}
static void Sum()
{
int x = 2;
int y = 3;
Console.WriteLine("{0} + {1} = {2}", x, y, x+y);
}
Пример с параметрами:
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
int x = 10;
int z = Sum(x, 15);
Console.WriteLine(z);
Console.ReadLine();
}
Пример с необязательными параметрами
static int OptionalParam(int x, int y, int z=5, int s=4)
{
return x + y + z + s;
}
static void Main(string[] args)
{
OptionalParam(2, 3);
OptionalParam(2,3,10);
Console.ReadLine();
}
Передача массива в функцию.
Инициализированный одномерный массив можно передать в метод. Например, следующая инструкция передает массив в метод печати.
C#
int[] theArray = { 1, 3, 5, 7, 9 }; PrintArray(theArray);В следующем примере кода показана частичная реализация метода печати.
C#
void PrintArray(int[] arr) { // Method code. }Инициализацию и передачу нового массива можно выполнить в рамках одного шага, как показано в следующем примере.
C#
PrintArray(new int[] { 1, 3, 5, 7, 9 });Пример
Описание
В следующем примере массив строк инициализируется и передается в качестве аргумента метода PrintArray. Затем метод отображает элементы этого массива. Затем вызываются методы ChangeArray и ChangeArrayElement для демонстрации того, что отправка аргумента массива по значению не запрещает вносить изменения в элементы массива.
static void PrintArray(string[] arr) { for (int i = 0; i < arr.Length; i++) { System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : ""); } System.Console.WriteLine(); } static void ChangeArray(string[] arr) { arr = (arr.Reverse()).ToArray(); System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]); } static void ChangeArrayElements(string[] arr) { arr[0] = "Sat"; arr[1] = "Fri"; arr[2] = "Thu"; System.Console.WriteLine("arr[0] is {0} in ChangeArrayElements.", arr[0]); } static void Main() { string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; PrintArray(weekDays); ChangeArray(weekDays); System.Console.WriteLine("Array weekDays after the call to ChangeArray:"); PrintArray(weekDays); System.Console.WriteLine(); ChangeArrayElements(weekDays); System.Console.WriteLine("Array weekDays after the call to ChangeArrayElements:"); PrintArray(weekDays); }}Class Book
{
public string name;
public string author;
public int year;
Class Program
{
static void Main(string[] args)
{
Book b1 = new Book();
b1.name = "Война и мир";
b1.author = "Л. Н. Толстой";
b1.year = 1869;
b1.GetInformation();
}
}
В ООП существует три основных принципа построения классов:
Set и Get свойства.
Рассмотрим пример. Создадим класс Person – описание человека. В качестве полей определим такое поле как имя и возраст. Методов пока добавлять не будем.
Class Person
{
public string name;
public int age;
}
Class Program
{
Person p = new Person();
p.name = "Tom";
p.age = Convert.ToInt32(Console.ReadLine());
}
В данном примере оба поля имя и возраст являются общедоступными.
Как правило программисты делятся на тех, кто разрабатывает классы и на тех, кто этими классами активно пользуется. Предположим, разработчик класса создал класс Person , но при вводе значений полей класса возможен некорректный ввод данных. Следуя принципу инкапсуляции, программисты обычно закрывают доступ к основным полям класса, а для того, чтобы другой программист мог все-таки ввести значения этих полей, создают дополнительные общедоступные поля и используют set-свойство этих полей для установки значений и get-свойство для получения значений полей.
В нашем примере это будет выглядеть следующим образом:
Class Person
{
public string name;
Public string Name
{
Get
{
return name;
}
Private set
{
name = value;
}
}
private int age;
Public int Age
{
Set
{
if (value < 18)
{
Console.WriteLine("Возраст должен быть больше 18");
}
Else
{
age = value;
}
}
get { return age; }
}
}
Class Program
{
Person p = new Person("Tom", 24);
}
В нашем случае теперь доступными будут поля Name и Age, а поля name и age скрыты от разработчика, который пользуется данным классом. Но при установке значения свойству Name значения, автоматически будет установлено значение и свойству name, а при установке значения свойству Age сначала будет произведена проверка ввода данных, если проверка пройдена, то тогда полю age будет присвоено значение.
Конструкторы и деструкторы.
Конструктор (от слова construct — создавать) – это специальный метод класса, который предназначен для инициализации элементов класса некоторыми начальными значениями.
В отличии от конструктора, деструктор (от слова destruct — разрушать) — специальный метод класса, который служит для уничтожения элементов класса. Чаще всего его используют тогда, когда в конструкторе,при создании объекта класса, динамически был выделен участок памяти и необходимо эту память очистить, если эти значения уже не нужны для дальнейшей работы программы.
Важно запомнить:
1. конструктор и деструктор, мы всегда объявляем в разделе public;
2. при объявлении конструктора, тип данных возвращаемого значения не указывается, в том числе — void!!!;
3. у деструктора также нет типа данных для возвращаемого значения, к тому же деструктору нельзя передавать никаких параметров;
4. имя класса и конструктора должно быть идентично;
5. имя деструктора идентично имени конструктора, но с приставкой ~ ;
6. В классе допустимо создавать несколько конструкторов, если это необходимо. Имена, согласно пункту 2 нашего списка, будут одинаковыми. Компилятор будет их различать по передаваемым параметрам (как при перегрузке функций). Если мы не передаем в конструктор параметры, он считается конструктором по умолчанию;
7. Обратите внимание на то, что в классе может быть объявлен только один деструктор;
Конструкторы вызываются при создании нового объекта данного класса. Служат в основном для установки начальных значений. Пример
Class Book
{
public string name;
public string author;
public int year;
Public Book()
{ }
Public void Info()
{
Console.WriteLine("Книга '{0}' (автор {1}) была издана в {2} году", name, author, year);
}
}
Class Program
{
static void Main(string[] args)
{
Book b1 = new Book("Война и мир", "Л. Н. Толстой", 1869);
b1.GetInformation();
Book b2 = new Book();
b2.GetInformation();
Console.ReadLine();
}
}
В данном случае мы использовали два конструктора. Один пустой. Второй конструктор наполняет поля класса начальными значениями, которые передаются через его параметры.
Поскольку имена параметров и имена полей (name, author, year) в данном случае совпадают, то мы используем ключевое слово this. Это ключевое слово представляет ссылку на текущий экземпляр класса. Поэтому в выражении this.name = name; первая часть this.name означает, что name - это поле текущего класса, а не название параметра name. Если бы у нас параметры и поля назывались по-разному, то использовать слово this было бы необязательно.
Class Employee : Person
{
public string Company;
Public new void Display()
{
Console.WriteLine(FirstName + " " + LastName + " работает в компании "+ Company);
}
}
static void Main(string[] args)
{
Person p1 = new Person("Bill", "Gates");
Статические члены класса
Ранее, чтобы использовать какой-нибудь класс, устанавливать и получать его поля, использовать его методы, мы создавали его объект. Однако если данный класс имеет статические методы, то, чтобы получить к ним доступ, необязательно создавать объект этого класса.
Class Algorithm
{
Else
{
return x * Factorial(x - 1);
}
}
}
Ключевое слово static при определении переменной и методов указывает, что данные члены будут доступны для всего класса, то есть будут статическими. Теперь используем их в программе:
int num1 = Algorithm.Factorial(5); |
Нередко статиче