788

Использование Windows Forms и шаблонов классов

Лабораторная работа

Информатика, кибернетика и программирование

Разработать в MS Visual Studio программное решение на языке C#, которое реализует для контейнера типа линейный односвязный список оконный пользовательский интерфейс. Использовать методы визуального программирования и классы библиотеки Windows Forms.

Русский

2013-01-06

217.5 KB

62 чел.

Министерство образования и науки российской федерации

Обнинский институт атомной энергетики – филиал

Федерального государственного образовательного бюджетного образовательного учреждения
высшего профессионального образования

«национальный исследовательский ядерный университет «мифи»

(ИАТЭ НИЯУ МИФИ)

Отчет по лабораторной работе №2

«Использование Windows Forms и шаблонов классов»

Работу выполнил
студент группы ВТ-09
Стрелицын И. И.

Работу проверил
Тельнов В. П.

15:29:252012-03-15T15:24:00Z


Постановка задачи

Разработать в MS Visual Studio программное решение на языке C#, которое реализует для контейнера типа «линейный односвязный список» оконный пользовательский интерфейс. Использовать методы визуального программирования и классы библиотеки Windows Forms. Собственно контейнер реализовать на основе шаблонов классов из пространства имен System.Collections.Generic. Контейнер сделать полиморфным, чтобы он работал со следующими объектами: строки, целые числа, структуры. В программном решении следует реализовать следующие операции над контейнером:

  •  Создание и уничтожение контейнера
  •  Поиск, добавление и извлечение элементов контейнера
  •  Обход всех элементов контейнера в прямом и обратном направлениях (итератор)
  •  Удаление из контейнера дублирующих элементов
  •  Вычисление количества элементов в контейнере
  •  Сортировка элементов контейнера
  •  Объединение, пересечение и вычитание контейнеров
  •  Сохранение контейнера в дисковом файле и восстановление контейнера из файла

Описание возможностей библиотеки Windows Forms и шаблонов классов из System.Collections.Generic

Windows Forms — название интерфейса программирования приложений (API), отвечающего за графический интерфейс пользователя и являющегося частью Microsoft .NET Framework. Windows Forms упрощает доступ к визуальным компонентам (виджетам) Microsoft Windows за счет создания обертки для существующего Win32 API в управляемом коде. Управляемый код является машинно-независимым и не зависит от языка разработки. То есть программист одинаково может использовать Windows Forms как при написании ПО на C#, С++, так и на VB.Net, J# и др.

Основной класс Windows Forms – форма, экземплярами которого являются главные и диалоговые окна. Формы являются потомками класса Form, определенного в пространстве имен System.Windows.Forms. Интерфейс Windows Forms позволяет работать в режиме конструктора, добавляя элементы управления (кнопки, поля для ввода текста, поля для отображения текста, меню и прочие компоненты, характерные для Windows-приложений) простым «перетаскиванием». В коде они представлены как поля класса формы. Все элементы управления окна являются объектами классов, содержащихся в System.Windows.Forms и являющихся потомками базового класса Control. Ответная реакция программы на определенное действие (событие), связанное с элементом управления – обработчик события - оформляется в виде метода формы.

Пример 1.

Класс TextBox предоставляет элемент управления "текстовое поле" Windows. Он содержит многие члены, в том числе свойство Text, содержащее текст, и метод Clear, очищающий текстовое поле.

Пример 2.

Класс Button представляет элемент управления Windows "Кнопка". Можно задать обработчик события нажатия кнопки, например, функцию-член button1_Click, которая будет вызывать метод textBox1.Clear(). Наблюдаемый эффект – очистка текстового поля textBox1 при нажатии кнопки button1.

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

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

Пример 3.

Список из объектов класса Int можно представить коллекцией List<Int>. Для сортировки списка нужно вызвать метод Sort класса List<T>.

Схема наследования классов, использованных в работе

Описание классов, их методов и свойств, использованных в работе:

  •  System.Windows.Forms.Form

Представляет окно или диалоговое окно, которое составляет пользовательский интерфейс приложения.

Свойства:

Textзаголовок окна.

  •  System.Windows.Forms.ListBox

Представляет элемент управления Windows для отображения списка позиций. Данный элемент управления лучше всего подходит для отображения коллекций текстовых данных.

Свойства:

Enabled – указывает, может ли элемент управления отвечать на действия пользователя.

Items  - получает позиции элемента управления.

DataSource - получает или задает источник данных.

DisplayMember - получает или задает свойство отображения. В данном случае свойство Info класса CPolymorph.

Методы:

SetSelected - получает или задает свойство отображения.

  •  System.Windows.Forms.TextBox

Предоставляет элемент управления "текстовое поле" Windows. Данный элемент управления лучше всего подходит для ввода текстовой информации.

Свойства:

Text - получает или задает текущий текст в текстовом поле

Методы:

Clear – очищает текстовое поле.

  •  System.Windows.Forms.Button

Представляет элемент управления Windows "Кнопка".

Свойства:

Text – текст на кнопке.

Использовалось также событие Click.

  •  System.Windows.Forms.Label

Представляет стандартную надпись Windows.

Свойства:

Text – содержание надписи.

  •  System.Windows.Forms.OpenFileDialog

Запрашивает пользователя об открытии файла.

Свойства:

Filter – фильтры файлов, отображаемые в диалоговом окне. В данной программе отображаются только текстовые файлы.

RestoreDirectory – показывает, восстанавливает ли диалоговое окно текущую папку перед закрытием.

InitialDirectory – исходный каталог для выбора файла.

  •  System.Windows.Forms.SaveFileDialog

Запрашивает пользователя о сохранении файла.

Свойства:

Filter – фильтры файлов, отображаемые в диалоговом окне. В данной программе отображаются только текстовые файлы.

RestoreDirectory – показывает, восстанавливает ли диалоговое окно текущую папку перед закрытием.

InitialDirectory – исходный каталог для выбора файла.

  •  System.Windows.Forms.MessageBox

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

Методы:

Show - отображает окно сообщения с заданным заголовком и текстом.

  •  System.Windows.Forms.BindingSource

Инкапсулирует источник данных для формы. В данной программе объект этого класса используется для привязки listBox1 к свойству Info класса CPolymorph. Данный класс обеспечивает простоту обновления данных в элементе управления.

Свойства:

DataSource - возвращает или задает источник данных, к которому привязан соединитель.

Методы:

ResetBindingsобновляет отображаемые значения.

  •  System.Collections.Generic.List<T>

Инкапсулирует источник данных для формы. В данной программе объект этого класса используется для привязки listBox1 к свойству Info класса CPolymorph. Данный класс одинаково подходит для отображения как отсортированных, так и не отсортированных списков.

Свойства:

Count - возвращает количество элементов в списке.

Items – обеспечивает доступ к элементам списка.

Методы:

Addдобавляет элемент в список.

AddRangeдобавляет группу элементов.

FindIndexвыполняет поиск элемента, соответствующего указанному предикату, и возвращает индекс первого найденного.

RemoveAtудаляет элемент с указанным индексом.

Clearудаляет все элементы списка.

Exists – показывает, существует ли в списке элемент, соответствующий указанному предикату.

Sort – сортирует элементы в соответствии с предикатом.

Reverse – изменяет порядок следования элементов на обратный.

Эскиз окна приложения

В начале работы большая часть действий недоступна для пользователя, так как список не создан. При нажатии кнопки «Создать список» будет создан пустой список. Можно добавить в список строку из поля «Строка» (строка должна содержать только допустимые символы*), целое число из поля «Число» или структуру, состоящую из строки и числа. Новый элемент появится в списке слева (в структурах строка и число отделяются комбинацией пробел-слэш-пробел).

При нажатии кнопки «Найти» будет выделен первый элемент списка, введенный в полях для ввода. Выделенный элемент можно удалить кнопкой «Удалить элемент».

При нажатии кнопки «Открыть…» появится диалоговое окно с предложением загрузить список из текстового файла. Если в файле встречаются недопустимые строки, они будут пропущены и появится сообщение об этом.

При нажатии кнопки «Сохранить…» появится диалоговое окно с предложением сохранить список в текстовом файле.

Для завешения работы над списком пользователю нужно нажать кнопку «Удалить список».

Другие кнопки:

«Удалить повторы» - удаляются повторяющиеся элементы.

«Сортировка» - сортировка по возрастанию.

«Изменить порядок» - изменяется порядок следования элементов на противоположный.

«Объединение», «Пересечение», «Вычитание» - операции с двумя списками. Второй список открывается из файла. После удаления списка, который был результатом операции, появится начальный список, над которым производилась операция.

*Допустимыми символами являются буквы латинского алфавита и все символы кроме ‘ ‘ и ‘/’.

Описание механизма обеспечения полиморфизма контейнера

Для обеспечения полиморфизма было разработано четыре класса, один из которых является абстрактным классом-предком. Схема наследования классов:

В абстрактном классе CPolymorph определено виртуальное свойство:

public abstract String Info

       {

           get;

           set;

       }

В классах CInt, CString и CStruct происходит перекрытие виртуального свойства абстрактного класса. Свойство Info данных классов, отображает информацию из их полей в определенном формате. Объявлен класс List, потомок класса List<CPolymorph>. Такой контейнер может работать с объектами классов CInt, CString и CStruct. Таким образом, контейнер является полиморфным.

Иерархия классов разработанного приложения

Листинг кода

Файл Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace Laba_2

{

   static class Program

   {

       /// <summary>

       /// Главная точка входа для приложения.

       /// </summary>

       [STAThread]

       static void Main()

       {

           Application.EnableVisualStyles();

           Application.SetCompatibleTextRenderingDefault(false);

           Application.Run(new Form1());

       }

   }

}

Файл Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace Laba_2

{

   public partial class Form1 : Form

   {

       private BindingSource binding1; //привязка listBox к List1

       private List List1;

       private List List2;

       private CString StringItem;

       private CInt IntItem;

       private CStruct StructItem;

   

       public Form1()

       {

           InitializeComponent();

       }

       private void button1_Click(object sender, EventArgs e)

           //Создание списка

       {

           try

           {

               List1 = new List();

               binding1 = new BindingSource();

               if (List1 == null || binding1 == null)

                   throw new MyException("Не удалось создать список");

               binding1.DataSource = List1;

               listBox1.DataSource = binding1;

               listBox1.DisplayMember = "Info";

               listBox1.Enabled = true;

               textBox3.Text = List1.Count.ToString();

               button2.Enabled = true;

               button3.Enabled = true;

               button5.Enabled = true;

               button6.Enabled = true;

               button7.Enabled = true;

               button9.Enabled = true;

               button10.Enabled = true;

               button11.Enabled = true;

               button12.Enabled = true;

               button13.Enabled = true;

           }

           catch (MyException ex)

           {

               MessageBox.Show(ex.Text, "Исключение");

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message, "Исключение");

           }

       }

       private void button2_Click(object sender, EventArgs e)

           //Добавление элемента

       {

           try

           {

               if (List1.Count > List.MaxCount)

                   throw new MyException("Список переполнен");

               if (textBox1.Text == "" && textBox2.Text == "")

                   throw new MyException("Поля для ввода пусты");

               //Добавление строки

               if (textBox2.Text == "")

               {

                   StringItem = new CString();

                   StringItem.Info = textBox1.Text;

                   List1.Add(StringItem);

               }

               //Добавление числа

               if (textBox1.Text == "")

               {

                   IntItem = new CInt();

                   IntItem.Info = textBox2.Text;

                   List1.Add(IntItem);

               }

               //Добавление структуры

               if (!(textBox1.Text == "" || textBox2.Text == ""))

               {

                   StructItem = new CStruct();

                   StructItem.XInfo = Convert.ToInt32(textBox2.Text);

                   StructItem.SInfo = textBox1.Text;

                   List1.Add(StructItem);

               }

               button4.Enabled = true;

           }

           catch (MyException ex)

           {

               MessageBox.Show(ex.Text, "Исключение");

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message, "Исключение");

           }

           textBox1.Clear();

           textBox2.Clear();

           binding1.ResetBindings(false);

           textBox3.Text = List1.Count.ToString();

       }

       private void button3_Click(object sender, EventArgs e)

           //Поиск элемента

       {

           //Поиск строки

           try

           {

               if (textBox1.Text == "" && textBox2.Text == "")

                   throw new MyException("Поля для ввода пусты");

               if (textBox2.Text == "")

               {

                   listBox1.SetSelected(

                       List1.FindIndex(delegate(CPolymorph Item)

                       {

                           return Item.Info == textBox1.Text;

                       }),

                       true);

               }

               //Поиск числа

               if (textBox1.Text == "")

               {

                   listBox1.SetSelected(

                       List1.FindIndex(delegate(CPolymorph Item)

                       {

                           return Item.Info == textBox2.Text;

                       }),

                       true);

               }

               //Поиск структуры

               if (!(textBox1.Text == "" || textBox2.Text == ""))

               {

                   listBox1.SetSelected(

                       List1.FindIndex(delegate(CPolymorph Item)

                       {

                           return Item.Info == textBox1.Text + CStruct.Separator + textBox2.Text;

                       }),

                       true);

               }

           }

           catch (ArgumentOutOfRangeException)

           {

               MessageBox.Show("Элемент не найден", "Исключение");

           }

           catch (MyException ex)

           {

               MessageBox.Show(ex.Text, "Исключение");

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message, "Исключение");

           }

           textBox1.Clear();

           textBox2.Clear();

       }

       private void button4_Click(object sender, EventArgs e)

           //Удаление выделенного элемента

       {

           try

           {

               List1.RemoveAt(listBox1.SelectedIndex);

               if (List1.Count == 0) button4.Enabled = false;

               binding1.ResetBindings(false);

               textBox3.Text = List1.Count.ToString();

           }

           catch (ArgumentOutOfRangeException)

           {

               MessageBox.Show("Нет элементов", "Исключение");

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message, "Исключение");

           }

       }

       private void button5_Click(object sender, EventArgs e)

           //Удаление списка

       {

           List1.Clear();

           if (List2 != null)

           {

               List1.AddRange(List2); //если перед этим было объединение списков

               List2.Clear();

               List2 = null;

               binding1.ResetBindings(false);

               textBox3.Text = List1.Count.ToString();

           }

           else

           {

               listBox1.Enabled = false;

               textBox3.Clear();

               button2.Enabled = false;

               button3.Enabled = false;

               button4.Enabled = false;

               button5.Enabled = false;

               button6.Enabled = false;

               button7.Enabled = false;

               button9.Enabled = false;

               button10.Enabled = false;

               button11.Enabled = false;

               button12.Enabled = false;

               button13.Enabled = false;

               List1 = null;

               binding1 = null;

               listBox1.DataSource = null;

               listBox1.Items.AddRange(new object[] { "Нажмите \"Создать\" ", "или \"Открыть...\"" });

           }

       }

       private void button6_Click(object sender, EventArgs e)

           //Удаление дублирующих элементов

       {

           for (int i = 0; i < List1.Count; i++)

               for (int j = i + 1; j < List1.Count; j++)

                   if (List1[i].Info == List1[j].Info)

                   {

                       List1.RemoveAt(j);

                       --j;

                   }

           binding1.ResetBindings(false);

           textBox3.Text = List1.Count.ToString();

       }

       private void button7_Click(object sender, EventArgs e)

           //Сортировка элементов

       {

           List1.Sort(delegate(CPolymorph Item1, CPolymorph Item2)

           {

               return Item1.Info.CompareTo(Item2.Info);

           });

           binding1.ResetBindings(false);

       }

       private void button8_Click(object sender, EventArgs e)

           //Открытие списка

       {

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               try

               {

                   List1 = new List();

                   if (List1 == null) throw new MyException("Не удалось создать список");

                   Stream stream1;

                   stream1 = openFileDialog1.OpenFile();

                   Boolean IsWrongItems = false;

                   String Line;

                   using (StreamReader streamReader1 = new StreamReader(stream1))

                   {

                       while ((Line = streamReader1.ReadLine()) != null)

                       {

                           switch (FSM.Test(Line))

                           {

                               case 2:

                                   IntItem = new CInt();

                                   IntItem.Info = Line;

                                   List1.Add(IntItem);

                                   break;

                               case 3:

                                   StringItem = new CString();

                                   StringItem.Info = Line;

                                   List1.Add(StringItem);

                                   break;

                               case 7:

                                   StructItem = new CStruct();

                                   StructItem.Info = Line;

                                   List1.Add(StructItem);

                                   break;

                               default:

                                   IsWrongItems = true;

                                   break;

                           }

                       }

                   }

                   stream1.Close();

                   binding1 = new BindingSource();

                   binding1.DataSource = List1;

                   listBox1.DataSource = binding1;

                   listBox1.DisplayMember = "Info";

                   listBox1.Enabled = true;

                   button2.Enabled = true;

                   button3.Enabled = true;

                   button4.Enabled = true;

                   button5.Enabled = true;

                   button6.Enabled = true;

                   button7.Enabled = true;

                   button10.Enabled = true;

                   button11.Enabled = true;

                   button12.Enabled = true;

                   button13.Enabled = true;

                   binding1.ResetBindings(false);

                   textBox3.Text = List1.Count.ToString();

                   if (IsWrongItems)

                       MessageBox.Show("Некоторые строки исходного файла пропущены, т.к. являются недопустимыми", "Исключение");

               }

               catch (ArgumentException)

               {

                   MessageBox.Show("Не удалось открыть файл", "Исключение");

               }

               catch (MyException ex)

               {

                   MessageBox.Show(ex.Text, "Исключение");

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message, "Исключение");

               }

           }

       }

       private void button9_Click(object sender, EventArgs e)

           //Сохранение списка

       {

           if (saveFileDialog1.ShowDialog() == DialogResult.OK)

           {

               try

               {

                   Stream stream1;

                   stream1 = saveFileDialog1.OpenFile();

                   using (StreamWriter StreamWriter1 = new StreamWriter(stream1))

                   {

                       for (int i = 0; i < List1.Count; i++)

                       {

                           StreamWriter1.WriteLine(List1[i].Info);

                       }

                   }

                   stream1.Close();

               }

               catch (ArgumentException)

               {

                   MessageBox.Show("Не удалось открыть файл", "Исключение");

               }

               catch (MyException ex)

               {

                   MessageBox.Show(ex.Text, "Исключение");

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message, "Исключение");

               }

           }

       }

       private void button10_Click(object sender, EventArgs e)

           //Объединение списков

       {

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               try

               {

                   List2 = new List();

                   if (List2 == null) throw new MyException("Не удалось создать список");

                   List2.AddRange(List1); //копия исходного списка хранится в List2

                   Stream stream1;

                   stream1 = openFileDialog1.OpenFile();

                   Boolean IsWrongItems = false;

                   String Line;

                   using (StreamReader streamReader1 = new StreamReader(stream1))

                   {

                       while ((Line = streamReader1.ReadLine()) != null)

                       {

                           switch (FSM.Test(Line))

                           {

                               case 2:

                                   IntItem = new CInt();

                                   IntItem.Info = Line;

                                   List1.Add(IntItem);

                                   break;

                               case 3:

                                   StringItem = new CString();

                                   StringItem.Info = Line;

                                   List1.Add(StringItem);

                                   break;

                               case 7:

                                   StructItem = new CStruct();

                                   StructItem.Info = Line;

                                   List1.Add(StructItem);

                                   break;

                               default:

                                   IsWrongItems = true;

                                   break;

                           }

                       }

                   }

                   stream1.Close();

                   binding1.ResetBindings(false);

                   textBox3.Text = List1.Count.ToString();

                   if (IsWrongItems)

                       MessageBox.Show("Некоторые строки исходного файла пропущены, т.к. являются недопустимыми", "Исключение");

               }

               catch (ArgumentException)

               {

                   MessageBox.Show("Не удалось открыть файл", "Исключение");

               }

               catch (MyException ex)

               {

                   MessageBox.Show(ex.Text, "Исключение");

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message, "Исключение");

               }

           }

       }

       private void button11_Click(object sender, EventArgs e)

           //Пересечение списков

       {

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               try

               {

                   List2 = new List();

                   if (List2 == null) throw new MyException("Не удалось создать список");

                   List2.AddRange(List1); //копия исходного списка хранится в List2

                   List1.Clear();

                   Stream stream1;

                   stream1 = openFileDialog1.OpenFile();

                   Boolean IsWrongItems = false;

                   String Line;

                   using (StreamReader streamReader1 = new StreamReader(stream1))

                   {

                       while ((Line = streamReader1.ReadLine()) != null)

                       {

                           switch (FSM.Test(Line))

                           {

                               case 2:

                                   if (List2.Exists(delegate(CPolymorph Item)

                                   {

                                       return Item.Info == Line;

                                   }))

                                   {

                                       IntItem = new CInt();

                                       IntItem.Info = Line;

                                       List1.Add(IntItem);

                                   }

                                   break;

                               case 3:

                                   if (List2.Exists(delegate(CPolymorph Item)

                                   {

                                       return Item.Info == Line;

                                   }))

                                   {

                                       StringItem = new CString();

                                       StringItem.Info = Line;

                                       List1.Add(StringItem);

                                   }

                                   break;

                               case 7:

                                   if (List2.Exists(delegate(CPolymorph Item)

                                   {

                                       return Item.Info == Line;

                                   }))

                                   {

                                       StructItem = new CStruct();

                                       StructItem.Info = Line;

                                       List1.Add(StructItem);

                                   }

                                   break;

                               default:

                                   IsWrongItems = true;

                                   break;

                           }

                       }

                   }

                   stream1.Close();

                   binding1.ResetBindings(false);

                   textBox3.Text = List1.Count.ToString();

                   if (IsWrongItems)

                       MessageBox.Show("Некоторые строки исходного файла пропущены, т.к. являются недопустимыми", "Исключение");

               }

               catch (ArgumentException)

               {

                   MessageBox.Show("Не удалось открыть файл", "Исключение");

               }

               catch (MyException ex)

               {

                   MessageBox.Show(ex.Text, "Исключение");

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message, "Исключение");

               }

           }

       }

       private void button12_Click(object sender, EventArgs e)

           //Вычитание из списка List1

       {

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               try

               {

                   List2 = new List();

                   if (List2 == null) throw new MyException("Не удалось создать список");

                   List2.AddRange(List1); //копия исходного списка хранится в List2

                   Stream stream1;

                   stream1 = openFileDialog1.OpenFile();

                   String Line;

                   using (StreamReader streamReader1 = new StreamReader(stream1))

                   {

                       while ((Line = streamReader1.ReadLine()) != null)

                       {

                           List1.RemoveAll(delegate(CPolymorph Item)

                           {

                               return Item.Info == Line;

                           });

                       }

                   }

                   stream1.Close();

                   binding1.ResetBindings(false);

                   textBox3.Text = List1.Count.ToString();

               }

               catch (ArgumentException)

               {

                   MessageBox.Show("Не удалось открыть файл", "Исключение");

               }

               catch (MyException ex)

               {

                   MessageBox.Show(ex.Text, "Исключение");

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message, "Исключение");

               }

           }

       }

       private void button13_Click(object sender, EventArgs e)

           //Изменить порядок на противоположный

       {

           List1.Reverse();

           binding1.ResetBindings(false);

       }

   }

}

Файл FSM.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   

   class FSM

       //конечный автомат

   {

       //сигнальные состояния:

       public const int IntState = 2;

       public const int StringState = 3;

       public const int StructState = 7;

       private enum States { q0 = 0, q1, q2, q3, q4, q5, q6, q7 };

       static public int Test(String Line)

           //2 - Line является числом

           //3 - Line является строкой

           //7 - Line является структурой

           //0 - недопустимое слово

       {

           States State = States.q1;

           for (int i = 0; i < Line.Length; i++)

           {

               switch (State)

               {

                   case States.q0:

                       return (int)State;

                   case States.q1:

                       State = (Char.IsDigit(Line, i)) ? States.q2 : States.q0;

                       if (SymLettPunct(Line[i])) State = States.q3;

                       break;

                   case States.q2:

                       State = (Char.IsDigit(Line, i)) ? States.q2 : States.q0;

                       break;

                   case States.q3:

                       State = (SymLettPunct(Line[i])) ? States.q3 : States.q0;

                       if (Line[i] == ' ') State = States.q4;

                       break;

                   case States.q4:

                       State = (Line[i] == '/') ? States.q5 : States.q0;

                       break;

                   case States.q5:

                       State = (Line[i] == ' ') ? States.q6 : States.q0;

                       break;

                   case States.q6:

                       State = (Char.IsDigit(Line, i)) ? States.q7 : States.q0;

                       break;

                   case States.q7:

                       State = (Char.IsDigit(Line, i)) ? States.q7 : States.q0;

                       break;

                   default:

                       break;

               }

           }

           return (int)State;

       }

       static private bool SymLettPunct(char c)

       {

           return

               (((c > 'A' && c < 'Z')

                 || (c > 'a' && c < 'z')

                 || Char.IsSymbol(c)

                 || Char.IsPunctuation(c)

                 || c == '_')

                 && c != '/'

                 && c != ' ');

       }

   }

}

Файл Exeptions.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   class MyException : Exception

   {

       private string text;

       public string Text

       {

           get

           {

               return text;

           }

       }

       public MyException(string Text)

       {

           this.text = Text;

       }

   }

}

Файл CString.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   class CString : CPolymorph

   {

       const int N = 20; //максимальная длина строки

       private string S;

       public override string Info

       {

           get

           {

               return S;

           }

           set

           {

               if (value.Length > N) throw new MyException("Слишком длинная строка");

               S = value;

           }

       }

   }

}

Файл CInt.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   class CInt : CPolymorph

   {

       private int X;

       public int XInfo

       {

           get

           {

               return X;

           }

           set

           {

               try

               {

                   X = value;

               }

               catch (OverflowException)

               {

                   throw new MyException("Слишком большое число");

               }

           }

       }

       public override string Info

       {

           get

           {

               return X.ToString();

           }

           set

           {

               try

               {

                   if (FSM.Test(value) != FSM.IntState)

                       throw new MyException("\"" + value + "\" не является числом");

                   X = Convert.ToInt32(value);

               }

               catch (OverflowException)

               {

                   throw new MyException("Слишком большое число");

               }

           }

       }

   }

}

Файл CStruct.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   class CStruct : CPolymorph

   {

       private int X;

       private string S;

       public const String Separator = " / ";

       public int XInfo

       {

           get

           {

               return X;

           }

           set

           {

               try

               {

                   X = value;

               }

               catch (OverflowException)

               {

                   throw new MyException("Слишком большое число");

               }

           }

       }

       public string SInfo

       {

           get

           {

               return S;

           }

           set

           {

               if (value.Length > 20)

                   throw new MyException("Слишком длинная строка");

               S = value;

           }

       }

       public override string Info

       {

           get

           {

               return (S + Separator + X.ToString());

           }

           set

           {

               if (FSM.Test(value) != FSM.StructState)

                   throw new MyException("\"" + value + "\" не является структурой");

               if ((S = value.Split(new String[] { Separator }, StringSplitOptions.RemoveEmptyEntries)[0]).Length > 20)

                   throw new MyException("Слишком длинная строка");

               X = Convert.ToInt32(value.Split(new String[] { Separator }, StringSplitOptions.RemoveEmptyEntries)[1]);

           }

       }

   }

}

Файл CPolymorph.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Laba_2

{

   abstract class CPolymorph

   {

       public abstract String Info

       {

           get;

           set;

       }

   }

}


CPolymorph

String

CInt

CStruct


 

А также другие работы, которые могут Вас заинтересовать

49655. ЧЕЛОВЕК КАК ЛИЧНОСТЬ 173 KB
  Проблема личности есть основная проблема экзистенциальной философии. Я говорю «я» раньше, чем сознал себя личностью. «Я» первично и недифференцированно, оно не предполагает учения о личности. «Я» есть изначальная данность, личность же есть заданность. Я должен реализовать в себе личность, и эта реализация есть неустанная борьба
49656. В.А.Ющенко як менеджер 124.5 KB
  Проект майбутнього України В. Зміни в організаційних повноваженнях і Соціальний договір як крок до формування стратегії для України. Ющенка як керівникастратега та перспективи України за його переконаннями і внутрішніми принципами.
49658. Діяльність Факультету соціології і права з позиції концепції життєвих циклів 222.58 KB
  Концепція життєвих циклів організації теоретичний аспект Основні положення концепції життєвих циклів організації її етапи та характерні ознаки. Моделі ЖЦ організації та їх порівняльний аналіз Аналіз діяльності ФСП НТУУ КПІ з позицій концепції ЖЦ організації
49659. Аналіз діяльності ФСП НТУУ КПІ з позиції концепції управління за цілями 275.5 KB
  Концепція управління за цілями (MBO – management by objectives) є однією з найбільш широко розповсюджених у реальному застосуванні способів встановлення цілей та оцінки діяльності керівників. В рамках теорії управління за цілями, діяльність по формуванню і встановленню системи цілей і роботи з ними розглядається як головна задача менеджера
49660. РОЗРОБКА АВТОМАТИЧНОГО ПРИСТРОЮ 1.24 MB
  Для розрахунку автоколивального мультивібратора нам необхідні такі значення (для серії К155), які можна знайти в методичних вказівках по компютерній електроніці (Компютерна електроніка - методичні вказівки, контрольні завдання та завдання на курсову роботу для студентів заочного факультету спеціальності7.091501 - Компютерні системи та мережі)...
49661. Определение общей площади территории городского поселения 280 KB
  Человек не расчлененный магистральными улицами и дорогами обеспеченный основными видами учреждений с и предприятий повседневного культурно-бытового обслуживания населения с радиусом не более 500 м; границами микрорайона являются магистральные или жилые улицы проезды пешеходные пути; жилой район – структурный элемент селитебной территории площадью от 80 до 250 га в пределах которого размещаются учреждения и предприятия с радиусом обслуживания не более 1500 м а так же часть объектов городского значения; границами жилого района являются...
49662. Основы метрологии 3.47 MB
  В подвижных соединениях применяют только посадки с зазором в неподвижных – все три типа посадок. В ЕСДП рекомендуются к применению посадки образованные либо в системе отверстия либо в системе вала. Аналогично образуются посадки в системе вала. Любая посадка определяется следующими числовыми характеристиками: наибольшими и наименьшими предельными величинами зазоров Smx Smin или натягов Nmx Nmin средним зазором Sm или натягом Nm допуском посадки TS или TN доверительным допуском посадки TSP или TNP с доверительной вероятностью...