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

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

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

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

Добавлен: 21.10.2018

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

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

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


X=0;

Y = rnd.Next(1, 4) * 100; // въезд в город слева по одному из проспектов

}


public virtual int Type () //тип т/с

{

return 0;

}

public int GetEnergySource ()//источник энергии

{

return EnergySource;

}


public void CheckForObgon(TVehicle aTransport2) // проверка на возможность обгона между двумя т/с

{

if ((Street==aTransport2.Street) & (EnergySource==0))

{

int X1 = X+Convert.ToInt32(Speed * Math.Cos(Direction));

int Y1 = Y+Convert.ToInt32(Speed * Math.Sin(Direction));

int X2 = aTransport2.X+ Convert.ToInt32(aTransport2.Speed * Math.Cos(aTransport2.Direction));

int Y2 = aTransport2.Y+Convert.ToInt32(aTransport2.Speed * Math.Sin(aTransport2.Direction));


if (((X<aTransport2.X)&(X1>=X2))||((X>aTransport2.X)&(X1<=X2))||

((Y<aTransport2.Y)&(Y1>=Y2))||((Y>aTransport2.Y)&(Y1<=Y2)))

{

Speed = aTransport2.Speed;

}

else

Speed = NormalSpeed;

}

else

Speed = NormalSpeed;

}

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

{

int dX = Convert.ToInt32(Speed * Math.Cos(Direction));

int dY = Convert.ToInt32(Speed * Math.Sin(Direction));

int r;

if (dX< 0)

Math.DivRem((1000-X) -dX, 100, out r); // разворачиваем систему координат на 180

else

Math.DivRem (X+ dX,100, out r);


if ((r != 0) & (r < Speed)) // возможен поворот на улицу

ChangeDirection(r);

else

{

if (dY < 0)

Math.DivRem((1000 - Y) - dY, 100, out r);// разворачиваем систему координат на 180

else

Math.DivRem(Y + dY, 100, out r);

if (((r != 0) & (r < Speed))) // возможен поворот на проспект

ChangeDirection(r);

else // поворот не возможен

{

{ X = X + dX; Y = Y + dY; }

}

}


}

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

int aDelta) // aDelta - остаток движения после поворота

{

/*switch (Math.Cos(Direction)) {

case 1:

}*/

X = X + Convert.ToInt32((Speed-aDelta) * Math.Cos(Direction));

Y = Y + Convert.ToInt32((Speed-aDelta) * Math.Sin(Direction));

int tmp = rnd.Next(-1, 2);

Direction = Direction + Math.PI / 2 * Math.Sign(tmp);

X = X + Convert.ToInt32(aDelta * Math.Cos(Direction));

Y = Y + Convert.ToInt32(aDelta * Math.Sin(Direction));


}


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

{

if ((X >= 500) || (X <= 0))

return true;

else

if ((Y >= 400) || (Y <= 0))

return true;

else

return false;


}

public virtual string GetInfo() // информация по состоянию т/с

{

string res = "X=" + X + " Y=" + Y;

res = res + " Скорость=" + Speed;

if (EnergySource==1)

res = res + " Источник внутренний";

else

res = res + " Источник внешний";


res = res + " Шум=" + NoiseLevel;

res = res + " Загрязнение=" + PolutionLevel;

return res;

}

public void SetStreet(TStreet aStreet)

{

Street = aStreet;

}

public virtual void Draw(Graphics G, float sfx, float sfy) { }//отрисовка графики т/с



}


}



Также переопределим классы TCivilTransport и TlorryTransport.


Класс TCivilTransport

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;


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;

}

public override void Draw(System.Drawing.Graphics G, float sfx, float sfy)//отрисовка пассажирского т/с

{


Color clr;

if (EnergySource == 0) //если источник энергии внешний, то т/с зеленое

{clr = Color.Green;}

else

{clr = Color.Red;}//иначе красное


G.DrawEllipse(new Pen(clr), (X - 5) * sfx, (Y - 5) * sfy, 10 * sfx, 10*sfy);//рисуем эллипс с помощью пера по координатам

}


// реализация интерфейса 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;

using System.Drawing;


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 void Draw(System.Drawing.Graphics G, float sfx, float sfy)//отрисовка грузовых т/с

{

Color clr;

if (EnergySource == 0)

{ clr = Color.Green; }

else

{ clr = Color.Red; }


G.DrawRectangle (new Pen(clr), (X - 5) * sfx, (Y - 5) * sfy, 10 * sfx, 10 * sfy);

}


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; }

}

}




Изменим классы Init и CityMovement, добавив новые методы.


Класс Init

using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class Init

{

public List<TVehicle> VehicleList = new List<TVehicle>();

static public TStreet[] StreetArray = new TStreet[7];



int i;

public Random rnd = new Random();

public void FillTransportArray()

{

for (i = 0; i <= 9; i++)

{

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

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

}

}


public void FillStreetArray()

{

for (i = 0; i <= 3; i++)

{

StreetArray[i] = new TStreet((i + 1) * 100, 0);

}

for (i = 4; i <= 6; i++)

StreetArray[i] = new TStreet(0, (i - 3) * 100);

}

public Init()

{

FillStreetArray();

}

}

}


Класс CityMovement

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;


namespace CityTransport

{

public class CityMovement: Init

{

private int TurnCount; // кол-во прошедших едениц времени


public int GetVehicleCount ()

{

int VehicleCount;

VehicleCount = 0;

VehicleCount = VehicleCount + VehicleList.Count;


return VehicleCount;


}

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

{

int res = 0;

foreach (IObjectInfo vvv in VehicleList)

{

if (vvv.GetVehicleType() == aType)


res = res + 1;

}

return res;

}

public int GetEcologyVehicleCount() // кол-во транспорта, не загрязняющего окружающую среду

{

int res = 0;

foreach (TVehicle vvv in VehicleList)

{

if (vvv.GetEnergySource() == 0)

res = res + 1;

}

return res;

}

public CityMovement() { }


public int GetTurnCount() { return TurnCount; }//возвращает количество прощедшего времени

public void DoTransportMove() // движение транспорта за еденичный промежуток времени

{

foreach (TVehicle vvv in VehicleList)

{

foreach (TVehicle vvv_2 in VehicleList)

vvv.CheckForObgon(vvv_2);

vvv.Move();

foreach (TStreet sss in StreetArray)

if (sss.IsTransPortOnStreet(vvv as IObjectInfo))

{

vvv.SetStreet(sss);

}

}


foreach (TStreet sss in StreetArray)

{

sss.FillNoiseLevelMap(VehicleList);

sss.FillPolutionLevelMap(VehicleList);

}

TurnCount++;

}

public void CheckTransportOut() // обработка транспорта выехавшего за пределы города

{

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

{

if (VehicleList[i].IsTransportOutCity())

{

VehicleList.RemoveAt(i);

}

}

}

public void DoTransportWelcome() // въезд транспорта в город

{

Random rnd = new Random();

if (rnd.NextDouble()<0.5) // вероятность появления нового транспорта

if (rnd.Next(1,3)==1)

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

else

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

}

public int GetPeopleOnStreet(TStreet aStreet) // кол-во пассажиров на заданной улице

{

int res=0;

foreach (IObjectInfo vvv in VehicleList)

{

if ((aStreet.IsTransPortOnStreet(vvv)) & (vvv.GetVehicleType () == 1))

{

res = res + vvv.GetGoodVolume();

}

}

return res;

}

public int GetGruzOnStreet(TStreet aStreet) // кол-во груза на заданной улице

{

int res = 0;

foreach (IObjectInfo vvv in VehicleList)

{

if ((aStreet.IsTransPortOnStreet(vvv)) & (vvv.GetVehicleType() == 2))

{

res = res + ((TLorryTransport)vvv).GetGoodVolume();

}

}

return res;

}

public TStreet GetStreet(int aIndex) { return StreetArray[aIndex]; }

public string GetNoiseLevelView(TStreet aStreet) // характер распространения шума по улице

{

return aStreet.GetNoiseLevelView();

}

public string GetPolutionLevelView(TStreet aStreet) // характер распространения загрязнений по улице

{

return aStreet.GetPolutionLevelView();

}


public void DrawItems (IntPtr h, bool DrawNoise, bool DrawPolution)

{

Graphics gr = Graphics.FromHwnd(h);//графическая переменная gr создается методом Graphics.FromHwnd(h) из указанного дискриптора окна h

gr.Clear(Color.FromKnownColor (System.Drawing.KnownColor.Control)); //метод который создает структуру колор из указанного определенного цвета

float sfx = gr.VisibleClipBounds.Width / 500;//координаты меняются при изменение размера окна по х

float sfy = gr.VisibleClipBounds.Height / 400;


foreach (TStreet sss in StreetArray) { sss.Draw(gr, sfx, sfy, DrawNoise, DrawPolution); }

foreach (TVehicle vvv in VehicleList) { vvv.Draw(gr, sfx, sfy); }

gr.Dispose();//освобождает все ресурсы,используемыми данным объектом

}


}

}

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



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



Варианты заданий:

      1. Справочник меломана

Разработайте программу для ведения справочника произведений, полностью помещающегося в оперативной памяти. Имеются люди – фамилия, имя, дата рождения, пол. Каждый человек является либо певцом, либо поэтом, либо композитором. Певцы могут обладать голосом (мужчины - бас, баритон, тенор, женщины – сопрано, контральто). Сведения о произведении – наименование, жанр, список поэтов, список композиторов, дата создания. Жанр – джаз, поп, рок (популярная музыка), классическая музыка. Если жанр – классическая музыка, то в произведении указываются требования к голосам исполнителей. Имеется также список записей произведений. Для каждой записи указываются – произведение, список исполнителей, дата исполнения. Программа должна загружать справочник с жесткого диска, править все его данные, сохранять на диск. В процессе работы пользователь программы должен иметь возможность просмотра, как минимум, следующих параметров:

  • Список певцов с возможностью сортировки по фамилии, дате рождения, полу, голосу, количеству произведений, в исполнении которых он участвовал.

  • Список композиторов с возможностью сортировки по фамилии, дате рождения, полу, жанру произведений, наименованию произведений.

  • Список записей заданного жанра с сортировкой по наименованию, дате создания, последней дате записи. Должна быть реализована возможность отбора записей, которые исполнял заданный певец или в списках авторов имеется заданные поэт и/или композитор.

  • Список произведений популярной или классической музыки с возможностью сортировки по дате создания или жанру.

      1. Склад

Разработать программу для имитации движения товаров, хранящихся на складе. Каждый вид товара характеризуется наименованием и базовую единицу измерения. На складе могут быть товары только следующих типов – краски, разбавители, гвозди. Краски характеризуются цветом. Кроме того, краски делятся на масляные и нитроэмали. Нитроэмали характеризуются тем, что имеют список разбавителей, которыми их можно разбавлять. Гвозди определяются их размером. Имеется также список единиц измерения и всевозможные коэффициенты перевода из одной единицы в другую. Партия товара характеризуются датами запроса, поступления или выдачи, товаром, единицей измерения и количеством. Поступление и выдача партий осуществляется случайным образом. Поступление наступает на следующий день после запроса, выдача осуществляется немедленно при наличии товара. При отсутствии товара выдача задерживается до поступления товара или истечении срока ожидания, после чего заявка на выдачу отменяется. Программа должна загружать файл с состоянием склада с жесткого диска и в паузе или по окончании процесса имитации сохранять файл на диск.

Процесс имитации может быть остановлен пользователем программы для просмотра параметров:


  • Список всех товаров на складе с указанием их количества и единиц измерения. У всех товаров, единица измерения которых приводится к базовой, количество должно быть выведено в базовых единицах измерения. Список может быть отсортирован по наименованию товаров, по типам товаров

  • Количество краски заданного цвета, в том числе с разбивкой на масляные и нитроэмали.

  • Список цветов красок, имеющихся на складе, в том числе с разбивкой на масляные и нитроэмали.

  • Список нитроэмалей, для которых на складе есть нужные разбавители.

  • Список разбавителей, которые не используются в красках, находящихся на складе.

  • Количество гвоздей нужного размера.

      1. Городской транспорт

Разработать программу, имитирующую движение городского транспорта. Время процесса дискретно. В целях упрощения предполагается, что улицы города пересекаются под прямыми углами. Транспортные средства различных моделей двигаются с различными скоростями, меняя направление движения на перекрестках случайным образом. Любое транспортное средство имеет следующие характеристики – максимальную скорость, уровень загрязнения (г/м, считается, что за один шаг по времени загрязнение полностью разлагается), уровень шума (в децибелах), обратно пропорциональный расстоянию до транспортного средства (считается, что шум распространяется только вдоль проезжей части). Транспортные средства могут иметь внутренний или внешний (например, троллейбусы) источник энергии. Все транспортные средства делятся на пассажирские и грузовые. Пассажирские средства имеют максимальное количество пассажирских мест, грузовые – максимальный вес перевозимого груза. Транспортное средство может производить обгон, если оно имеет внутренний источник энергии, иначе оно должно двигаться со скоростью впереди идущей машины. Машины могут случайным образом покидать город, а также въезжать в город. Количество пассажиров, вес груза и начальная скорость задается случайно, так чтобы они не превышали свои максимальные значения. На каждом шаге по времени пользователь может вывести следующую информацию:

  • Состояние любого транспортного средства;

  • уровень шума в каждой точке проезжей части;

  • уровень загрязнения в каждой точке проезжей части;

  • количество пассажиров на любой улице;

  • вес перевозимого груза на любой улице;

  • количество пассажирских транспортных средств;

  • количество грузовых транспортных средств;

  • количество транспортных средств, не загрязняющих окружающую среду.


      1. Отдел кадров в университете

Разработать программу, реализующую справочник сотрудника отдела кадров. Университет состоит из факультетов, факультеты имеют в своем составе кафедры и студенческие группы. На каждой кафедра есть заведующий кафедрой. Некоторые кафедры являются профилирующими. Каждая группа имеет студента - старосту и профилирующую кафедру. Будем полагать, что в университете все люди являются преподавателями и/или студентами. Сведения о каждом человеке должны содержать – фамилия, имя, отчество, пол, паспортные данные, место проживания, государство и субъект РФ (для иностранных граждан «За пределами Российской Федерации»). Для студентов дополнительно должна быть информация о родителях, направлении подготовки и группе. Для преподавателей дополнительно должна быть информация о кафедре, должности и ученого звания. Предусмотреть возможную ситуацию, когда один и тот же человек может быть одновременно студентом, родителем и преподавателем. Один родитель может иметь несколько детей-студентов. Программа должна загружать справочник с жесткого диска, править все его данные, сохранять на диск. В процессе работы пользователь программы должен иметь возможность просмотра, как минимум, следующих параметров: