Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред1 С#.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

Функции структур

При рассмотрении структурных типов данных основной акцент делался на то, что структуры предназначены для хранения в одном месте нескольких элементов информации. На самом деле возможностей у структур гораздо больше, и одной из них является способность содержать не только данные, но и функции. На первый взгляд подобное может показаться немного странным, однако на практике это часто оказывается полезным.

В качестве простого примера рассмотрим следующую структуру:

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();

}

Результатом работы такой программы будет: