2.  Создать отдельные классы для решения прикладных задач, предусмотрев в их методах (в том числе и в конструкторах) формальные параметры и возвращаемые значения для взаимодействия с интерфейсом. Чтение (запись) данных из интерфейса (в интерфейс) и их передача в методы обеспечивается средствами Visual Studio.

3.  Передать в классы прикладных задач указатели на формы (или на компоненты на форме); чтение (запись) данных из форм осуществляется методами классов.

4.  В методах классов прикладной задачи предусмотреть открытие форм для ввода/вывода.

5.1. Дополнение класса формы средствами решения прикладной задачи

Пусть задана задача: какое количество элементов одномерного массива меньше его среднего арифметического. В классе Form1 имеются объявление данных, а также функции для решения задачи. Вызов функций выполняется при нажатии на командные кнопки. Форма для этой задачи представлена на рис. 5.1.

Класс Form1:

namespace Exampl_51

{

public partial class Form1 : Form

{

double[] x; // данные для задачи

int kol;

double SrAr;

public Form1()

{

InitializeComponent();

}

Рис. 5.1

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 = "";

} } }

Первоначально кнопки «Среднее арифметическое» и «Количество» заблокированы, потому что до ввода исходных данных на них нажать нельзя. Щелчок мышью на строке ввода исходных данных переводит программу в исходное состояние.

5.2. Создание отдельных классов

Поступим следующим образом. Объявим несколько классов и используем их методы при нажатии командных кнопок на форме. В принципе, можно использовать сколь угодно сложные структуры данных в классах, но мы не будем тратить на это время, потому что вопросы передачи структурированных данных в качестве формальных/фактических параметров функций были подробно рассмотрены выше.

Создавать классы можно двумя способами:

-  написать классы самому «с нуля»; не забудьте, что класс формы должен быть впереди собственных классов;

-  поставить курсор мыши на имя проекта, нажать на правую клавишу, выбрать из выпадающего меню пункт «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 " + m_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;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14