Использование Конструктора экземпляра и других методов при работе со структурами
Рассмотрим более подробно различные способы инициализации полей структуры, работы с отдельными экземплярами структуры, в частности включение методов в описание структуры.
Эти возможности будем рассматривать на примере структуры Sportsmen, использованной в примере 4.1.
В примере 4.1 экземпляр (объект) структуры объявляется как обычная переменная указанием типа перед именем. В этом случае поля структуры остаются без значений и их нельзя использовать до инициализации всех полей. Например,
using System;
namespace ConsoleApplication1
{
struct Sportsmen
{
public string famile;
public int rez;
}
class Program
{
static void Main(string[] args)
{
Sportsmen sp;
sp.famile = "Иванов";
sp.rez = 5;
Console.WriteLine("Фамилия {0} Результат {1:d}", sp.famile, sp.rez);
}
}
}
Попытка вывести значения полей сразу после объявления переменной (до задания значений полям) приведет к сообщению об ошибке.
Объект структуры может быть создан и другим способом: с использованием оператора new.
Sportsmen sp = new Sportsmen();
В этом случае при создания объекта вызывается соответствующийконструктор экземпляра, который выполняет инициализацию полей нулями. Значения полей в результате будут следующими
Вывод значений полей в этом случае не приведет к ошибке.
Конструктор экземпляра– это метод с тем же именем, что и структура, вызываемый оператором new. Конструктор может иметь параметры, его можно описать при определении структуры и использовать для инициализации полей отдельных объектов структуры в более компактной и наглядной форме.
Рассмотрим снова задачу примера 4.1 и в описание структуры включим еще один член: конструктор с параметрами.
struct Sportsmen
{
public string famile;
public double rez;
public Sportsmen(string famile1, double rez1)
{
famile = famile1;
rez = rez1;
}
}
Теперь, если объявлен массив структур
Sportsmen[] sp = new Sportsmen[5];
то задание полей элементов этого массива можно с использованием конструктора выполнить следующим образом
sp[0] = new Sportsmen("Иванов", 1.50);
sp[1] = new Sportsmen("Петров", 1.55);
sp[2] = new Sportsmen("Сидоров", 1.47);
sp[3] = new Sportsmen("Кузнецов", 1.46);
sp[4] = new Sportsmen("Макаров", 1.54);
При вызове конструктора оператором new на место его первого параметра передается соответствующая фамилия, которая присваивается полю famile, а на место второго параметра – результат, который присваивается полю rez соответствующего экземпляра структуры (элементу массива структур).
Внутри конструктора могут выполняться и вычисления, необходимые для определения отдельных полей.
Пусть, например, каждый спортсмен выполняет две попытки (rez1, rez2) и окончательный результат определяется суммой двух попыток (rez=rez1+ rez2). Описание структуры в этом случае может быть следующим
struct Sportsmen
{
public string famile;
public double rez1, rez2, rez;
public Sportsmen(string famile1, double rezz1, rezz2)
{
famile = famile1;
rez1 = rezz1;
rez2 = rezz2
rez = rez1 + rez2;
}
}
Замечания. 1. Имена параметров конструктора не должны совпадать с именами полей структуры. Если они совпападают, то нужно использовать ключевое слово this. Например,
struct Sportsmen
{
public string famile;
public double rez1, rez2, rez;
public Sportsmen(string famile, double rez1, rez2)
{
this.famile = famile;
this.rez1 = rez1;
this.rez2 = rez2
rez = rez1 + rez2;
}
}
2. В конструкторе должны быть определены все поля структуры одним из двух способов: либо присваиванием значения передаваемого конструктору аргумента, либо вычислением с использованием значений уже определенных полей.
Следующая прграмма реализует решение задачи примера 4.1 для случая двух попыток с использованием конструктора.
using System;
struct Sportsmen
{
public string famile;
public double rez1, rez2, rez;
public Sportsmen(string famile1, double rezz1, double rezz2)
{
famile = famile1;
rez1 = rezz1;
rez2 = rezz2;
rez = rez1 + rez2;
}
}
class Program
{
static void Main(string[] args)
{
Sportsmen[] sp = new Sportsmen[5];
sp[0] = new Sportsmen("Иванов", 1.50, 1.52);
sp[1] = new Sportsmen("Петров", 1.55, 1.8);
sp[2] = new Sportsmen("Сидоров", 1.47, 1.5);
sp[3] = new Sportsmen("Кузнецов", 1.46, 1.43);
sp[4] = new Sportsmen("Макаров", 1.54, 1.44);
for (int i = 0; i < sp.Length; i++)
{
Console.WriteLine("Фамилия {0}\t Результат {1:f2}",
sp[i].famile, sp[i].rez);
}
Console.ReadKey();
}
}
Теперь при выполнении, например, оператора
sp[0] = new Sportsmen("Иванов", 1.50, 1.52);
в поле rez будет помещаться сумма 3.02.
Результат выполнения программы будет следующим.
Помимо конструктора описание структуры может содержать и другие методы (подробнее о методах см. п. 5). Например, в описании структуры
struct Sportsmen
{
public string famile;
public double rez;
public double factor(int i)
{
return i * rez;
}
}
описан метод factor для умножнния результата rez на коэффициент i.
После объявления в методе Main объекта структуры этот метод может быть вызван указанием имени объекта структуры и после точки имени метода и его аргумента в круглых скобках.
Sportsmen sp;
sp.famile = "Иванов";
sp.rez = 5.2;
double rez1 = sp.factor(3);
Console.WriteLine(rez1);
Console.ReadKey();
В результате переменная rez1 получит значение 15.6.
В описании структуры може быть описан также статический метод. Статический метод не применяется к конкретному объекту структуры, а относится ко всей структуре и доступ к нему осуществляется по имени структуры, а не экземпляря (объекта) структуры. Подробнее см п. 5.
В качестве примера рассмотрим описанную выше структуру и добавим в ее описание статический метод для подсчета количества спортсменов. Этот метод будет прибавлять к общему количеству 1 после ввода данных для очередного спортсмена.
struct Sportsmen
{
public string famile;
public double rez;
public static int sportsmenCounter = 0;
public static int AddSportsmen()
{
return sportsmenCounter = sportsmenCounter + 1;
}
}
Если в методе Main имеются операторы
Sportsmen sp;
sp.famile = "Иванов";
sp.rez = 5.2;
Sportsmen.AddSportsmen();//Вызов статического метода
Console.WriteLine (Sportsmen.sportsmenCounter);
sp.famile = "Петров";
sp.rez = 7.4;
Sportsmen.AddSportsmen();
Console.WriteLine(Sportsmen.sportsmenCounter);
то в результате их выполнения первым оператором WriteLine будет выведено 1, а вторым – 2.
Пример 4.2. Студенты одной группы (не более 25 человек) в сессию сдают четыре экзамена. Составить список студентов, средний балл которых по всем экзаменам не менее 4. Результаты вывести в виде таблицы с заголовком в порядке убывания среднего балла.
using System;
struct Struct1
{
public string famile;
public double[] x;
public double sred;
public Struct1(string famile1, double[] x1)
{
sred = 0;
famile = famile1;
x = x1;
for (int i = 0; i < 4; i++)
{
sred += x[i];
}
sred /= 4;// sred = sred/4
}
}
class Program
{
static void Main(string[] args)
{
Struct1[] cl = new Struct1[3];
cl[0] = new Struct1("Иванов", new double[] { 3.0, 5.0, 2.0, 3.0 });
cl[1] = new Struct1("Петров", new double[] { 5.0, 4.0, 5.0, 3.0 });
cl[2] = new Struct1("Сидоров", new double[] { 5.0, 4.0, 5.0, 5.0 });
for (int i = 0; i < cl.Length; i++)
Console.WriteLine("Фамилия {0}\tСредний балл {1,4:f2}",
cl[i].famile, cl[i].sred);
for (int i = 0; i < cl.Length - 1; i++)
{
double amax = cl[i].sred;
int imax = i;
for (int j = i + 1; j < cl.Length; j++)
{
if (cl[j].sred > amax)
{
amax = cl[j].sred;
imax = j;
}
}
Struct1 temp;
temp = cl[imax];
cl[imax] = cl[i];
cl[i] = temp;
}
Console.WriteLine();
for (int i = 0; i < cl.Length; i++)
{
if (cl[i].sred >= 4)
Console.WriteLine("Фамилия {0}\tСредний балл {1,4:f2}",
cl[i].famile, cl[i].sred);
}
}
}
Здесь членом структуры является конструктор с двумя параметрами, соответствующими двум полям структуры, которые будут заполняться при вызове конструктора для каждого объекта структуры. При этом значение третьего поля вычисляется в конструкторе с использованием значений элементов массива, являющегося вторым полем структуры.
Вопросы для самопроверки
1. Создание объекта структуры при помощи конструктора. Что такое конструктор экземпляра.
2. Особенности инициализации полей структуры при использовании конструктора экземпляра.
3. Различные способы задания значений полей структуры при использовании конструктора.
4. Возможность использования методов, как членов структуры.
Дата добавления: 2015-02-07; просмотров: 1049;