Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Использование Конструктора экземпляра и других методов при работе со структурами




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

Эти возможности будем рассматривать на примере структуры 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);

}

}

}

 

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




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 430; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.033 сек.