Цель работы
Цель данной лабораторной работы состоит в закреплении теоретических основ первой темы курса «Математическое и программное обеспечение робототехнических систем» и в приобретении практических навыков работы со средой Microsoft Visual Studio.
1)
Задание
Описать класс, представляющий круг. Предусмотреть методы для создания объектов, вычисления площади круга, длины окружности и проверки попадания заданной точки внутрь круга. Описать свойства для получения состояния объекта. Написать программу, демонстрирующую все разработанные элементы класса.
2)
Задание
Описать класс «множество», позволяющий выполнять основные операции: добавление и удаление элемента, пересечение, объединение и разность множеств. Написать программу, демонстрирующую все разработанные элементы класса.
3)
Задание
1. Описать базовый класс Элемент. Закрытые поля:
- имя элемента (строка символов);
- количество входов элемента;
- количество выходов элемента.
Методы:
- конструктор класса без параметров;
- конструктор, задающий имя и устанавливающий равным 1 количество
входов и выходов;
- конструктор, задающий значения всех полей элемента.
Свойства:
- имя элемента (только чтение);
- количество входов элемента;
- количество выходов элемента.
2. На основе класса Элемент описать производный класс Комбинационный, представляющий собой комбинационный элемент (двоичный вентиль), который может иметь несколько входов и один выход.
Поле — массив значений входов.
Методы:
- конструкторы;
- метод, задающий значение на входах экземпляра класса;
- метод, позволяющий опрашивать состояние отдельного входа экземпляра класса;
- метод, вычисляющий значение выхода (по варианту задания).
3. На основе класса Элемент описать производный класс Память, представляющий собой триггер. Триггер имеет входы, соответствующие типу триггера (см. далее вариант задания), и входы установки и сброса. Все триггеры считаются синхронными, сам синхровход в состав триггера не включается.
Поля:
- массив значений входов объекта класса, в массиве учитываются все входы (управляющие и информационные);
- состояние на прямом выходе триггера;
- состояние на инверсном выходе триггера.
Методы:
- конструктор (по умолчанию сбрасывает экземпляр класса);
- метод, задающий значение на входах экземпляра класса;
- методы, позволяющие опрашивать состояния отдельного входа экземпляра класса;
- метод, вычисляющий состояние экземпляра класса (по варианту задания) в зависимости от текущего состояния и значений на входах;
- метод, переопределяющий операцию == для экземпляров класса.
4 . Создать класс Регистр, используя класс Память как вложенный класс.
Поля:
- состояние входа «Сброс» — один для экземпляра класса;
- состояние входа «Установка» — один для экземпляра класса;
- массив типа Память заданной в варианте размерности;
- массив (массивы), содержащий значения на соответствующих входах элементов массива типа Память.
Методы:
- метод, задающий значение на входах экземпляра класса;
- метод, позволяющий опрашивать состояние отдельного выхода экземпляра класса;
- метод, вычисляющий значение нового состояния экземпляра класса. Все поля классов Элемент, Комбинационный и Память должны быть описаны с ключевым словом private.
В задании перечислены только обязательные члены и методы класса. Можно задавать дополнительные члены и методы, если они не отменяют обязательные и обеспечивают дополнительные удобства при работе с данными классами, например, описать функции вычисления выхода/состояния как виртуальные.
5. Для проверки функционирования созданных классов написать программу, использующую эти классы. В программе должны быть продемонстрированы все свойства созданных классов.
Конкретный тип комбинационного элемента, тип триггера и разрядность регистра выбираются в соответствии с вариантом задания:
ИЛИ-НЕ 3 JK 11
Листинг
1)
using System;
using System. Collections. Generic;
using ponentModel;
using System. Linq;
using System. Threading;
namespace Lab2
{
public static class Program
{
private static void Main()
{
double R=0, X, Y, InX=0, InY=0;
Console. WriteLine("Классы. Вариант 12. Автор:Сергей Скорынин. Группа 10-В-1");
Console. WriteLine("Введите радиус круга");
R = Convert. ToDouble(Console. ReadLine());
Console. WriteLine("Введите координату X центра круга");
X = Convert. ToDouble(Console. ReadLine());
Console. WriteLine("Введите координату Y центра круга");
Y = Convert. ToDouble(Console. ReadLine());
Circle circle = new Circle(R, new Point(X, Y));
Console. WriteLine("Введите координату X точки для определения внутри круга она(точка) или нет");
try
{
InX = Convert. ToDouble(Console. ReadLine());
}
catch (ArithmeticException e)
{
Console. WriteLine("{0} Exception caught.", e);
}
Console. WriteLine("Введите координату Y точки для определения внутри круга она(точка) или нет");
InY = Convert. ToDouble(Console. ReadLine());
Console. WriteLine("Проверка на принадлежность точки кругу.");
circle. Inside(new Point(InX, InY));
Console. WriteLine(circle. Inside(new Point(InX, InY)));
Console. WriteLine("Площадь.");
Console. WriteLine(circle. Square);
Console. WriteLine("Длина окружности.");
Console. WriteLine(circle. Circuit);
Console. ReadKey();
}
}
#region class Circle
public class Circle
{
//Радиус окружности, защищеный тип данных.
double Radius;
//Положение центра, защищеный тип данных.
Point Center;
//Конструктор
public Circle(double radius, Point center)
{
Radius = radius;
Center = center;
}
// Площадь круга.
public double Square
{
get { return Math. PI * Radius * Radius; }
}
// Длина окружности.
public double Circuit
{
get { return Math. PI * 2 * Radius; }
}
// Проверка на принадлежность точки кругу.
public bool Inside(Point point)
{
double a, b;
a = point. X - Center. X;
b = point. Y - Center. Y;
Point flag = new Point(a, b);
double result = flag. X * flag. X + flag. Y * flag. Y;
return result <= Radius * Radius;
}
#endregion
}
#region class Point
//class Point - класс для хранения координат точки
public class Point
{
double XX;
double YY;
public Point(double x, double y)
{
XX = x;
YY = y;
}
/*
сокращенная запись
public string X { get; set; }
вместо
public string FirstName
{
get { return X; }
set { X = value; }
}
*/
public double X { get; private set; }
public double Y { get; private set; }
}
#endregion
}
2)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
class Many<T>
{
private List<T> composition;
public Many()
{
composition = new List<T>();
}
public Many(Many<T> parent)
{
composition = new List<T>(position);
}
public Many(T[] composition)
{
position = new List<T>();
foreach (T element in composition)
Addd(element);
}
public Many<T> Addd(T element)//
{
composition. Add(element);
return this;
}
public Many<T> Sub(T element)//
{
composition. Remove(element);
return this;
}
public Many<T> residual(Many<T> reducer)//
{
Many<T> residual = new Many<T>(this);
foreach (T element in position)
position. Remove(element);
return residual;
}
public Many<T> crossing(Many<T> factor)//
{
Many<T> crossing = new Many<T>();
foreach (T element in composition)
if (position. Contains(element))
position. Add(element);
return crossing;
}
public Many<T> union(Many<T> addendum)
{
Many<T> union = new Many<T>(this);
foreach (T element in position)
if (! position. Contains(element))
position. Add(element);
return union;
}
public void OnScreen()
{
Console. Write("{ ");
foreach (T element in composition)
Console. Write("{0}; ", element);
Console. WriteLine("}");
}
}
class Program
{
static void Main()
{
Many<int>
A = new Many<int>(new int[] { 4, 8, 15, 16, 23, 42 }),
B = new Many<int>(new int[] { -1, 42 }),
C = new Many<int>(new int[] { 0 });
Console. Write("A = "); A. OnScreen();
Console. Write("B = "); B. OnScreen();
Console. Write("C = "); C. OnScreen();
Console. WriteLine();
Console. Write("A residual B = "); A. residual(B).OnScreen();
Console. Write("B residual A = "); B. residual(A).OnScreen();
Console. WriteLine();
Console. Write("B union C = "); B. union(C).OnScreen();
Console. Write("C union B = "); C. union(B).OnScreen();
Console. WriteLine();
Console. Write("A crossing B = "); A. crossing(B).OnScreen();
Console. Write("B crossing C = "); B. crossing(C).OnScreen();
Console. WriteLine();
Console. Write("Добавить элемент 0 во множество C: ");
C. Addd(0).OnScreen();
Console. Write("Удалить элементы 15 и 4 из множества A: "); b(15).Sub(4).OnScreen();
Console. ReadKey();
}
}
3)
using System;
using System. Collections. Generic;
using System. Text;
namespace ConsoleApplication3
{
class ELEMENT
{
readonly string NAME;
int AmountInput;
int AmountOutput;
public string GetName()
{
return NAME;
}
public int GetIn()
{
return AmountInput;
}
public int GetOut()
{
return AmountOutput;
}
public ELEMENT()
{
AmountInput = 0;
AmountOutput = 0;
}
public ELEMENT(string S)
{
NAME = S;
AmountInput = 1;
AmountOutput = 1;
}
public ELEMENT(string S, int K1, int K2)
{
NAME = S;
AmountInput = K1;
AmountOutput = K2;
}
}
class KOMBIN : ELEMENT
{
int[] Input;
static Random ranndomnumber = new Random();
public KOMBIN()
{
Input = new int[0];
}
public KOMBIN(string name, int K)
: base(name, K, 1)
{
Input = new int[K];
}
public void SetParameters()
{
for (int i = 0; i < GetIn(); i++)
{
Input[i] = ranndomnumber. Next(2);
}
}
public void Request(int Index, ref int value)
{
value = Input[Index];
}
public int Output()
{
int p = 0;
for (int i = 0; i < GetIn() - 1; i++)
{
if (Input[i] == 1)
{ }
else p++;
}
if (p > 0) p = 0;
else p = 1;
return p;
}
}
class MEMORY : ELEMENT
{
static Random ranndomnumber = new Random();
int[] Input = new int[3];
int prim;
int inprim;
public MEMORY()
{
for (int i = 0; i < 2; i++)
Input[i] = 0;
}
public void SetParam()
{
for (int i = 0; i < 2; i++)
{
Input[i] = ranndomnumber. Next(2);
}
}
public void Setzn(int z)
{
Input[2] = z;
}
public void Request(int Index, ref int value)
{
value = Input[Index];
}
public int Calcul()
{
if (Input[0] == 1 && Input[1] == 1)
{
if (Input[2] == 1)
{
Input[2] = 0;
inprim = Input[2];
return Input[2]+2;
}
else
{
Input[2] = 1;
inprim = Input[2];
return Input[2] + 2;
}
}
if (Input[0] == 0 && Input[1] == 0) { prim = Input[2]; return Input[2]; }
if (Input[0] == 1 && Input[1] == 0) { Input[2] = 1; return 5; }
if (Input[0] == 0 && Input[1] == 1) { Input[2] = 0; return 6; }
return 3;
}
public static bool operator ==(MEMORY m1, MEMORY m2)
{
if (m1.Input[0] == m2.Input[0] && m1.Input[1] == m2.Input[1] && m1.Input[2] == m2.Input[2])
return true;
else return false;
}
public static bool operator!=(MEMORY m1, MEMORY m2)
{
if (m1.Input[0] != m2.Input[0] && m1.Input[1] != m2.Input[1] && m1.Input[2] != m2.Input[2])
return true;
else return false;
}
}
class REGISTR
{
int reset;
int setup;
MEMORY[] RAZR = new MEMORY[11];
int[,] Value = new int[3, 11];
public int RESET(int val)
{
reset = val;
return reset;
}
public int SETUP (int val)
{
setup = val;
return setup;
}
public int RequestIn(int Index)
{
return Value[0, Index];
}
public int RequestIn1(int Index)
{
return Value[1, Index];
}
public int RequestIn2(int Index)
{
return Value[2, Index];
}
public void Schit()
{
for (int i = 0; i < 11; i++)
{
if (Value[0, i] == 1 && Value[1, i] == 0) { RAZR[i].Setzn(0); Value[2, i] = 0; }
if (Value[0, i] == 0 && Value[1, i] == 1) { RAZR[i].Setzn(1); Value[2, i] = 1; }
}
}
public void SetParam()
{
for (int i = 0; i < 11; i++)
{
RAZR[i] = new MEMORY();
RAZR[i].SetParam();
for (int j = 0; j < 3; j++)
RAZR[i].Request(j, ref Value[j, i]);
}
}
public void SetParam2()
{
for (int i = 0; i < 11; i++)
{
RAZR[i].SetParam();
for (int j = 0; j < 3; j++)
RAZR[i].Request(j, ref Value[j, i]);
}
}
public int StatusOut(int index)
{
return RAZR[index].Calcul();
}
public void Calcul(int index, ref int value)
{
//RAZR[1].
value = RAZR[index].Calcul();
}
}
class Program
{
static void Main(string[] args)
{
int a=0, a1=0, sch=0;
REGISTR Registr = new REGISTR();
string s, name;
do
{
Console. WriteLine("1 - Элемент");
Console. WriteLine("2 - Комбинационный элемент");
Console. WriteLine("3 - Регистр");
Console. WriteLine("0 - Выход");
s = Console. ReadLine();
int p = 0;
try
{ p = Convert. ToInt32(s); }
catch (FormatException e)
{ Console. WriteLine("Введите целочисленное число"); }
switch (p)
{
case 1:
{
name = "Элемент 1";
a = 5;
a1 = 1;
ELEMENT EL = new ELEMENT(name, a, a1);
Console. WriteLine("Имя элемента, кол-во входов и выходов: {0}, {1}, {2}",
EL. GetName(), EL. GetIn(), EL. GetOut());
break;
}
case 2:
{
a = 5;
name = "ИЛИ-НЕ";
KOMBIN EL2 = new KOMBIN(name, a);
EL2.SetParameters();
do
{
Console. WriteLine("Введите (n-возрат в меню, 1-Входы, 2-Выход,3-random): ");
s = Console. ReadLine();
a = 5;
if (pareTo("n") == 0) goto B;
try
{ p = Convert. ToInt32(s); }
catch (FormatException e)
{ Console. WriteLine("Введите целочисленное число"); }
if (Convert. ToInt32(s) == 1)
{ Console. WriteLine("Введите целочисленное число"); }
{
for (int i = 0; i < 5; i++)
{
sch = i + 1;
EL2.Request(i, ref a);
Console. WriteLine("Вход {1} Значение: {0} ", a, sch);
}
}
if (Convert. ToInt32(s) == 2)
{
Console. WriteLine("Значение на выходе комбинационного элемента: {0}", EL2.Output());
Console. WriteLine();
}
if (Convert. ToInt32(s) == 3)
{
EL2.SetParameters();
}
}
while (true);
B: ;
break;
}
case 3:
{
{
Registr. SetParam();
Console. WriteLine("Введите состояние регистра 0-Reset 1-Setup : ");
s = Console. ReadLine();
a = 0;
try
{ a = Convert. ToInt32(s); }
catch (FormatException e)
{ Console. WriteLine("Введите целочисленное число"); }
if (a == 0)
{
a = Registr. RESET(a);
Console. WriteLine("Состояние сброса");
goto C;
}
if (a == 1)
{
a = Registr. SETUP(a);
goto MM;
}
MM: do
{
Console. WriteLine("Введите (n-выход в меню) 1-Выход 2-Вход 3-random : ");
s = Console. ReadLine();
if (pareTo("n") == 0) goto C;
a = 0;
try
{ a = Convert. ToInt32(s); }
catch (FormatException e)
{ Console. WriteLine("Введите целочисленное число"); }
if (a == 1)
{
for (int i = 0; i < 11; i++)
{
// Registr. Schit();
a1 = Registr. StatusOut(i);
sch = i + 1;
switch (a1)
{
case 3: Console. WriteLine(" ({0}) Инверсный режим - {1} ", sch, (a1 - 2)); break;
case 2: Console. WriteLine(" ({0}) Инверсный режим - {1} ", sch, (a1 - 2)); break;
case 5: Console. WriteLine(" ({0}) Режим: Значение - 1", sch); break;
case 6: Console. WriteLine(" ({0}) Режим: Значение - 0", sch); break;
default: Console. WriteLine(" ({0}) Режим: Хранения значение {1}", sch, a1); break;
}
}
}
if (a == 2)
{
for (int i = 0; i < 11; i++)
{
sch = i + 1;
Console. WriteLine(" ({2}) значение - J {0} K {1}", Registr. RequestIn(i), Registr. RequestIn1(i), sch);
}
}
if (a == 3)
{
Registr. SetParam2();
}
}
while (true);
C: ; goto D;
}
D: ;
break;
}
case 0: goto A;
}
}
while (true);
A: ;
}
}
}
Результат работы программы
1)
2)

3)




