
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Функции структур
При рассмотрении структурных типов данных основной акцент делался на то, что структуры предназначены для хранения в одном месте нескольких элементов информации. На самом деле возможностей у структур гораздо больше, и одной из них является способность содержать не только данные, но и функции. На первый взгляд подобное может показаться немного странным, однако на практике это часто оказывается полезным.
В качестве простого примера рассмотрим следующую структуру:
struct customerName // Имя заказчика
{
public string firstName, // Имя
public string middleName, // Отчество
public string lastName; // Фамилия
}
Если у нас имеются переменные типа customerName и нам необходимо вывести на консоль полное имя, мы будем вынуждены конструировать это имя из его составных частей. Например, для переменной типа customerName с именем myCustomer можно использовать следующий синтаксис:
customerName myCustomer;
myCustomer.firstName = "Сергей";
myCustomer.middleName = "Васильевич";
myCustomer.lastName = "Сидоров";
Console.WriteLine("{0} {1} {2}", myCustomer.firstName, myCustomer.middleName, myCustomer.lastName);
Имея возможность включать в структуры функции, мы можем упростить эту процедуру за счет централизованного выполнения часто встречающихся задач. В данном случае это можно сделать следующим образом:
struct customerName // Имя заказчика
{
public string firstName, // Имя
public string middleName, // Отчество
public string lastName; // Фамилия
public string Name()
{
return firstName + " " + middleName + " " + lastName;
}
}
Эта функция очень похожа на ранее использовавшиеся функции, за исключением того, что в ней отсутствует модификатор static. Пока достаточно просто запомнить, что это ключевое слово для функций структур не требуется. Мы можем воспользоваться этой функцией следующим образом:
customerName myCustomer;
myCustomer.firstName = "Сергей";
myCustomer.middleName = "Васильевич";
myCustomer.lastName = "Сидоров";
Console.WriteLine(myCustomer.Name());
Аналогичные функции можно добавить в структуру point, чтобы разгрузить функцию Main() от операций ввода-вывода координат точки. Обе функции удобно снабдить параметром, через который будем передавать строку символов, играющую роль поясняющего текста – что именно вводится или выводится:
struct point
{
public double x;
public double y;
public void Input(string title)
{
Console.Write(title);
Console.Write("x = ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("y = ");
y = Convert.ToDouble(Console.ReadLine());
}
public void Output(string title)
{
Console.Write(title);
Console.WriteLine("х={0}; у={1}", x, y);
}
}
Использовать эти функции можно следующим образом:
p1.Input("Первая точка: "</str>);
p2.Input("Вторая точка: "</str>);
point center = middle(p1, p2);
center.Output("Координаты центра: "</str>);
Но если оставить описания структурных переменных в том виде, как раньше:
point p1, p2;
К сожалению, компилятор в этом случае выдаст два одинаковых сообщения об ошибках для каждой из структурных переменных:
error CS0165: Use of unassigned local variable 'p1'
Компилятор сообщает, что переменные p1 и p2 не инициализированы, то есть не имеют начальных значений. Это происходит потому, что для него неочевидно, что вызов функции Input() служит именно для задания значений координат точки.
Хорошим выходом из данной ситуации было бы создание на основе структуры point класса, но это уже требует знания основ объектно-ориентированного программирования. Если попытаться обойтись без этого, то можно явно проинициализировать используемые структурные переменные любыми значениями, например, нулями. В этом случае функция Main() примет вид:
static void Main(string[] args)
{
point p1, p2;
p1.x = p1.y = p2.x = p2.y = 0;
p1.Input("Первая точка: ");
p2.Input("Вторая точка: ");
point center = middle(p1, p2);
center.Output("Координаты центра: ");
Console.ReadLine();
}
Результатом работы такой программы будет: