Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Объектно-ориентированное программирование в Microsoft Visual Studio 2005
В предыдущих главах мы рассмотрели, как писать программы на C# (по процедурной и по объектно-ориентированной методике), а также создание интерфейса средствами Microsoft Visual Studio 2005. Рассмотрим в этой главе, как объединить в одно целое все изложенное выше: как построить программы для решения прикладных задач и как построить интерфейс для них. Имеются следующие возможности, которые мы по очереди рассмотрим: 1. Дополнить классы форм собственными данными и функциями для решения прикладных задач. Другими словами, объединить в классах интерфейс и логику прикладной задачи. 2. Создать отдельные классы для решения прикладных задач, предусмотрев в их методах (в том числе и в конструкторах) формальные параметры и возвращаемые значения для взаимодействия с интерфейсом. Чтение (запись) данных из интерфейса (в интерфейс) и их передача в методы обеспечивается средствами Visual Studio. 3. Передать в классы прикладных задач указатели на формы (или на компоненты на форме); чтение (запись) данных из форм осуществляется методами классов. 4. В методах классов прикладной задачи предусмотреть открытие форм для ввода/вывода.
Дополнение класса формы средствами решения прикладной задачи
Пусть задана задача: сколько элементов одномерного массива меньше его среднего арифметического. В классе Form1 имеются объявление данных, а также функции для ее решения. Вызов функций выполняется при нажатии на командные кнопки. Форма для этой задачи представлена на рис. 5.1.
Рис. 5.1
Класс Form1: namespace Exampl_51 { public partial class Form1 : Form { double[] x; // данные для задачи int kol; double SrAr;
public Form1() { InitializeComponent(); }
private void button4_Click(object sender, EventArgs e) { Close(); } private void Input() { // ввод исходных данных string[] temp; string dan; dan = textBox1.Text; temp = dan.Split(';'); x = new double[temp.Length]; for (int i = 0; i < x.Length; i++) x[i] = Convert.ToDouble(temp[i]); } private void Comp_aver() { // нахождение среднего арифметического SrAr = 0; for (int i = 0; i < x.Length; i++) SrAr += x[i]; SrAr = SrAr / x.Length; } private void Comp_Count() {// определение требуемого количества элементов kol = 0; for (int i = 0; i < x.Length; i++) if (x[i] < SrAr) kol++;
}
private void button1_Click(object sender, EventArgs e) { // реализация кнопки ввода исходных данных Input(); Sred.Enabled = true; }
private void Sred_Click(object sender, EventArgs e) { // реализация кнопки нахождения среднего арифметического Comp_aver(); KolVo.Enabled = true; }
private void KolVo_Click(object sender, EventArgs e) { //нахождение и вывод количества Comp_Count(); label3.Text = "" + kol; }
private void textBox1_Click(object sender, EventArgs e) {// перевод задачи в исходное состояние textBox1.Text = ""; Sred.Enabled = false; KolVo.Enabled = false; label3.Text = ""; } } }
Первоначально кнопки «Среднее арифметическое» и «Количество» заблокированы, потому что до ввода исходных данных на них нажать нельзя. Щелчок мышью на строке ввода исходных данных переводит программу в исходное состояние.
Создание отдельных классов
Поступим следующим образом. Объявим несколько классов и используем их методы при нажатии командных кнопок на форме. В принципе, можно использовать сколь угодно сложные структуры данных в классах, но мы не будем тратить на это время, потому что вопросы передачи структурированных данных в качестве формальных/фактических параметров функций были подробно рассмотрены выше. Создавать классы можно двумя способами: - написать классы самому «с нуля»; не забудьте, что класс формы должен быть впереди собственных классов; - ставить курсор мыши на имя проекта, нажать на правую клавишу, выбрать из выпадающего меню пункт «Add», далее «Class».
namespace Klassid { public class Cl1 { protected int a1 = 0; protected double a2 = 3.5; private Cl3 _Cl3; public Cl1(int i, double x) { a1 = i; a2 = x; } public string opp() { _Cl3 = new Cl3("Greeting from Moscow"); return _Cl3.get_c1();
} public double op2() { return (a1*a2); }
} public class Cl2 : Cl1 { public string st1; public Cl2(int i, double x, string s) : base(i, x) { st1 = s; } public string op21() { return st1; } } public class Cl3 {
public string c1; public Cl3(string t) { c1 = t; } public string get_c1() { return c1; } } public class Cl4 { public int i1; public Cl4(int k) { i1 = k; } public int fun2() { return i1; } } class Cl5 // обработка массива { int[] k; public Cl5(int[] temp) { k = new int[temp.Length]; for (int i = 0; i < temp.Length; i++) k[i] = temp[i]; } public int sum_pol() { int u=0; for (int i = 0; i < k.Length; i++) if (k[i] > 0) u += k[i]; return u; } } }
Работа с классами из формы: namespace Klassid { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { Close(); }
private void button2_Click(object sender, EventArgs e) {// создание объекта класса Cl3 Cl3 pp = new Cl3(textBox1.Text); textBox2.Text = pp.get_c1(); }
private void button3_Click(object sender, EventArgs e) { // работа с классом Cl2 Cl2 q; string s1; s1 = textBox1.Text; q = new Cl2(6, 2.5, s1); textBox2.Text = q.st1; }
private void button4_Click(object sender, EventArgs e) { // работа с классом Cl2 Cl2 q; string s1; int i; s1 = textBox1.Text; i=Convert.ToInt32(textBox2.Text); q=new Cl2(i,2.5,s1); textBox2.Text=Convert.ToString(q.op21()); }
private void button5_Click(object sender, EventArgs e) {// работа с классом Cl1, а через него с Cl3 Cl1 f1 = new Cl1(5, 3.7); textBox1.Text = f1.opp(); } private void button6_Click(object sender, EventArgs e) {// обработка массива string[] z; string s1; int[] t; s1 = textBox1.Text; z = s1.Split(';'); t=new int[z.Length]; for (int i = 0; i < z.Length; i++) t[i] = Convert.ToInt32(z[i]); Cl5 My_Cl = new Cl5(t); textBox2.Text = "Summa " + My_Cl.sum_pol(); } } } 5.3. Передача в классы указателей на формы
Рассмотрим в этом параграфе использование в числе данных класса указателя на форму для обеспечения возможности связывания переменных класса и компонентов на форме. Напомним, что форме соответствует класс, и все компоненты формы являются и переменными ее класса. Переменные класса, по умолчанию, имеют атрибут доступа private. Поэтому не забудьте: если хотите организовать доступ к компонентам формы по указателю извне необходимо изменять атрибут доступа (свойство Modifiers)этих компонентов. Рассмотрим следующий пример: найти среднее арифметическое тех элементов одномерного массива, которые больше заданного значения. Пусть наше приложение состоит из одной формы, на которой имеются две строки редактирования (textBox1 – исходный массив, textBox2 – заданное значение), метка для вывода результата (label4). Значение свойства Modifiers для всех перечисленных компонентов должно быть public. Кроме того там имеются три командных кнопки (button1, button2, button3). Класс пользователя: public class Class1 { int[] k; // исходный массив double d; // среднее арифметическое int predel=0,kol; // заданное значение, количество элементов Form1 ff; // указатель на форму public Class1(Form1 f1) { ff = f1; // конструктор сохраняет значение указателя } public void input() { //ввод исходных данных, пустое поле считается нулем string[] s1; string s2; s2 = ff.textBox1.Text; s1 = s2.Split(';'); k = new int[s1.Length]; for (int i = 0; i < s1.Length; i++) if (s1[i] == "") k[i] = 0; else k[i] = Convert.ToInt32(s1[i]); if (ff.textBox2.Text == "") predel = 0; else predel = Convert.ToInt32(ff.textBox2.Text); } public void obr() { // нахождение среднего арифметического d = 0; for (int i = 0; i < k.Length; i++) if (k[i] > predel) { d += k[i]; kol++; } if (kol != 0) d /= kol; } public void output() { // вывод результата if (kol == 0) ff.label4.Text = "No numbers"; else ff.label4.Text = "" + d; } } }
В класс пользователя передается указатель на форму, на которой имеются компоненты для исходных данных и результата. Методы класса пользователя осуществляют ввод/вывод и обработку. Методы формы: namespace ClassForm { public partial class Form1 : Form { Class1 my; // указатель на класс пользователя public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { // создание класса пользователя my = new Class1(this);//передача указателя на //текущую (в нашем случае на главную) форму button2.Enabled = true; button1.Enabled = false; } private void button2_Click(object sender, EventArgs e) { // ввод, вычисления и вывод результата my.input(); my.obr(); my.output(); } private void button3_Click(object sender, EventArgs e) { Close(); } } } Примечанияотносительно метода button1_Click:
Разумеется, можно создать сколько угодно форм пользовательского интерфейса и передать их указатели в классы пользователя. Надеемся, что читатель справится с этим самостоятельно.
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 367. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |