Студопедия

КАТЕГОРИИ:

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

Объектно-ориентированное программирование в 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:

  1. До создания класса невозможны ввод данных и вычисления, поэтому кнопка вычислений заблокирована.
  2. Предусмотрена возможность создания лишь одного объекта типа Class1. Поэтому после его создания кнопка создания класса заблокируется.
  3. Возможны многократный ввод исходных данных и вычисления.

Разумеется, можно создать сколько угодно форм пользовательского интерфейса и передать их указатели в классы пользователя. Надеемся, что читатель справится с этим самостоятельно.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 323.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...