русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-07-09; просмотров: 657; Нарушение авторских прав


В ООП полиморфизмом называют явление, при котором один и тот же

код может выполняться по-разному в зависимости от того, для какого объекта

(или в каком контексте) он выполняется. Производные классы (потомки)

видоизменяют и дополняют свойства и методы базовых классов (предков). При

этом сигнатура методов предков не должна изменяться.

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

 

 


Листинг авторского кода на языке C#

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 WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

 

public Stack<PolyStack> mystack1; //1 стек

public Stack<PolyStack> mystack2; //2 стек

public Stack<PolyStack> mystack3; //3 стек. Будет использоваться для промежуточных вычислений

 

//создание стека

private void Create_Click(object sender, EventArgs e) //Create

{

if (this.Rstack1.Checked)

{

mystack1 = new Stack<PolyStack>();

this.val_out.Text = "Stack 1 is created";

return;

}

if (this.Rstack2.Checked) //то же самое для второго стека

{

mystack2 = new Stack<PolyStack>();

this.val_out.Text = "Stack 2 is created";



return;

}

}

 

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

private void Push_Click(object sender, EventArgs e) //Push

{

if (this.Rstack1.Checked)

{

if (this.RadioInt.Checked)

{

int test;

if (System.Int32.TryParse(this.val_in.Text, out test) == true)

{

Poly_int value = new Poly_int(test);

mystack1.Push(value);

this.val_out.Text = "Added the element to stack 1: " + this.val_in.Text;

return;

}

}

if (this.RadioString.Checked)

{

string str = this.val_in.Text;

Poly_string value = new Poly_string(str);

mystack1.Push(value);

this.val_out.Text = "Added the element to stack 1: " + this.val_in.Text;

return;

}

}

 

if (this.Rstack2.Checked)

{

if (this.RadioInt.Checked)

{

int test;

if (System.Int32.TryParse(this.val_in.Text, out test) == true)

{

Poly_int value = new Poly_int(test);

mystack2.Push(value);

this.val_out.Text = "Added the element to stack 2: " + this.val_in.Text;

return;

}

}

if (this.RadioString.Checked)

{

string str = this.val_in.Text;

Poly_string value = new Poly_string(str);

mystack2.Push(value);

this.val_out.Text = "Added the element to stack 2: " + this.val_in.Text;

return;

}

}

if (!(this.RadioInt.Checked) && !(this.RadioString.Checked))

{

this.val_out.Text = "Choose the type of value!!!";

return;

}

}

 

//выборка из стека

private void Pop_Click(object sender, EventArgs e) //Pop

{

this.val_out.Clear(); //очищаем экран

if (this.Rstack1.Checked)

{

int count = mystack1.Count(); //считаем количество элементов в стеке

if (count != 0) //если оно не равно нулю, то вынимаем

{

this.val_out.Text = "Poping the element from stack 1: " + this.mystack1.Pop().Get();

return;

}

else

{

this.val_out.Text = "Stack 1 is empty. Nothing to pop.";

return;

}

}

if (this.Rstack2.Checked)

{

int count = mystack2.Count();

if (count != 0)

{

this.val_out.Text = "Poping the element from stack 1: " + this.mystack2.Pop().Get();

return;

}

else

{

this.val_out.Text = "Stack 2 is empty. Nothing to pop.";

return;

}

}

}

 

//кол-во элементов в стеке

private void CountEl_Click(object sender, EventArgs e) //CountEl

{

this.val_out.Clear();

if (this.Rstack1.Checked)

{

this.val_out.Text = "Number of elements in the stack 1 equals " + mystack1.Count();

return;

}

if (this.Rstack2.Checked)

{

this.val_out.Text = "Number of elements in the stack 2 equals " + mystack2.Count();

return;

}

}

 

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

private void DelSim_Click(object sender, EventArgs e) //DelSim

{

this.val_out.Clear();

if (this.Rstack1.Checked)

{

int k = 1; //кол-во элементов в стеке, кот. будет без дублирующих элементов

mystack3 = new Stack<PolyStack>();

mystack3.Push(mystack1.Pop()); //кладём элемент с вершины стека 1 в стек 3

while (mystack1.Count() != 0)

{

string temp = mystack1.Pop().Get().ToString(); //будем сравнивать каждый элемент

for (int i = 0; i < k; ++i) //стека 1 с эл-тами, нах. в стеке 3

{

if (mystack3.ElementAt(i).Comp(temp) == 1) //если есть похожие, то такие элементы в стек не добавляем

continue;

else if (i == (k - 1)) //если на последней итерации таких эл-тов не нашлось, то добавляем их в стек

{

k++;

Poly_string str = new Poly_string(temp);

mystack3.Push(str);

break;

}

}

}

this.val_out.Text = "All similar elements in stack 1 deleted";

}

if (this.Rstack2.Checked)

{

int k = 1;

mystack3 = new Stack<PolyStack>();

mystack3.Push(mystack2.Pop());

while (mystack2.Count() != 0)

{

string temp = mystack2.Pop().Get().ToString();

for (int i = 0; i < k; ++i)

{

if (mystack3.ElementAt(i).Comp(temp) == 1)

continue;

else if (i == (k - 1))

{

k++;

Poly_string str = new Poly_string(temp);

mystack3.Push(str);

break;

}

}

}

this.val_out.Text = "All similar elements in stack 2 deleted";

}

}

 

//реверс стека

private void Rev_Click(object sender, EventArgs e) //Rev

{

this.val_out.Clear();

if (this.Rstack1.Checked)

{

mystack3 = new Stack<PolyStack>();

int count = mystack1.Count();

while (count != 0) //вынимаем эл-ты из стека 1 в стек 3, т.о. они будут в обратном порядке

{

mystack3.Push(mystack1.Pop());

count--;

}

int count2 = mystack3.Count();

this.val_out.AppendText("Stack 1 was reversed successfully: \n");

for (int i = mystack3.Count - 1; i >= 0; i--)

this.val_out.AppendText(mystack3.ElementAt(i).Get() + " ");

return;

 

}

if (this.Rstack2.Checked)

{

mystack3 = new Stack<PolyStack>();

int count = mystack2.Count();

while (count != 0)

{

mystack3.Push(mystack2.Pop());

count--;

}

int count2 = mystack3.Count();

this.val_out.AppendText("Stack 2 was reversed successfully: \n");

for (int i = mystack3.Count - 1; i >= 0; i--)

this.val_out.AppendText(mystack3.ElementAt(i).Get() + " ");

return;

}

}

 

//показывает, что содержит стек

private void Show_Click(object sender, EventArgs e) //Show

{

this.val_out.Clear();

if (this.Rstack1.Checked)

{

this.val_out.AppendText("Stack 1 contains: \n");

for (int i = mystack1.Count-1; i >=0 ; i--)

{

this.val_out.AppendText(mystack1.ElementAt(i).Get() + " ");

}

this.val_out.AppendText("\r\n");

}

if (this.Rstack2.Checked)

{

this.val_out.AppendText("Stack 2 contains: \n");

for (int i = mystack2.Count-1; i >= 0; i--)

{

this.val_out.AppendText(mystack2.ElementAt(i).Get() + " ");

}

this.val_out.AppendText("\r\n");

}

}

 

//поиск элемента (итератор)

private void Find_Click(object sender, EventArgs e) //Find

{

if (this.Rstack1.Checked)

{

this.val_out.Clear();

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

{

if (mystack1.ElementAt(i).Comp(this.val_in.Text) == 1)

{

this.val_out.Text = "The element was found";

return;

}

}

this.val_out.Text = "Stack 1 have no such element";

return;

}

if (this.Rstack2.Checked)

{

this.val_out.Clear();

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

{

if (mystack2.ElementAt(i).Comp(this.val_in.Text) == 1)

{

this.val_out.Text = "The element was found";

return;

}

}

this.val_out.Text = "Stack 2 have no such element";

return;

}

}

 

//сохранение стека в файл

private void Save_Click(object sender, EventArgs e) //Save

{

if (this.Rstack1.Checked)

{

string path = "data.txt";

StreamWriter file = File.CreateText(path);

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

{

file.WriteLine(mystack1.ElementAt(i).Get());

}

this.val_out.Text = "Saving stack 1 into the file complete";

file.Close();

return;

}

if (this.Rstack2.Checked)

{

string path = "data.txt";

StreamWriter file = File.CreateText(path);

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

{

file.WriteLine(mystack2.ElementAt(i).Get());

}

this.val_out.Text = "Saving stack 2 into the file complete";

file.Close();

return;

}

}

 

//чтение стека из файла

private void Read_Click(object sender, EventArgs e) //Read

{

if (this.Rstack1.Checked)

{

string path = "data.txt";

string line;

StreamReader file = new StreamReader(path);

mystack1 = new Stack<PolyStack>();

while ((line = file.ReadLine()) != null)

{

Poly_string data = new Poly_string(line);

mystack1.Push(data);

}

this.val_out.AppendText("Reading stack 1 is complete");

}

if (this.Rstack2.Checked)

{

string path = "data.txt";

string line;

StreamReader file = new StreamReader(path);

mystack2 = new Stack<PolyStack>();

while ((line = file.ReadLine()) != null)

{

Poly_string data = new Poly_string(line);

mystack2.Push(data);

}

this.val_out.AppendText("Reading stack 2 is complete");

}

}

 

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

private void Intersect_Click(object sender, EventArgs e) //Intersect

{

this.val_out.Clear();

mystack3 = new Stack<PolyStack>(); //здесь будет результат

while (mystack1.Count != 0) //вынимаем из 1 стека эл-ты и сравниваем их с эл-тами

{ //2 стека. Если есть равные, то заносим их в результат

string str = mystack1.Pop().Get().ToString();

Poly_string temp = new Poly_string(str);

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

{

if (mystack2.ElementAt(i).Comp(str) == 1)

{

mystack3.Push(temp);

break;

}

}

}

this.val_out.AppendText("Intersection of 1 and 2 stack done: \n");

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

this.val_out.AppendText(mystack3.ElementAt(i).Get() + " ");

return;

}

 

//удаление стека

private void Del_Click(object sender, EventArgs e) //Del

{

this.val_out.Clear();

if (this.Rstack1.Checked)

{

while (mystack1.Count != 0)

mystack1.Pop(); //просто вынимаем эл-ты, память освобождается в Pop()

this.val_out.Text = "Stack 1 was removed";

}

if (this.Rstack2.Checked)

{

while (mystack2.Count != 0)

mystack2.Pop();

this.val_out.Text = "Stack 2 was removed";

}

}

 

//объединение стеков

private void Union_Click(object sender, EventArgs e) //Union

{

this.val_out.Clear(); //просто кладём эл-ты из обоих стеков в тек результата

mystack3 = new Stack<PolyStack>();

while (mystack1.Count != 0)

mystack3.Push(mystack1.Pop());

while (mystack2.Count != 0)

mystack3.Push(mystack2.Pop());

this.val_out.AppendText("Union os 1 and 2 stack done: \n");

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

this.val_out.AppendText(mystack3.ElementAt(i).Get() + " ");

return;

}

 

//вычитание 2 стека из 1

private void Substract_Click(object sender, EventArgs e) //Substract

{

this.val_out.Clear();

mystack3 = new Stack<PolyStack>();

while (mystack1.Count != 0) //сравниваем эл-ты 1 стека с эл-тами 2 стека

{ //если во втором стеке есть похожие, то в результат

string str = mystack1.Pop().Get().ToString();//их не добавляем

Poly_string temp = new Poly_string(str);

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

{

if (mystack2.ElementAt(i).Comp(str) == 1)

break;

else if (i == mystack2.Count - 1)

{

mystack3.Push(temp);

break;

}

}

}

this.val_out.AppendText("Substraction 2 stack from 1 stack done: \n");

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

this.val_out.AppendText(mystack3.ElementAt(i).Get() + " ");

return;

}

 

public abstract class PolyStack //абстрактный класс стека

{

public abstract string Get(); //геттер, получает элемент как строку

public int Comp(string a) //сравнение элементов

{

string str = this.Get();

if (str.Equals(a))

return 1;

else return 0;

}

};

 

//потомки класса PolyStack

 

class Poly_int : PolyStack //класс для целого числа

{

int val;

 

public Poly_int(int a) //конструктор

{

this.val = a;

}

 

public override string Get()

{

string str;

str = val.ToString();

return str;

}

};

 

class Poly_string : PolyStack //класс для строки

{

string val;

 

public Poly_string(string a) //конструктор

{

val = a;

}

 

public override string Get()

{

return val;

}

};

 

class Poly_struct : PolyStack //класс для структуры

{

public struct test //структура

{

public string str;

public int val;

};

 

test test_struct;

 

Poly_struct(string a,int b) //конструктор

{

this.test_struct.str = a;

this.test_struct.val = b;

}

 

public override string Get()

{

return this.test_struct.str;

}

};

}

}

 



<== предыдущая лекция | следующая лекция ==>
Эскизы задействованных окон, визуальных элементов и схему управления ими. | Практическая работа №2.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.958 сек.