Цель работы

Цель данной лабораторной работы состоит в закреплении теоретических основ первой темы курса «Математическое и программное обеспечение робототехнических систем» и в приобретении практических навыков работы со средой 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)