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

Использование структур в качестве параметров функций

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

Использование переменных, имеющих перечислимый тип, в качестве параметра достаточно удобно и наглядно, но не несет в себе никаких новых возможностей для программиста. Использование структур, напротив, позволяет сократить (иногда очень существенно) число параметров функции, так как сам структура является сложным типом.

Рассмотрим пример структуры, определяющей положение точки на плоскости в прямоугольной системе координат:

struct point

{

public double x;

public double y;

}

Если в программе необходима функция, определяющая расстояние между двумя точками, то естественно передавать этой функции два параметра, имеющих определенный выше тип point:

static double distanceBetween(point p1, point p2)

{

return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));

}

Для вызова этой функции определим в функции Main() две переменных типа point, введем значения их полей, вызовем функцию, рассчитывающую расстояние и напечатаем результат:

static void Main(string[] args)

{

point p1, p2;

Console.Write("x1 = ");

p1.x = Convert.ToDouble(Console.ReadLine());

Console.Write("y1 = ");

p1.y = Convert.ToDouble(Console.ReadLine());

Console.Write("x2 = ");

p2.x = Convert.ToDouble(Console.ReadLine());

Console.Write("y2 = ");

p2.y = Convert.ToDouble(Console.ReadLine());

double dist = distanceBetween(p1, p2);

Console.WriteLine("Расстояние между точками равно {0:f4}", dist);

Console.ReadLine();

}

В результате работы программы на консоль будет выведено:

Обратите внимание на форматирование вывода на консоль значения с плавающей точкой. Использование формата {0:f4} обеспечивает вывод четырех знаков после запятой.

Использование структур в качестве возвращаемых значений функций

Не менее удобно использовать структуры в качестве значений, возвращаемых функциями. Эта возможность позволяет отказаться от передачи в функцию параметров по ссылке (модификатор ref), и передавать их только по значению, а также от использования выходных параметров функции (модификатор out).

Если функция формирует несколько новых значений, то достаточно часто они оказываются логически связаны между собой и могут быть объединены в одно целое – в качестве полей структурного типа данных. Возможны также случаи, когда соответствующий структурный тип уже описан в программе, а может быть, даже передается функции в качестве параметра.

В качестве примера рассмотрим использование описанного ранее типа для хранения положение точки на плоскости. Если известны координаты двух точек, определяющих концы отрезка прямой, и необходимо определить координаты середины этого отрезка, то без использования структур описание соответствующей функции может выглядеть следующим образом:

static void middle(int x1, int y1, int x2, int y2, out int xCenter, out int yCenter)

{

// Определение значений хCenter и yCenter

}

Эта функция имеет шесть параметров, из которых первые четыре являются входными и передаются значением, а последние два – выходными и передаются по ссылке. Использование структурных переменных в качестве параметров функции и возвращаемого значения позволяет сократить число параметров до двух:

static point middle(point p1, point p2)

{

point center;

// Определение значений center.x и center.y

return center;

}

Полный текст программы, использующей эту функцию, может выглядеть так:

using System;

namespace CenterPoint

{

class Program

{

struct point

{

public double x;

public double y;

}

static void Main(string[] args)

{

point p1, p2;

Console.Write("x1 = ");

p1.x = Convert.ToDouble(Console.ReadLine());

Console.Write("y1 = ");

p1.y = Convert.ToDouble(Console.ReadLine());

Console.Write("x2 = ");

p2.x = Convert.ToDouble(Console.ReadLine());

Console.Write("y2 = ");

p2.y = Convert.ToDouble(Console.ReadLine());

point center = middle(p1, p2);

Console.WriteLine("Координаты центра: х={0}; у={1}",

center.x, center.y);

Console.ReadLine();

}

static point middle(point p1, point p2)

{

point center;

center.x = (p1.x + p2.y) / 2;

center.y = (p1.y + p2.y) / 2;

return center;

}

}

}

Результат работы такой программы выглядит следующим образом: