- •1 Концепция структурного программирования. Причины появления концепции. Модульность и функции. Ограничения на логические конструкции. Использование оператора goto.
- •Теорема о структурном программировании (Теорема Бёма — Якопини)
- •3 Платформа .Net Framework. Многоязыковое программирование. Кроссплатформенность по. Web-ориентированные приложения.
- •Преимущества технологии динамической компиляции
- •5 Построение приложения Windows в интегрированной среде программирования
- •6 Основные типы данных
- •7 Символы и строки. Символы, строки и массивы строк. Операции над строками
- •8 Структура программы на языке c#. Понятие пространства имен. Иерархия пространств имен. Видимость имен.
- •9 Операторы. Основные языка с#. Арифметические и логические операторы. Бинарные и унарные операторы. Составные операторы. Понятие перегрузки операторов.
- •10 Выражения. Приоритет и ассоциативность операторов. Порядок вычисления выражения.
- •11 Преобразования типов. Иерархия численных типов. Явное и неявное преобразование типов. Возможные ошибки.
- •12 Тема: Модификаторы доступа языка c#. Необходимые знания: Назначение и функции модификаторов private, public, protected, internal, protected internal, private protected.
- •13 Выбор вариантов.
- •If (Условие)
- •14 Циклы.
- •15 Классы памяти
- •16 Функции в языке с#
- •17 Массивы. Создание и инициализация. Ссылки на массив. Двухмерные и многомерные массивы. Инициализация массивов. Невыровненные массивы.
- •18 Понятие класса. Определение класса и экземпляр класса. Данные и методы. Ключевое слово partial.
- •19 Создание объекта класса.
- •20 Деструкторы и «сборка мусора». Оператор «new». Резервирование и освобождение памяти. Деструкторы и «сборка мусора».
- •21 Полиморфизм и перегрузка операторов. Перегрузка унарных и бинарных операторов. Семантика перегрузки операторов в с#.
- •Понятие полиморфизма и шаблоны. Назначение и преимущества использования шаблонов. Параметры универсального типа.
- •23 Свойства c# (Понятие инкапсуляции и свойства в c#. Использование ключевых слов «get» и «set». Преимущества использования свойств.)
- •24 Механизм исключений (Назначение исключений. Основные категории исключений. Ключевые слова try, catch и finally, throw.)
- •25 Наследование в c#. Понятие наследования в c#. Механизм наследования. Базовый и производный классы. Наследование и модификаторы доступа.
16 Функции в языке с#
Создание и использование функций. Аргументы функции
Функция main является главной функцией приложения и точкой входа программы. Любая функция в Си-шарп может быть объявлена только в рамках класса. Объявление пользовательской функции внутри другой функции (например, main) недопустимо. Объявление функции имеет следующую структуру:
[модификатор доступа] [тип возвращаемого значения] [имя функции] ([аргументы])
{
// тело функции
}
Модификатор доступа (области видимости) может быть public, private, protected, internal.
Между модификатором и типом может стоять ключевое слово static, что означает, что функция будет статичной. Из статичной функции можно вызывать другие функции, если они тоже статичные. Главная функция main – всегда static.
Функция может возвращать значение или не возвращать. Если функция, например, возвращает целое число, то нужно указать тип int. Если функция не возвращает никакого значения, то для этого используется ключевое слово void. Функции, которые не возвращают значение, называют процедурами.
По умолчанию при передаче в метод экземпляра типа значения вместо самого этого экземпляра передается его копия. Поэтому изменения в аргументе не оказывают влияния на исходный экземпляр в вызывающем методе. Чтобы передать экземпляр типа значения по ссылке, используется ключевое слово ref.
При передаче в метод объекта ссылочного типа передается ссылка на этот объект. То есть метод получает не сам объект, а аргумент, который указывает расположение объекта. При изменении члена объекта с помощью этой ссылки это изменение отражается в аргументе в вызывающем методе, даже если объект передается по значению.
Ключевое слове return также останавливает выполнение метода. Если тип возврата — void, инструкцию return без значения по-прежнему можно использовать для завершения выполнения метода. Без ключевого слова return этот метод будет останавливать выполнение при достижении конца блока кода. Методы с типом возврата, отличным от void, должны использовать ключевое слово return для возврата значения.
Аргументы – это те данные, которые необходимы для выполнения функции. Аргументы записываются в формате [тип] [идентификатор]. Если аргументов несколько, они отделяются запятой. Аргументы могут отсутствовать.
Параметры и аргументы функции
Определение метода задает имена и типы всех необходимых параметров. Когда вызывающий код вызывает метод, он предоставляет конкретные значения, называемые аргументами, для каждого параметра. Аргументы должны быть совместимы с типом параметра, но имя аргумента (если есть), используемое в вызывающем коде, не обязательно должно совпадать с именем параметра, указанным в методе.
Первая строка функции, где указываются тип, имя, аргументы и т.д. называется заголовком функции.
17 Массивы. Создание и инициализация. Ссылки на массив. Двухмерные и многомерные массивы. Инициализация массивов. Невыровненные массивы.
Массив – это конечная группа элементов одного типа, имеющая общее имя.
1. Массивы относятся к ссылочным типам данных. Это значит, что в стеке хранится ссылка на выделенное пространство для элементов массива в куче/хипе/динамической памяти. Важно понимать, что массив хранится как последовательный набор элементов (значения идут тупо друг за другом), в то время как очень похожий на него список может быть хаотично разбросан по всей динамической памяти вперемешку с остальными ссылочными данными. В каждом элементе списка есть адрес, где найти следующий элемент. Получается, что адреса элементов массивов известны, можно сказать хочу 4ый элемент такого-то массива и получить его БЫСТРО, а в списках мы говорим, чтобы получить 4ый элемент найди первый, в нем адрес второго, во втором адрес третьего и там ты найдешь свой четвертый элемент, что ДОЛГО.
Динамическая память |
Массив |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
Динамическая память |
Лист |
3 (замыкающий элемент) |
|
какой-то инородный элемент |
|
1 + адрес следующего значения (2ки) |
|
2 + адрес следующего значения (3ки) |
|
какой-то инородный элемент |
2. Массивы построены на основе класса System.Array, поэтому любой массив получает методы и свойства класса Array, что значительно упрощает работу с массивами.
3. Работа с массивами более безопасна, поскольку контролируется выход за границы массива.
4. По умолчанию элементам массива присваиваются начальные значения.
Начальные значения:
• для арифметических типов - 0,
• для ссылочных типов - null,
• для символов - пробел.
• для логических – false
Имеются одномерные, многомерные и ступенчатые массивы.
Одномерный массив
тип[] имя_массива = new тип [размер];
Например: int[] a=new int [10]; это значит, что длина массива равна 10, а внутри массива будет десять нулей, т.к. для арифметических типов значение по умолчанию 0.
Возможно объявление массива с инициализацией значений:
тип [] имя _массива=new тип [размер] {список инициализированных значений};
Например: int[] a= new int[4] {0, 1, 2, 3};
Но, если мы инициализируем какие-то значения сами, то код можно сократить: убрать размер, тип и даже ключевое слово new.
Пример: int[] a = { 1, 2, 3, 5 };
Многомерный массив
Массивы характеризуются таким понятием как ранг или количество измерений. Выше мы рассматривали массивы, которые имеют одно измерение (то есть их ранг равен 1) - такие массивы можно представлять в виде горзонтального ряда элемента. Но массивы также бывают многомерными. У таких массивов количество измерений (то есть ранг) больше 1.
Массивы, которые имеют два измерения (ранг равен 2) называют двухмерными.
Например, создадим одномерный и двухмерный массивы, которые имеют одинаковые элементы:
int[] nums1 = new int[6] { 0, 1, 2, 3, 4, 5 };
-
0
1
2
3
4
5
int[,] nums2 = new int[2,3] { { 0, 1, 2 }, { 3, 4, 5 } };
-
0
1
2
3
4
5
Объявить двумерный массив можно одним из предложенных способов:
тип [,] a = new тип [размер 1, размер 2] {{эл - ты 1-ой строки}, … , {эл-ты n-ой строки}};
тип [,] a ={{эл - ты 1-ой строки}, … , {эл-ты n-ой строки}};
Аналогично одномерному, мы можем не писать размеры ( int[,]), тип ( [,]) и даже ключевое слово new.
Ступенчатые массивы / Невыровненные массивы / Зубчатые массивы
Иначе говоря, массив массивов. Ступенчатый массив объявляется с помощью идущих друг за другом пар квадратных скобок. Всегда задается столько пар квадратных скобок, сколько размерностей у массива.
Определение ступенчатых массивов:
int[][] arr = new int [3][]; // Объявляем ступенчатый массив
Размерность = 2, соответственно две пары кв. скобок - [][]. Внешнее измерение равно 3, значит в него войдет три каких-то массива (одномерных или многомерных). Последняя пара скобок [] – значит состоит из одномерных, если бы была [ , ] – был бы набор двумерных, ну и так далее [ , , ] – уже набор трехмерных.
Дальше задаем элементы ступенчатого массива:
arr[0] = new int[3]; // Определяем нулевой элемент
arr[1] = new int[2]; // Определяем первый элемент
arr[2] = new int[5]; // Определяем второй элемент
Каждый элемент представляет собой одномерный массив целых чисел. Первый элемент массива состоит из трех целях чисел, второй – из двух и третий – из пяти.
Внутреннее измерение при объявлении не указывается, поскольку в отличие от прямоугольного массива, в невыровненном каждый внутренний массив может иметь разную длину. Каждому внутреннему массиву автоматически присваивается значение null, а не пустой массив, и поэтому каждый внутренний массив нужно объявлять отдельно.