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

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

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

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

Добавлен: 21.10.2018

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

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

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

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ



Лабораторная работа №12.


Тема: Разработка классов.

Задание: Разработать и реализовать классы, которые являются основными в задании. Для сдачи лабораторной работы необходимо создать проект, в котором демонстрируется работа объектов созданных классов, а так же создать отчет по выполнению курсового проекта, в котором будут описаны классы и продемонстрирована работа программы. Должны быть продемонстрированы выполнение конструктора, всех доступных методов и деструктора.

Контрольные вопросы:

  1. Дайте определение класса.

  2. Дайте определение объекта.

  3. Что понимается под состоянием и поведением объекта, как они представляются в классе?

  4. Объясните достоинства и недостатки языков С++ и C#?

  5. Поясните понятие инкапсуляция.

  6. Поясните понятие наследование.

  7. Поясните понятие полиморфизм

  8. Что такое пространство имён?

  9. Какие существуют особенности при передаче значений параметров в функциях языка C#?

  10. Охарактеризуйте каждый тип доступа к данным и функциям класса.

Литература:

  1. Марченко А. Л. C#. Введение в программирование - учебное пособие, МГУ, 2005 (L:\TASKS\BOOKS\C#\).

  2. Герберт Шилдт - C# Учебный Курс - учебное пособие, Санкт-Петербург, 2003(L:\TASKS\BOOKS\C#\).

  3. Информационный портал дистанционного образования каф ИСЭ www.lms.mvtom.ru

  4. ВИДЕО-курс по дисциплине «Инструментальные средства разработчика»

Выполнение работы

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


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

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

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

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

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

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

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

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


Запустите Microsoft Visual Studio 2008.

После запуска откроется стартовая страница – рисунок 1.

Рисунок 1 – Стартовая страница Microsoft Visual Studio 2008

Для создания нового проекта, выберете в меню File - пункт New, затем Project.

Рисунок 2 - Создание проекта с помощью меню

Так как вам необходимо создать проект, выберите Windows Forms Application. Также желательно изменить имя проекта.

Рисунок 3 – Создание проекта Windows Forms Application

Для удобства работы с Microsoft Visual Studio 2008 необходимо добавить некоторые окна, работа с которыми вам предстоит. Для этого в меню View выберите пункты Task List, TollBox (для закрепления этого окна нажмите второй значок из ) и Properties Window, а также Error List.

Новый проект создан. После создания проекта открывается вкладка с редактированием формы.


Рисунок 4 – Окно с редактированием формы

Если вам необходимо создать кнопки на форме, необходимо выбрать пункт Button и создать кнопку необходимого размера.

Рисунок 5 – Создание кнопки на форме

Для того, чтобы изменить текст, отображаемый на кнопке, изменить его в окне Properties, строка Text.

Рисунок 6 – Изменение текста, отображаемого на кнопке

После редактирования формы необходимо создать класс, который будет базовым для вашей программы. При определении класса объявляются данные, которые он содержит, и код, работающий с этими данными. Самые простые классы могут содержать только код или только данные, но в реальных программах классы включают обе эти составляющие. Данные содержатся в переменных экземпляра, которые определены классом, а код содержится в методах. При создании (определении) класса вначале указывается ключевое слово class.

Рисунок 7 – Добавление класса из окна Solution Explorer

Также это можно сделать, открыв меню Project:

Рисунок 8 – Добавление класса из меню Project


Затем нужно изменить имя класса.

Рисунок 9 – Изменение имени добавляемого класса

Откроется окно с кодом класса.

Рисунок 10 – Вкладка с кодом класса

Для редактирования класса удобно использовать диаграмму класса. Для ее создания необходимо открыть пункт View Class Diagram, щелкнув правой кнопкой мыши на названии класса.

Рисунок 11 – Создание диаграммы класса

Для добавления методов, полей или конструктор можно использовать два способа.

Первый – щелкнуть правой кнопкой мыши и выбрать пункт Add.

Рисунок 12 – Добавление методов, полей и конструкторов

Второй – в окне Class Details. Для открытия этого окна необходимо щелкнуть правой кнопкой мыши по блоку класса и выбрать пункт Class Details.

Рисунок 13 – Добавление методов, полей и конструкторов с помощью Class Details






В соответствии с заданием создадим класс TVehicle с полями:

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

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

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

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

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

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

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

Street; // улица

и методами:

TVehicle // конструктор

Type //тип т/c

CanObgon//возможность обгона


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

Рисунок 14 – Окно Class Details после редактирования класса


Методы и поля, записанные в Class Details, будут отображены и в диаграмме класса. Также они будут оформлены и в коде класса.

Рисунок 15 – Диаграмма класса после его редактирования



Класс TVehicle (базовый класс для всего транспорта)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace CityTransport

{

public class TVehicle

{

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

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

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

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

protected int Speed;//скорость

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

protected TStreet Street;//улица


protected Random rnd = new Random();


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

{

}

//методы класса

public int Type () {}// тип т/c

public bool CanObgon() {} // возможность обгона

}

}


НАСЛЕДОВАНИЕ – свойство, с помощью которого один объект может приобретать свойства другого. Без использования наследования каждый объект должен явно определять все свои характеристики. Использую наследование, объект должен определить только те качества, которые делают его уникальным в пределах своего класса.

Для создания классов наследников необходимо создать новые классы и в коде указать родительский класс, например,

public class TCivilTransport: TVehicle

На диаграмме класс-наследник отобразится после выбора пункта Show Derived Classes.

Рисунок 16 – Отображение классов-наследников

Редактируются классы-наследники аналогично. Однако могут возникнуть проблемы с объявлением конструктора, если в базовом классе он имеет свои параметры. Для решения этой задачи можно в базовом классе объявить еще один конструктор, но уже без параметров. Тогда у классов-наследников могут быть свои конструкторы со своими параметрами.



Класс TCivilTransport (Пассажирский транспорт)

Поля:

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

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


Методы:

TCivilTransport//конструктор класса

GetPeopleCount ()//возвращает кол-во пассажиров

Type() //возвращает тип т/с


Рисунок 17 – Диаграмма класса TCivilTransport

using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class TCivilTransport: TVehicle // наследуемый класс от TVehicle

{

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

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

public TCivilTransport(int aMaxPeopleCount)//конструктор класса TCivilTransport

{

MaxPeopleCount = aMaxPeopleCount;

PeopleCount = rnd.Next(1, MaxPeopleCount);//кол-во пассажиров равно случайному числу от 1 до кол-ва пассажирских мест


}

//методы класса

public string GetPeopleCount ()//возвращает кол-во пассажиров


public int Type() //возвращает тип т/с

}

}


Аналогично создадим наследуемый класс TLorryTransport и определим его методы и поля.


Класс TLorryTransport (Грузовой транспорт)


Поля:

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

GruzMassa; // переменная масса груза


Методы:

TLorryTransport(int aMaxGruzMassa)//конструктор класса TLorryTransport

GetGruzMassa ()//возвращает массу груза

Type()//возвращает тип т/с


Рисунок 18 – Диаграмма класса TLorryTransport



using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

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

{

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

private int GruzMassa; // переменная масса груза


public TLorryTransport(int aMaxGruzMassa)//конструктор класса TLorryTransport

{

MaxGruzMassa = aMaxGruzMassa;

GruzMassa = rnd.Next(1, MaxGruzMassa);//масса перевозимого груза равна случайному числу от 1 до грузоподъемности

}

//методы класса

public string GetGruzMassa ()//возвращает массу груза


public override int Type()//возвращает тип т/с

}


Создадим еще один класс TStreet (Улицы)

Рисунок 19 – Диаграмма класса TSreet


Класс TStreet (Улицы)


using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{



public class TStreet

{

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

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

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


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

{

Name = aName;

X1 = aX; Y1 = aY;

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

{

Type = 2;

X2 = 500; Y2 = Y1;

}

else // улица

{

Type = 1;

X2 = X1; Y2 = 400;


}

}

// методы класса

public double NoiseLevel(int L) // уровень шума

{

return 0;

}

public double PolutionLevel(int L) // уровень загрязнения

{

return 0;

}

public int GetVehicleCountOnStreet(int aVehicleType) // кол-во т/с на улице

{

return 0;

}



}

}


После редактирования классов, создания новых классов, не связанных с базовым, диаграмма может выглядеть следующим образом:

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


Двойной щелчок по блоку класса переведет вас во вкладку с кодом программы этого класса.


После разработки базового класса TVehicle, производных классов TCityTransport, TlorryTransport реализуем их, добавив в базовый класс виртуальные методы.


Класс TVehicle


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace CityTransport

{

public class TVehicle

{

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

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

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

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

protected int Speed;//скорость

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

protected TStreet Street;//улица


protected Random rnd = new Random();


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

{

EnergySource = rnd.Next(0, 2);//источник энергии - случайным образом выбирается 0 или 1

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

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


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

PolutionLevel = 0;

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



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

}



public virtual int Type () //виртуальный метод Type в базовом классе

{

return 0;

}


public bool CanObgon()// возможность обгона

{

return true;

}

}

}



Класс TCivilTransport


using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

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

{

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

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

public TCivilTransport(int aMaxPeopleCount)

{

MaxPeopleCount = aMaxPeopleCount;

PeopleCount = rnd.Next(1, MaxPeopleCount);

}


public string GetPeopleCount ()

{

string res;

res = PeopleCount.ToString("F0");

return res;

}


public override int Type()/*виртуальный метод, переопределенный в наследуемом классе*/

{

return 1; // пассажирские т/с

}

}

}


Класс TLorryTransport



using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

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

{

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

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


public TLorryTransport(int aMaxGruzMassa)

{

MaxGruzMassa = aMaxGruzMassa;

GruzMassa = rnd.Next(1, MaxGruzMassa);

}


public string GetGruzMassa ()

{

string res;

res = GruzMassa.ToString("F0");

return res;

}


public override int Type()/*виртуальный метод, переопределенный в наследуемом классе*/

{

return 2; // грузовое транспортное средство

}

}

}



Также в программу были добавлены новые классы для дальнейшей работы с программой.


Класс Init

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


using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class Init

{

static public TCivilTransport[] CivilTransportArray = new TCivilTransport[20]; //массив пассажирских средств

static public TLorryTransport[] LorryTransportArray = new TLorryTransport[20]; //массив грузовых средств

static public TStreet[] StreetArray = new TStreet[4]; //массив улиц

static public TStreet[] ProspektArray = new TStreet[3]; //массив проспектов


public List<TVehicle> VehicleMassiv = new List<TVehicle>(); //Представляет строго типизированный список объектов, доступных по индексу.



int i;

public Random rnd = new Random();

public void FillTransportArray()//Заполнение массивов пассажирского и грузового транспорта

{

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

{

CivilTransportArray[i] = new TCivilTransport(rnd.Next(1, 40));

LorryTransportArray[i] = new TLorryTransport(rnd.Next(1, 20));

}

}


public void FillStreetArray()//Заполнение массивов улиц и проспектов

{

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

StreetArray[i] = new TStreet("Улица-"+(i+1), (i+1)*100, 0);

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

ProspektArray[i] = new TStreet("Проспект-" + (i + 1), 0, (i + 1) * 100);

}

}

}



Класс CityMovement


//класс для реализации движения транспортных средств


using System;

using System.Collections.Generic;

using System.Text;


namespace CityTransport

{

public class CityMovement: Init

{

int i;

private int VehicleCount;


public int GetVehicleCount ()

{

VehicleCount = 0;

VehicleCount = VehicleCount + CivilTransportArray.GetLength(0) + LorryTransportArray.GetLength(0);