КАТЕГОРИИ: Архитектура-(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}", 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}", } } }
Здесь членом структуры является конструктор с двумя параметрами, соответствующими двум полям структуры, которые будут заполняться при вызове конструктора для каждого объекта структуры. При этом значение третьего поля вычисляется в конструкторе с использованием значений элементов массива, являющегося вторым полем структуры.
Дата добавления: 2014-12-07; Просмотров: 457; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |