788

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

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

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

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

Русский

2013-01-06

217.5 KB

61 чел.

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

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

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

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

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

Отчет по лабораторной работе №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


 

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

8173. Козацькі Літописи 18.81 KB
  Козацькі Літописи Історії Запорозької Січі присвячено численні розвідки - від суто популяризаторських до капітальних праць. Різними дослідниками це явище висвітлюється по-різному: і як цілісний процес, і як окремі його складові чи персонали. Пр...
8174. Вплив української культури на розвиток культурних процесів Росії 18.05 KB
  Вплив української культури на розвиток культурних процесів Росії У козацьку добу Україна посідала чільне місце серед держав Східної Європи. Чигирин став центром, куди приїздили для політичних і ділових контактів посли Молдавії, Швеції, Валахії, Поль...
8175. Українське бароко 15.85 KB
  Українське бароко У другій половині XVII ст. в Україні поширюється стиль бароко, що став цілісною художньою системою, під впливом якої розвивалися всі види і жанри мистецтва. У його рамках розвивались ідейно-стильові тенденції: офіційне аристократич...
8176. Григорій Сковорода - просвітитель, філософ, поет 15.27 KB
  Григорій Сковорода - просвітитель, філософ, поет Григорій Сковорода (1722-1794) - самобутній український мислитель. Син козака з Лівобережжя, він здобув освіту в Києво-Могилянській академії, працював викладачем у Переяславському та Харківському коле...
8177. Початки українського театрального мистецтва 15.3 KB
  Початки українського театрального мистецтва Витоки театрального мистецтва України сягають княжої доби, коли мандрівні актори-скоморохи розважали народ своїми дійствами - танцями, піснями, завжди доречними та актуальними. У середині XVIст....
8178. Нові тенденції розвитку образотворчого мистецтва другої половини XVI-XVIII ст. 16.71 KB
  Цей період характеризувався посиленням звязків із західною культурою, широким використанням античної та європейської спадщини. У живописі, графіці, скульптурі спостерігається перехід від середньовічних канонів до реалістичних форм з виразними демократичними елементами...
8179. Культурно-мистецький процес України у XVIII ст 22.93 KB
  Культурно-мистецький процес України у XVIIIст. Починаючи з XVIII ст. в українську літературу входять нові напрямки. На противагу дидактичній і теологічній літературі починає формуватися світська, в якій збільшується жанрова різноманітність: са...
8180. Педагогика: предмет, категории, структура 88.54 KB
  Педагогика: предмет, категории, структура Вступление: структура курса, учебные требования ПЛАН Педагогика как наука и искусство. Основные категории педагогической науки. Связь педагогики с другими науками. Система педагогических наук ЛИТЕРАТУРА Подл...
8181. Проблема целей воспитания в педагогике 17.26 KB
  Проблема целей воспитания в педагогике. Историческая динамика целей воспитания. Человеческое общество в своей практической воспитательной деятельности всегда преследует определенные цели - даже если они не осознаются на уровне общественного соз...