Министерство образования и науки Российской Федерации
Новосибирский государственный технический университет
Кафедра вычислительной техники

Расчётно-графическая работа
по дисциплине «Программирование»
Тема: «Коллекция объектов произвольных типов в памяти»
Факультет: АВТ
Группа: АВТ-909
Выполнил:
Проверил:
Новосибирск, 2011
I. Задание и комментарии разработчика к реализации
Общая формулировка задачи
Курсовая работа должна быть выполнена с использованием технологии объектно-ориентированного программирования (классы, наследование, виртуальные функции, шаблоны) и реализована в виде набора классов. Программа демонстрирует выполнение всех своих функций в любой последовательности через систему меню. Пояснительная записка должна иметь объем не менее 20 стр. текста (без приложения, шрифт 12), выполнена в соответствии с ГОСТом и содержать следующие разделы.
Необходимо разработать интерфейс для объединения в структуру данных множества объектов различных классов - абстрактный базовый класс объектов newObject, для которого предусмотреть виртуальные методы: загрузки объекта из текстовой строки, выгрузки объекта в текстовую строку в динамической памяти, добавления объекта в последовательный двоичный файл, чтения объекта из последовательного двоичного файла, возврата уникального идентификатора класса, возврата указателя на строку с именем класса, сравнения двух объектов, “сложения “(объединения) двух объектов, создание динамической копии объекта. Сделать классы хранимых объектов производными от абстрактного базового класса newObject (например, класс newFloat, newString и класс из лабораторной работы).
Коллекция представляет собой структуру данных, хранящую указатели на объекты произвольного типа - объекты базового класса. Программа должна обеспечивать просмотр коллекции, добавление объекта выбранного типа, редактирование и удаление объекта, сложение и сравнение объектов при условии совпадения типов с помещением результата в ту же коллекцию, сохранение и загрузку объектов из текстового (или двоичного) файла.
Программа должна реализовывать указанные выше действия. Протестировать структуру данных на простом типе (например, Int или String). Программа тестирования должна содержать меню, обеспечивающее выбор операций.
Выбранная тема
Программа должна реализовывать указанные выше действия. Протестировать структуру данных на простом типе (например, Int или String). Программа тестирования должна содержать меню, обеспечивающее выбор операций.
Структура данных данных для организации коллекции:
Список с организацией очереди.
II. Структурное описание разработки
В программе используются классы:
Абстрактный класс object, где определены общие для классов поля и методы, от него наследуются классы newString, newFloa и Polinom, в которых реализованы все «частности» для классов
UML диаграмма:
Схема структуры данных в программе
Организация очереди, а также основных операций с ней:

Очередь организована через циклический список, основные операции с очередью выполняют функции Add() – добавление объекта и RemoveAt() – удаление объекта.
Также имеются свойства Count и индексатор для удобства использования, а также произвольного доступа к объектам.


Функция считывания объектов из файла.
Осуществляется с помощью сериализации объектов в файл.
Из-за особенности реализации хранения данных все операции осуществляются с статическим классом Collection

Но т. к. сериализовать статические классы нельзя, я использовал паттерн «одиночка» - его суть сводится к «обёртыванию» класса( в моём случае статического) в обычный каласс.
Реализуется это посредствам следующего принципа: «конструктор класса всегда возврящает один и тот же объект» - мы проверяем был ли создан хотя бы один объект, если нет, то создаём его и записываем его адрес в статическое поле. Впоследствии, при доступе к классу мы возврящаем только этот объект.

Здесь представлена чатьс кода, реализующая данный паттерн:
[NonSerialized]
static forSerializationCollection myInstance = null;
forSerializationCollection()
{
forUpdate = Collection. forUpdate;
arrList = Collection. arrList;
classIdList = Collection. classIdList;
classNamesList = Collection. classNamesList;
}
public static forSerializationCollection MyInstance
{
get
{
if (myInstance == null)
{
myInstance = new forSerializationCollection();
}
return myInstance;
}
private set
{
myInstance = value;
Collection. forUpdate = value. forUpdate;
Collection. arrList = value. arrList;
Collection. classIdList = value. classIdList;
Collection. classNamesList = value. classNamesList;
Form1.UpdateList();
}
}
Функция считывания объектов из бинарного файла.
Происходит с помощью вспомогательного класса-«обёртки», описанного выше и десериализации.
Функция добавления объекта в очередь.
При добавлении объекта в очередь происходит следующее:
1) Меняется указатель head – на текущий добавляемы элемент.
2) Меняется указатели prev и next для объекта в зависимости от состояния очереди.
3) Устанавливается указатель end на текущий объект в случае, если текущий элемент первый или второй в очереди, в остальных случаях функция добавления не изменяет указатель end.
Функция удаления объекта из очереди.
С помощью индексатора находим нужный нам элемент, создаём две временных переменных, которые хранят следующий и предыдущий относительно удаляемого элемента.
Меняем их ссылки на нужные и сборщик мусора сам удаляет ненужный нам объект потому что на него в программе не остаётся ссылок.
Реализация доступа к коллекции объектов.
Посредствам статического класса Collection реализован удобный доступ «из любой точки программы» без передачи дополнительных ссылок на родительские объекты и прочее.

В нём хранятся все коллекции объектов, используемых в программе. Для реализации хранения объектов используется собственный класс List, а для реализации синхронизации его с формами используется ArrayList. Т. е. после каждой операции мы синхронизируем содержание собственного списка с ArrayList, а затем ArrayList с элементами форм.
«Собственный список».
Собственный список реализован посредствам объявления в абстрактном классе ссылок next и prev, а также создания отдельного класса List с полями count, head и end.

Подробное описание организации списка в разделе «функциональное описание».
Синхронизация с формами.
Для удобства синхронизации с формами был создан вспомогательный статический класс ListVisualisation:

Т. к. в формах содержится несколько «интенсивно изменяющихся» элементов, то для оптимизации кода был создан новый класс со следующими методами:
addElement – добавление элемента в listView(точнее сразу 3 добавления элементов в разные списки и их синхронизация с собственной структурой данных).
deleteElement – синхронное удаление со всех источников с последующим обновлением элементов формы.
updateListView – обновление элементов формы, используется как в предыдущих методах, так и в коде форм.
Формы, используемые в программе.
Основная форма программы – Form1, в ней реализовано меню, список(олицетворение нашей коллекции объектов), список операций с объектами, а так же всё для их инициализации.


Посредствам формы Form2 реализовано олицетворение информации «Об авторе»


Для добавления нового полинома в коллецию также была реализована удобная форма с контролем введёных данных.


Для вывода вопроса о сохранении или выводе результата операции была использована форма sumForm:


Диаграмма вариантов использования

Диаграмма вариантов использования программы.
Действия пользователя | Реакция системы |
Запустить программу | Запуск программы, отображение визуальных элементов, готовность программы к дальнейшему диалогу с пользователем. |
Добавить элемент Float | В коллекцию, отображаемую в качестве списка на экране добавляется элемент Float, также добавляются дополнительные сведенья об этом элементе в смежные колонки. |
Добавить элемент String | В коллекцию, отображаемую в качестве списка на экране добавляется элемент String, также добавляются дополнительные сведенья об этом элементе в смежные колонки. |
Добавить элемент Polinom | В коллекцию, отображаемую в качестве списка на экране добавляется элемент Polinom, также добавляются дополнительные сведенья об этом элементе в смежные колонки. Для формирования объекта Polinom используется дополнительное окно с полями для ввода множителей при степени полинома. Все активные поля обязательны для заполнения. |
Сравнение элементов из меню Float | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы Float ), то отображается диалоговое окно с результатом операции сравнения первого выделенного элемента со вторым( если первый больше второго выводится «true», в противном случае выводится «false» ). |
Сравнение элементов из меню String | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы String ), то отображается диалоговое окно с результатом операции сравнения первого выделенного элемента со вторым( если первый больше второго выводится «true», в противном случае выводится «false» ). |
Сравнение элементов из меню Polinom | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы Polinom ), то отображается диалоговое окно с результатом операции сравнения первого выделенного элемента со вторым( если первый больше второго выводится «true», в противном случае выводится «false» ). |
Суммировать элементы из меню Float | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы Float ), то отображается диалоговое окно с вопросом о дальнейших действий с результатом операции сложения элементов – можно либо сохранить объект-результат в коллекции или просто увидеть результат в новом диалоговом окне. |
Суммировать элементы из меню String | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы String ), то отображается диалоговое окно с вопросом о дальнейших действий с результатом операции сложения элементов – можно либо сохранить объект-результат в коллекции или просто увидеть результат в новом диалоговом окне. |
Суммировать элементы из меню Polinom | Если элементы выбраны корректно( первые 2 выбранных элемента – элементы Polinom ), то отображается диалоговое окно с вопросом о дальнейших действий с результатом операции сложения элементов – можно либо сохранить объект-результат в коллекции или просто увидеть результат в новом диалоговом окне. |
Удаление выделенных элементов из меню Float | Удаление из коллекции всех выделенных элементов. |
Удаление выделенных элементов из меню String | Удаление из коллекции всех выделенных элементов. |
Удаление выделенных элементов из меню Polinom | Удаление из коллекции всех выделенных элементов. |
Команда «решить» из меню Polinom | Для того чтобы «решить» полином необходимо ввести в смежное поле значение «х» полинома, после нажатия на кнопку будет выведен результат операции в новом диалоговом окне. |
Вызов «Справка»->«О программе…» | Выводятся сведения об авторе программы. |
Сохранение коллекции в файл | Сначала выводится диалоговое окно выбора файла, или же создания нового файла. Необходимо выбрать путь к файлу а также ввести его имя. Формат файла произвольный. |
Загрузка коллекции из файла | Сначала выводится диалоговое окно выбора файла. Необходимо выбрать путь к ранее сохранённому файлу. Формат файла произвольный. В результате операции будет обновлён список объектов – объекты, которые ранее присутствовали на форме удалятся, загрузятся новые объекты из файла. |
Вызов «Файл»->«Выход» | Закрытие приложения. |
Диаграмма действий UML(добавление нового полинома)

III. Функциональное описание
List. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Collections;
namespace coursework
{
public class List
{
newObject head; // указатель на первый элемент списка
newObject end; // указатель на последний элемент списка
int count = 0; // количество элементов
public List() // начальная иницилизация списка
{
head = null;
end = null;
}
public int Count // свойство, возвращающее число элементов в коллекции
{
get
{
return count;
}
}
public void Add(newObject o) // добавление объекта в спискок
{
count++; // сразу изменяем число элеметов
// если список был абсолютно пустой, то наш перый элемент также является и последним
// а т. к. список циклический то и указатели следующий и предидущий
// указывают на него же
if (head == null)
{
head = o;
end = o;
head. next = o;
head. prev = o;
}
// если список уже содержит в себе 1 элемент, то мы замыкаем ссылки prev и next на
// новом элементе, меняем end и меняем prev и next нового элемента
else if( count == 1 )
{
head. next = o;
head. prev = o;
end = o;
end. prev = head;
end. next = head;
}
// усли же элементов в списке несколько то сначала меняем ссылку next последнего
// элемента, а потом меняем ссылки на новый элемент и ссылки самого элемента
else if (count>1)
{
end. next = o;
head. prev = o;
o. prev = end;
o. next = head;
end = o;
}
}
public newObject this[int index]
{
// индексатор может получть объект по номеру из списка
get
{
newObject temp = head;
for (int i = 0; i < index; i++)
{
temp = temp. next;
}
return temp;
}
set
{
}
}
// удаление элемента
public void RemoveAt(int index)
{
count--; // сразу уменьшаем кол-во объектов в списке
// если список пустой, то фактически ничего не делаем
if (head == end && index == 0)
{
head = null;
end = null;
}
// если в списке только 2 элемента, а удаляемый первый
else if (head. next == end && index == 0)
{
head = end;
end. next = head;
end. prev = head;
}
// если в списке только 2 элемента, а удаляемый второй
else if (head. next == end && index == 1)
{
end = head;
head. next = head;
head. prev = head;
}
// если в списке много элементов
else if (head. next!= end && head!= null)
{
// создаём временные переменные - указатели
// на следущий и предидущий элеметы относитьельно удаляемого
newObject tempNext = this[index].next;
newObject tempPrev = this[index].prev;
// если удаляем первый элемент
if (this[index] == head)
{
head = this[index].next;
head. prev = tempPrev;
tempPrev. next = head;
}
// если удаляем последний элемент списка
if (this[index] == end)
{
end = this[index].prev;
end. next = tempNext;
tempNext. prev = end;
}
// если удаляем элемент и он не первый и не последний
if (this[index] != end && this[index] != head)
{
tempNext. prev = tempPrev;
tempPrev. next = tempNext;
}
}
}
}
}
listVisualisation. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace coursework
{
// статический класс, отвечающий за добавление элементов в список,
// удаление из него и оновления listView формы
public static class listVisualisation
{
// добавление элемента - добавляем элемент в
// собственный список и другие коллекции для удобства визуализации
// далее вызываем updateListView, где и происходит синхронизация
// собственного списка со списком для визуализации
public static void addElement(newObject o, Form1 form)
{
Collection. myarrList. Add(o);
Collection. arrList. Add(o);
Collection. classIdList. Add(o. ClassID);
Collection. classNamesList. Add(o. ClassName);
listVisualisation. updateListView(form);
}
// удаление элемента из всех списков,
// после удаления производится обновление списков
// происходит это посредствам вызова метода из другого места
// для того чтобы не изменять индексы удаляемых элементов во время работы метода
public static void deleteElement(int index, Form1 form)
{
Collection. myarrList. RemoveAt(index);
Collection. arrList. RemoveAt(index);
Collection. classIdList. RemoveAt(index);
Collection. classNamesList. RemoveAt(index);
}
// обновление списков, синхронизация List с ArrayList
public static void updateListView(Form1 form)
{
Collection. arrList. RemoveRange(0, Collection. arrList. Count);
for (int i = 0; i < Collection. myarrList. Count; i++)
Collection. arrList. Add(
Collection. myarrList[i]);
form. listBox1.DataSource = Collection. forUpdate;
form. listBox1.DataSource = Collection. arrList;
form. listBox2.DataSource = Collection. forUpdate;
form. listBox2.DataSource = Collection. classIdList;
form. listBox3.DataSource = Collection. forUpdate;
form. listBox3.DataSource = Collection. classNamesList;
}
}
}
newCollection. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Collections;
using System. IO;
using *****ntime. Serialization. Formatters. Binary;
namespace coursework
{
// класс, созданный для удобства сериализации
[Serializable]
public sealed class forSerializationCollection
{
// для реализации паттерна "Одиночка"
[NonSerialized]
static forSerializationCollection myInstance = null;
public ArrayList forUpdate;
public ArrayList arrList;
public ArrayList classIdList;
public ArrayList classNamesList;
// конструктор берёт ссылки со статического класса
forSerializationCollection()
{
forUpdate = Collection. forUpdate;
arrList = Collection. arrList;
classIdList = Collection. classIdList;
classNamesList = Collection. classNamesList;
}
// для организации доступа мы создаём дополнительную
// переменную класса forSerializationCollection - myInstance
public static forSerializationCollection MyInstance
{
get
{
// если еще не создано ни одного объекта класа, то создаём один элемент
// если уже был создан элемет, возвращаем ссылку на него
if (myInstance == null)
{
myInstance = new forSerializationCollection();
}
return myInstance;
}
private set
{
// присвоение
myInstance = value;
Collection. forUpdate = value. forUpdate;
Collection. arrList = value. arrList;
Collection. classIdList = value. classIdList;
Collection. classNamesList = value. classNamesList;
Form1.UpdateList();
}
}
// сериализация коллекций
public void SaveCollection(String path)
{
FileStream fs = new FileStream(path, FileMode. Create, FileAccess. Write);
BinaryFormatter bf = new BinaryFormatter();
bf. Serialize(fs, this);
fs. Close();
}
// десериализация коллекций
public void LoadCollection(String path)
{
FileStream fs = new FileStream(path, FileMode. Open, FileAccess. Read);
BinaryFormatter bf = new BinaryFormatter();
forSerializationCollection. MyInstance =
(forSerializationCollection)bf. Deserialize(fs);
}
};
// статический класс, созданный для удобного доступа к элементам
// "из любой точки программы"
public static class Collection
{
public static List myforUpdate = new List();
public static List myarrList = new List();
public static List myclassIdList = new List();
public static List myclassNamesList = new List();
public static ArrayList forUpdate = new ArrayList();
public static ArrayList arrList = new ArrayList();
public static ArrayList classIdList = new ArrayList();
public static ArrayList classNamesList = new ArrayList();
}
}
newObject. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace coursework
{
// астрактный класс, от него наследуются классы:
// newFloat
// newString
// Polinom
//
// в классе определены методы общие для всех дочерних классов, а также
// нектороые поля, общие для дочерних классов, а также свойства для доступа к этим полям
[Serializable]
public abstract class newObject
{
// ссылки для реализации List
public newObject next;
public newObject prev;
// ID - уникальный идентификатор класса, для определения типа калсса в коллекции
private int classID;
public int ClassID
{
get
{
return classID;
}
set
{
this. classID = value;
}
}
// className - имя класса, для определения типа калсса в коллекции
private String className;
public String ClassName
{
get
{
return className;
}
set
{
this. className = value;
}
}
// метод суммирования классов
public abstract object SumWith(object o);
// переопределённый метод, возвращащий String представление класса
public abstract override string ToString();
// сравнение объектов
public abstract bool MoreThan( object o );
}
}
newFloat. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace coursework
{
// класс, наследуемый от newObject, сериализуемый
// храниет в себе поле Flat и реализацию определённых методов
// класса newObject
[Serializable]
class newFloat : newObject
{
// Flaot переменная
public float classValue;
// в конструкторе присваиваем переменной значение,
// а также задаём ClassID и ClassName
public newFloat(float temp)
{
classValue = temp;
ClassID = 1;
ClassName = "Float";
}
// переопределенный метод toString
public override string ToString()
{
return classValue. ToString();
}
// реализация суммирования для newFloat
public override object SumWith(object o)
{
newFloat temp = new newFloat(
this. classValue + ((newFloat)o).classValue
);
return (object)temp;
}
// сравнение элементов
public override bool MoreThan(object o)
{
return this. classValue > ((newFloat)o).classValue;
}
}
}
newString. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace coursework
{
// класс, наследуемый от newObject, сериализуемый
// храниет в себе поле String и реализацию определённых в
// классе newObject
[Serializable]
class newString : newObject
{
// поле String
public String str;
// конструктор присваивает
public newString(String temp)
{
this. str = (String)temp. Clone();
this. ClassID = 2;
this. ClassName = "String";
}
// переопределенный метод toString
public override string ToString()
{
return (String)this. str. Clone();
}
// медод суммирования объектов
public override object SumWith(object o)
{
newString temp = new newString(
this. str + ((newString)o).str
);
return (object)temp;
}
// сравнение объектов
public override bool MoreThan(object o)
{
if (this. pareTo(((newString)o).str) > 0)
return true;
else return false;
}
}
}
Polinom. cs
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace coursework
{
// класс, наследуемый от newObject, сериализуемый
// храниет в себе релизацию полиноми и реализацию определённых методов
// класса newObject, сериализуемый
[Serializable]
class Polinom : newObject
{
// массив для храниения множителей при степени полинома
// фактически хранится пара множитель-стпень полинома(индекс)
private int[] mas;
// конструкотор по умолчанию
public Polinom()
{
this. ClassID = 3;
this. ClassName = "Polinom";
mas = new int[10];
Array. Clear(mas,0,mas. Length);
}
// инициализация полинома массивом
public Polinom(int[] aMas)
{
this. ClassID = 3;
this. ClassName = "Polinom";
mas = new int[aMas. Length];
for(int i = 0; i<aMas. Length; i++)
{
mas[i] = aMas[i];
}
}
// инициализация полинома random-значениями
// макс степень при полиноме - length-1
public Polinom(int length)
{
this. ClassID = 3;
this. ClassName = "Polinom";
Random rand = new Random();
mas = new int[length];
for (int i = 0; i < length; i++)
{
mas[i] = rand. Next(30);
}
}
// копирование объекта
public object Clone()
{
Polinom temp = new Polinom();
temp. mas = new int[this. mas. Length];
for (int i = 0; i < this. mas. Length; i++)
{
temp. mas[i] = this. mas[i];
}
return (object)temp;
}
// сравнение полиномоа
// для оптимизации вычислений сначала сравниваем длинну полинома
// и только если она равна "исследуюем" низшие порядки полинома
public override bool MoreThan(object bTemp)
{
Polinom b = (Polinom)bTemp;
if (this. mas. Length > b. mas. Length)
return true;
if (this. mas. Length < b. mas. Length)
return false;
if (this. mas. Length == b. mas. Length)
{
for (int i = this. mas. Length-1; i >= 0; i--)
{
if (this. mas[i] > b. mas[i])
return true;
if (this. mas[i] < b. mas[i])
return false;
if (this. mas[i] == b. mas[i])
{
if (i == 0) return false;
}
}
}
return false; // для того чтобы метод работал - не должно никогда возвращаться
}
// суммирование полиномов
public override object SumWith(object o)
{
unchecked
{
Polinom b = (Polinom)o;
Polinom temp = new Polinom();
if (this. mas. Length > b. mas. Length)
temp. mas = new int[this. mas. Length];
if (this. mas. Length < b. mas. Length)
temp. mas = new int[b. mas. Length];
if (this. mas. Length == b. mas. Length)
temp. mas = new int[this. mas. Length];
Array. Clear(temp. mas, 0, temp. mas. Length);
for (int i = 0; i < this. mas. Length; i++)
temp. mas[i] = this. mas[i];
for (int i = 0; i < b. mas. Length; i++)
temp. mas[i] += b. mas[i];
return temp. Clone();
}
}
// "решить" полином
public long Result(int x)
{
long sum = 0;
for (int i = 0; i < this. mas. Length; i++)
{
sum += mas[i] * (long)Math. Pow(x, i);
}
return sum;
}
// представления полинома строкой
public override String ToString()
{
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < this. mas. Length; i++)
{
sb. Append(mas[i].ToString() + "*x^" + (i).ToString());
if (i!= this. mas. Length - 1) sb. Append(" + ");
}
return sb. ToString();
}
}
}
IV. Листинги
Form1.cs
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace coursework
{
public partial class Form1 : Form
{
static Form1 myInstance = null;
public Form1()
{
InitializeComponent();
myInstance = this;
}
public static Form1 FOrm1
{
get { return myInstance; }
}
public static void UpdateList()
{
listVisualisation. updateListView(Form1.FOrm1);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
if (sfd. ShowDialog() == System. Windows. Forms. DialogResult. OK)
{
forSerializationCollection fsc = forSerializationCollection. MyInstance;
fsc. SaveCollection(sfd. FileName);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text!= "")
{
newFloat temp = new newFloat(float. Parse(textBox1.Text));
listVisualisation. addElement(temp, this);
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void button7_Click(object sender, EventArgs e)
{
if (
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 2 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 2
)
{
MessageBox. Show("Первый элемент больше второго: " +
((newString)Collection. arrList[listBox1.SelectedIndices[0]])
.MoreThan(
((newString)Collection. arrList[listBox1.SelectedIndices[1]])
)
.ToString()
);
}
}
private void button8_Click(object sender, EventArgs e)
{
newString temp = new newString(textBox2.Text);
listVisualisation. addElement(temp, this);
}
private void button12_Click(object sender, EventArgs e)
{
newPolinomForm form = new newPolinomForm();
form. par = this;
form. ShowDialog();
}
private void button2_Click(object sender, EventArgs e)
{
if(
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
Collection. arrList. Count>1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 1
)
{
MessageBox. Show("Первый элемент больше второго: " +
((newFloat)Collection. arrList[listBox1.SelectedIndices[0]])
.MoreThan(
((newFloat)Collection. arrList[listBox1.SelectedIndices[1]])
)
.ToString()
);
}
}
private void button3_Click(object sender, EventArgs e)
{
if (
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 1
)
{
sumForm sf = new sumForm();
if (sf. ShowDialog() == DialogResult. OK)
{
newFloat temp = new newFloat(0);
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp. classValue += ((newFloat)Collection. arrList[listBox1.SelectedIndices[i]]).classValue;
}
listVisualisation. addElement(temp, this);
}
else
{
newFloat temp = new newFloat(0);
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp. classValue += ((newFloat)Collection. arrList[listBox1.SelectedIndices[i]]).classValue;
}
MessageBox. Show("Результат сложения: " + temp. ToString());
}
}
}
private void button4_Click(object sender, EventArgs e)
{
int tempNum = 0;
for (int i = 0; i < listBox1.SelectedIndices. Count; i++,tempNum++)
listVisualisation. deleteElement(listBox1.SelectedIndices[i]
- tempNum, this);
listVisualisation. updateListView(this);
}
private void button5_Click(object sender, EventArgs e)
{
button4_Click(sender, e);
}
private void button9_Click(object sender, EventArgs e)
{
button4_Click(sender, e);
}
private void button6_Click(object sender, EventArgs e)
{
if (
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 2 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 2
)
{
sumForm sf = new sumForm();
if (sf. ShowDialog() == DialogResult. OK)
{
newString temp = new newString("");
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp. str += ((newString)Collection. arrList[listBox1.SelectedIndices[i]]).str;
}
listVisualisation. addElement(temp, this);
}
else
{
newString temp = new newString("");
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp. str += ((newString)Collection. arrList[listBox1.SelectedIndices[i]]).str;
}
MessageBox. Show("Результат сложения: " + temp. ToString());
}
}
}
private void button11_Click(object sender, EventArgs e)
{
if (
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 3 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 3
)
{
MessageBox. Show("Первый элемент больше второго: " +
((Polinom)Collection. arrList[listBox1.SelectedIndices[0]])
.MoreThan(
((Polinom)Collection. arrList[listBox1.SelectedIndices[1]])
)
.ToString()
);
}
}
private void button10_Click(object sender, EventArgs e)
{
if (
Collection. arrList. Count > 1 &&
listBox1.SelectedIndices. Count > 1 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 3 &&
((newObject)Collection. arrList[listBox1.SelectedIndices[1]]).ClassID == 3
)
{
sumForm sf = new sumForm();
if (sf. ShowDialog() == DialogResult. OK)
{
Polinom temp = new Polinom(0);
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp = (Polinom)temp. SumWith((Polinom)Collection. arrList[listBox1.SelectedIndices[i]]);
}
listVisualisation. addElement(temp, this);
}
else
{
Polinom temp = new Polinom(0);
for (int i = 0; i < listBox1.SelectedIndices. Count; i++)
{
temp = (Polinom)temp. SumWith((Polinom)Collection. arrList[listBox1.SelectedIndices[i]]);
}
MessageBox. Show("Результат сложения: " + temp. ToString());
}
}
}
private void button13_Click(object sender, EventArgs e)
{
if (
((newObject)Collection. arrList[listBox1.SelectedIndices[0]]).ClassID == 3
)
{
int x = int. Parse(textBox3.Text);
MessageBox. Show("Результат при X=" + x. ToString() + ": " +
((Polinom)Collection. arrList[listBox1.SelectedIndices[0]]).Result(x).ToString()
);
}
}
private void опрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd. ShowDialog() == System. Windows. Forms. DialogResult. OK)
{
forSerializationCollection fsc = forSerializationCollection. MyInstance;
fsc. LoadCollection(ofd. FileName);
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)',' ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{}
else
{
e. Handled = true;
}
}
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
}
}
Form2.cs
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace coursework
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
}
newPolinomForm. cs
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace coursework
{
public partial class newPolinomForm : Form
{
public Form1 par;
int maxDegree = 0;
public newPolinomForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
maxDegree = int. Parse(textBox1.Text);
textBox2.Enabled = true; // 0 степ
if (maxDegree > 0) textBox3.Enabled = true; // 1 степ
if (maxDegree > 1) textBox4.Enabled = true; // 2 степ
if (maxDegree > 2) textBox5.Enabled = true; // 3 степ
if (maxDegree > 3) textBox6.Enabled = true; // 4 степ
if (maxDegree > 4) textBox7.Enabled = true; // 5 степ
if (maxDegree > 5) textBox8.Enabled = true; // 6 степ
if (maxDegree < 1) textBox3.Enabled = false; // 1 степ
if (maxDegree < 2) textBox4.Enabled = false; // 2 степ
if (maxDegree < 3) textBox5.Enabled = false; // 3 степ
if (maxDegree < 4) textBox6.Enabled = false; // 4 степ
if (maxDegree < 5) textBox7.Enabled = false; // 5 степ
if (maxDegree < 6) textBox8.Enabled = false; // 6 степ
}
private void button2_Click(object sender, EventArgs e)
{
if (textBox2.Text!= "" &&
textBox3.Text!= "" &&
textBox4.Text!= "" &&
textBox5.Text!= "" &&
textBox6.Text!= "" &&
textBox7.Text!= "" &&
textBox8.Text!= ""
)
{
int[] tempMas = new int[maxDegree + 1];
tempMas[0] = int. Parse(textBox2.Text);
if (maxDegree > 0) tempMas[1] = int. Parse(textBox3.Text);
if (maxDegree > 1) tempMas[2] = int. Parse(textBox4.Text);
if (maxDegree > 2) tempMas[3] = int. Parse(textBox5.Text);
if (maxDegree > 3) tempMas[4] = int. Parse(textBox6.Text);
if (maxDegree > 4) tempMas[5] = int. Parse(textBox7.Text);
if (maxDegree > 5) tempMas[6] = int. Parse(textBox8.Text);
Polinom pol = new Polinom(tempMas);
listVisualisation. addElement(pol, par);
this. Close();
}
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox4_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox6_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox7_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
private void textBox8_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char. IsDigit(e. KeyChar) ||
e. KeyChar == (int)'-' ||
e. KeyChar == (int)'\b'
)
{ }
else
{
e. Handled = true;
}
}
}
}
sumForm. cs
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace coursework
{
public partial class sumForm : Form
{
public sumForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this. DialogResult = System. Windows. Forms. DialogResult. OK;
this. Close();
}
private void button2_Click(object sender, EventArgs e)
{
this. DialogResult = System. Windows. Forms. DialogResult. No;
this. Close();
}
}
}
V. Приложение







