Файл: Лабораторная работа №12.docx

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Программирование

Добавлен: 21.10.2018

Просмотров: 2543

Скачиваний: 32

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


return VehicleCount;


}


public int GetVehicleCount(int aType) // кол-во транспорта определенного типа в городе

{

int res = 0;

//TVehicle vvv = new TVehicle();


foreach (TVehicle vvv in VehicleMassiv)

{

if (vvv.Type() == aType)

res = res + 1;

}

return res;

}


public void test()

{

VehicleMassiv.Add(new TCivilTransport(rnd.Next(1, 40)));

VehicleMassiv.Add(new TCivilTransport(rnd.Next(1, 40)));

VehicleMassiv.Add(new TLorryTransport(rnd.Next(1, 20)));

}

public CityMovement()

{

}

}

}


Диаграмма классов стала выглядеть следующим образом:



Рисунок 21 – Итоговый вариант диаграммы


Создадим интерфейс IObjectInfo для получения информации по состоянию движущегося объекта (т/с).



Рисунок 22 – Диаграмма и методы интерфейса IobjectInfo


using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public interface IObjectInfo // интерфейс для получения информации по состоянию движущегося объекта (т/с)

{

int GetX(); // координаты

int GetY();

int GetSpeed(); // текущая скорость

double GetDirection();// направление движения

int GetNoiseLevel();// уровень шума

int GetPolutionLevel(); // уровень загрязнения

int GetVehicleType(); // тип т/с

string GetVehicleTypeStr();// тип т/с в строковом виде

int GetEnergySourceType(); // Тип источника энергии

int GetGoodVolume(); // полезная нагрузка (пассажиры или груз)

}

}

Реализуем интерфейс для классов TCivilTransport и TLorryTransport.


Класс TCivilTransport

using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class TCivilTransport: TVehicle, IObjectInfo // пассажирские транспортные средства

{

private int MaxPeopleCount; // кол-во пассажирских мест

private int PeopleCount; // кол-во пассажиров

public TCivilTransport(int aMaxPeopleCount)

{

MaxPeopleCount = aMaxPeopleCount;

PeopleCount = rnd.Next(1, MaxPeopleCount);

}



public override string GetInfo()

{

string res = base.GetInfo();

res = res + " пассажирский";

return res;

}


// реализация интерфейса IObjectInfo

public int GetX() { return X; }

public int GetY() { return Y; }

public int GetEnergySourceType() { return EnergySource;}

public int GetNoiseLevel() { return NoiseLevel; }

public int GetPolutionLevel() { return PolutionLevel; }

public int GetVehicleType() { return 1; }

public string GetVehicleTypeStr() { return "пассажирский"; }

public int GetGoodVolume() { return PeopleCount; }

public int GetSpeed() { return Speed; }

public double GetDirection() { return Direction;}

}

}



Класс TLorryTransport

using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class TLorryTransport: TVehicle, IObjectInfo // грузовые транспортные средства

{

private int MaxGruzMassa; // грузоподъемность

private int GruzMassa; // масса груза


public TLorryTransport(int aMaxGruzMassa)

{

MaxGruzMassa = aMaxGruzMassa;

GruzMassa = rnd.Next(1, MaxGruzMassa);

}



public override string GetInfo()

{

string res = base.GetInfo();

res = res + " грузовой";

return res;

}

// реализация интерфейса IObjectInfo

public int GetX() {return X;}

public int GetY() { return Y; }

public int GetEnergySourceType() { return EnergySource; }

public int GetNoiseLevel() { return NoiseLevel; }

public int GetVehicleType() { return 2; }

public string GetVehicleTypeStr() { return "грузовой"; }

public int GetGoodVolume() { return GruzMassa; }

public double GetDirection() { return Direction; }

public int GetSpeed() { return Speed; }

public int GetPolutionLevel() { return PolutionLevel; }

}

}



Диаграмма классов после преобразований выглядит следующим образом:


Рисунок 23 – Диаграмма классов


Добавим методы в классы для отрисовки объектов.


В класс TStreet добавим метод Draw для отрисовки улиц. А также новые методы:

FillNoiseLevelMap // определение характера распространения шума по всей длине улицы

FillPolutionLevelMap // определение характера распространения загрязнения по всей длине улицы

GetName //название улицы

GetNoiseLevelView//показывает уровень шума на улице

GetPolutionLevelView//показывает уровень загрязниния на улице

IsTransPortOnStreet//нахождение т/с на улице



Класс Tstreet

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;




namespace CityTransport

{



public class TStreet

{

private int Type; // 1- вертикальная (улица), 2- горизонтальная (проспект)

private int X1, X2, Y1, Y2;//координаты улицы

private string Name;//название улицы

private int[] NoiseMap;//карта уровня шума

private int[] PolutionMap;//карта уровня загрязнения


public TStreet (int aX, int aY)//конструктор класса

{

X1 = aX; Y1 = aY;

if (aX == 0) // проспект

{

Type = 2;

X2 = 500; Y2 = Y1;

Name = "Проспект-" + Y1;

NoiseMap = new int[500];

PolutionMap = new int[500];

}

else // улица

{

Type = 1;

X2 = X1; Y2 = 400;

Name = "Улица-" + X1;

NoiseMap = new int[400];

PolutionMap = new int[400];

}

}


public void FillNoiseLevelMap(List<TVehicle> aList) // определение характера распространения шума по всей длине улицы

{

double NoiseLevel = 0; // уровень шума в точке


int L, N; // текущая позиция и максимальная длина улицы

if (Type == 2) // горизонтальная улица

{ L = X1; N = X2; }

else

{ L = Y1; N = Y2; }


while (L < N)

{

foreach (IObjectInfo vvv in aList)

if (IsTransPortOnStreet(vvv))

if (Type == 2)

NoiseLevel = NoiseLevel + vvv.GetNoiseLevel() / Math.Max(1, Math.Abs(L - vvv.GetX()));

else

NoiseLevel = NoiseLevel + vvv.GetNoiseLevel() / Math.Max(1, Math.Abs(L - vvv.GetY()));


if (NoiseLevel < 1)

NoiseMap[L]=0;

else

NoiseMap[L] = Convert.ToInt32 ( NoiseLevel);


NoiseLevel = 0;

L++;

}

}


public string GetNoiseLevelView()

{

string result="";

for (int i = 0; i < NoiseMap.Length; i++)

{

if (NoiseMap[i] == 0) result = result + ".";

else result = result + "[" + NoiseMap[i].ToString() + "]";

}

return result;

}

public void FillPolutionLevelMap (List<TVehicle> aList) // определение характера распространения загрязнений по всей длине улицы

{

double PL = 0; // уровень загрязнения в точке


int L, N; // текущая позиция и максимальная длина улицы

if (Type == 2) // горизонтальная улица

{ L = X1; N = X2; }

else

{ L = Y1; N = Y2; }


while (L < N)

{

foreach (IObjectInfo vvv in aList)

if ((vvv.GetPolutionLevel() > 0) & (IsTransPortOnStreet(vvv)))

if (Type == 2)

{

if (

((Math.Cos(vvv.GetDirection()) == 1) & ((vvv.GetX() - L) <= vvv.GetSpeed()) & (vvv.GetX() >= L)) ||

((Math.Cos(vvv.GetDirection()) == -1) & ((L - vvv.GetX()) <= vvv.GetSpeed()) & (vvv.GetX() <= L))

)

PL = PL + vvv.GetPolutionLevel();

}

else

if (

((Math.Sin(vvv.GetDirection()) == 1) & (((vvv.GetY() - L)) <= vvv.GetSpeed()) & (vvv.GetY() >= L)) ||

((Math.Sin(vvv.GetDirection()) == -1) & (((L - vvv.GetY())) <= vvv.GetSpeed()) & (vvv.GetY() <= L))

)


PL = PL + vvv.GetPolutionLevel();


if (PL < 1)

PolutionMap[L]=0;

else

PolutionMap[L]= Convert.ToInt32 (PL);


PL = 0;

L++;

}

}

public string GetPolutionLevelView()

{

string result = "";

for (int i = 0; i < PolutionMap.Length; i++)

{

if (PolutionMap[i] == 0) result = result + ".";

else result = result + "[" + PolutionMap[i].ToString() + "]";

}

return result;


}


public double PolutionLevel(int L)

{

return 0;

}

public bool IsTransPortOnStreet(IObjectInfo aTransport)//проверка нахождения т/с на улице

{

if ((aTransport.GetX()==X1)||(aTransport.GetY()==Y1))

return true;

else return false;

}

public string GetName()

{

return Name;

}


public void Draw(Graphics G, float sfx, float sfy, bool DrawNoise, bool DrawPolution)//отрисовка улиц с уровнем шума и загрязнением

{

G.DrawLine(new Pen(Color.Blue), X1 * sfx, Y1 * sfy, X2 * sfx, Y2 * sfy);

Pen NoisePen = new Pen(Color.LemonChiffon);

Pen PolutionPen = new Pen(Color.LimeGreen);


if (DrawNoise)

{

if (Type == 1)

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

G.DrawLine(NoisePen, (X1 - NoiseMap[i] * 3) * sfx, i * sfy, X1 * sfx, i * sfy);

else

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

G.DrawLine(NoisePen, i * sfx, (Y1 - NoiseMap[i] * 3) * sfy, i * sfx, Y1 * sfy);

}

if (DrawPolution)

{

if (Type == 1)

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

G.DrawLine(PolutionPen, (X1 + PolutionMap[i] * 3) * sfx, i * sfy, X1 * sfx, i * sfy);

else

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

G.DrawLine(PolutionPen, i * sfx, (Y1 + PolutionMap[i] * 3) * sfy, i * sfx, Y1 * sfy);

}




}


}

}



В класс TVehicle добавим метод Draw для отрисовки улиц. А также новые методы:

ChangeDirection // изменение направления движения

CheckForObgon // проверка на возможность обгона между двумя т/с

GetEnergySource //источник энергии

GetInfo // информация по состоянию т/с

IsTransportOutCity //проверка на выезд т/с за пределы города

Move // перемещение транспортного средства


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;


namespace CityTransport

{

public class TVehicle

{

protected int MaxSpeed;// максимальная скорость

protected int PolutionLevel;//уровень загрязнения

protected int NoiseLevel;//уровень шума

protected int EnergySource; // источник энергии 1- внутренний, 0- внешний

protected int Speed, NormalSpeed; // текущая скорость и скорость движения без помех

protected double Direction; // направление движения (в радианах, 0-восток, pi -запад, pi/2 - север)

protected int X, Y; //координаты

protected TStreet Street;//улица


protected Random rnd = new Random();


public TVehicle()//конструктор класса

{

MaxSpeed = rnd.Next(20,40); //максимальная скорость выбирается случайным образом от 20 до 40

NoiseLevel = rnd.Next(1, 20);//уровень шума выбирается случайным образом от 1 до 20


double rrr = rnd.NextDouble();


if (rrr < 0.5)//проверка на источник энергии

{

EnergySource = 0;//источник энергии внешний

PolutionLevel = 0;//уровень шума равен 0

}

else

{

EnergySource = 1;//источник энергии внутренний

PolutionLevel = rnd.Next(1, 10);//уровень шума выбирается случайным образом от 1 до 10

}

Speed = rnd.Next(20,MaxSpeed);//текущая скорость выбирается случайным образом от 20 до максимальной скорости

NormalSpeed = Speed;//скорость движения без помех равна текущей скорости