Студопедия — Использование Конструктора экземпляра и других методов при работе со структурами
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






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

Эти возможности будем рассматривать на примере структуры 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. Возможность использования методов, как членов структуры.







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



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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

Этические проблемы проведения экспериментов на человеке и животных В настоящее время четко определены новые подходы и требования к биомедицинским исследованиям...

Классификация потерь населения в очагах поражения в военное время Ядерное, химическое и бактериологическое (биологическое) оружие является оружием массового поражения...

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

Постинъекционные осложнения, оказать необходимую помощь пациенту I.ОСЛОЖНЕНИЕ: Инфильтрат (уплотнение). II.ПРИЗНАКИ ОСЛОЖНЕНИЯ: Уплотнение...

Приготовление дезинфицирующего рабочего раствора хлорамина Задача: рассчитать необходимое количество порошка хлорамина для приготовления 5-ти литров 3% раствора...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия