
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Структуры
Еще одним важным типом переменной, который широко используется в C#, является struct (сокращение от слова structure — "структура"). Структуры вполне соответствуют своему названию: это структуры данных, которые составлены из информации различного характера, возможно, из данных различных типов. Они позволяют программистам описывать свои собственные типы переменных, для которых данная структура является базовой.
В качестве примера предположим, что нам необходимо хранить информацию о маршруте из одной точки в другую, включающую направление и расстояние в километрах. Для простоты в качестве направления будет использоваться только одна из четырех сторон света (так что для описания направления вполне подойдет перечислимый тип orientation), а длина маршрута будет представлена типом double.
В этом случае мы могли бы использовать две разные переменные, написав следующий код:
orientation myDirection;
double myDistance;
В таком подходе с использованием двух переменных нет ничего плохого, однако намного удобней (особенно если маршрутов много) хранить всю эту информацию в одном месте.
Описание структур
Для описания структур используется ключевое слово struct:
struct <имяТипа>
{
<объявлениеЧленов>
}
В разделе <объявлениеЧленов> содержатся объявления переменных (они называются полями структуры) практически в обычном формате. Объявление каждого члена имеет следующий вид:
<доступ> <тип> <имя>;
Для того чтобы код, обращающийся к структуре, имел доступ к ее полям, в разделе <доступ> следует использовать ключевое слово public (общий). Например:
struct route
{
public orientation direction;
public double distance;
}
После того как мы описали структуру, мы можем использовать ее для описания переменных соответствующего типа:
route myRoute;
Для получения доступа к отдельным полям этой составной переменной следует использовать точку:
myRoute.direction = orientation.north;
myRoute.distance = 2.5;
Рассмотрим использование этого типа на примере.
using System;
namespace Route
{
class Program
{
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
struct route
{
public orientation direction;
public double distance;
}
static void Main(string[] args)
{
route myRoute;
int myDirection = -1;
double myDistance;
Console.WriteLine("1) North (Север)\n2) South(Юг)\n" +
"3) East(Восток)\n4) West(Запад)");
do
{
Console.WriteLine("Выберите направление:");
myDirection = Convert.ToInt32(Console.ReadLine());
}
while ((myDirection < 1) || (myDirection > 4));
Console.WriteLine("Задайте расстояние:");
myDistance = Convert.ToDouble(Console.ReadLine());
myRoute.direction = (orientation)myDirection;
myRoute.distance = myDistance;
Console.WriteLine("myRoute содержит направление {0} и " +
"расстояние {1} км", myRoute.direction,
myRoute.distance);
Console.ReadLine();
}
}
}
Структуры, так же как и перечислимые типы, описываются вне основного тела кода. Поэтому структура route описана внутри класса программы, в том же месте, в котором описывается используемый данной структурой тип orientation.
Главная функция программы осуществляет запрос входной информации у пользователя и вывод ее на экран. При этом выполняется несложная проверка допустимости вводимой информации: ввод направления помещается внутрь цикла do, любая введенная информацию, не являющуюся целым числом в диапазоне от 1 до 4 (эти значения соответствуют членам перечислимого типа) отбрасывается.
Еще один момент, на который следует обратить внимание, заключается в том, что работа с полями переменной типа route строится точно таким же образом, как если бы мы обращались к переменным того типа, что и эти поля. Присваивание, например, выполняется следующим образом:
myRoute.direction = (orientation)myDirection;
myRoute.distance = myDistance;
Можно непосредственно присваивать введенное значение полю myRoute.distance без каких бы то ни было нежелательных последствий:
myRoute.distance = Convert.ToDouble(Console.ReadLine());
Наличие дополнительного шага позволяет проверять вводимые значения, хотя в самом коде такая проверка не осуществляется.
Любой доступ к полям структуры организовывается аналогичным образом. Вполне допустимо считать, что выражения типа переменнаяТипаСтруктуры.переменнаяТипаПоля представляют собой переменную типа переменнаяТипаПоля.