• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Создание Класса Методом Getdescription ()

  • Автор темы Tiina
  • Дата начала
T

Tiina

Уважаемые форумчане,
Помогите девушке написать программу.
Условия:

У нас есть три вида транспортных средств: автомобили, тракторы и мопеды. У каждого типа есть свои номер (1=CAR, 2=TRACTOR, 3=MOPED, ...). Создать иерархию классов, в которой представлено каждое транспортное средство.

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

Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей.

Создайте класс в котором статическим методом можно создавать предварительно обозначенный тип транспортного средства. Класс следит шаблоном завода (Factory Pattern, Factory Method Pattern)

Пример класса:

class ShapeFactory {
public:
static Shape *create(int type) {
switch (type) {
case CIRCLE:
return new Circle;

case TRIANGLE:
return new Triangle;

...

default:
return NULL;
}
}

Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).

В стране, где транспортные средства производятся, имеется автомобильный налог. Создайте метод для расчета налога, если известно, что он состоит из платы "выбросов" и "дорожного налога":

а) каждый цилиндр должен нести 15 единиц загрязнения.
b') владельцы мопедов освобождаются от уплаты за "выбросы".
в) если у транспортного средства более чем 2 колеса, то за каждое следующее колесо должны платить 7 единиц дорожного налога.
c) для тракторов дорожный налог в два раза больше.

В тестовой программе создать vector из 33 автомобилей и рассчитать общее налоговое бремя. Допустим, что при этом типы транспортных средств разные.

Классы разместить в модулях. В программе не должны быть "видемых" классов Car, Tractor, Engine и так далее. Иерархия классов в базовом классе (транспортное средство) должен быть виден. Создание модулей обязателен.

d) фабричный метод не должен возвращать НУЛЛ значение (как в примере класса ShapeFactory). Когда завод получает параметр неизвестного типа, кодировать дефектный ответ специальным классом, при котором методы не должны ничего делать (Null Pattern Object).
е) элементы автомобиля, чтобы быть "элегантной", то есть. Например, должно быть легко создать. 6-цилиндровый двигатель или трехколесные мопеды - или транспортные средства у которых плата "выбросов" и "дорожный налог" разные в зависимости от задачи.
f) обеспечить возможность в дополнение к отечественному производству автомобилей -Китайский завод. Китайский завод для получения налоговых скидок производят трехколесный трактор и двухцилиндровые автомобили.
h) при создании транспортного средства, необходимо сначала найти подходящий завод (отечественные заводы, китайские заводы), а затем каждый завод отвечает за создание корректного автомобиля. Используйте абстрактный шаблон завода (Factory Pattern, Factory Method Pattern).
 
T

Tiina

В чем проблема? Всегда рады:)
Привет lazybiz,
1) Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей. - Правильно ли я сделала? Или надо как-нибудь через "Private" для каждого класса отдельно?
2) Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).-Что-то я ничего не нашла по поводу "ShapeFactory", поэтому сделала просто через Factory или они имеют ввиду создание общего класса "Shape"- Посоветуй как нужно сделать.
У меня код пока такой:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <conio.h>

using namespace std;

class Vehicle{
public:
int type;
virtual void getDescription()=0;
};

class Car:
public Vehicle{
public:
void getDescription()
{cout << "Car: 4-wheels and 4-cylinder engine" << endl;};
public:
Car()
{type=1;};
};

class Tractor:
public Vehicle{
void getDescription()
{cout << "Tractor: 4-wheels and 4-cylinder engine" << endl;};
public:
Tractor()
{type=2;};
};

class Moped:
public Vehicle{
void getDescription()
{cout << "Moped: 2-wheels and 1-cylinder engine" << endl;};
public:
Moped()
{type=3;}
};

class Factory{
public:
static Vehicle * create(int type) {
static Car *CarInstance;
static Tractor *TractorInstance;
static Moped *MopedInstance;
switch (type) {
case 1:
CarInstance=new Car();
return CarInstance;
case 2:
TractorInstance=new Tractor();
return TractorInstance;
case 3:
MopedInstance=new Moped();
return MopedInstance;
default:
return 0;
}
}
};

int main(){
vector<Vehicle*> pccomponents;
pccomponents.push_back(Factory::create(1));
pccomponents.push_back(Factory::create(2));
pccomponents.push_back(Factory::create(3));

for(int i = 0; i<3; i++)
pccomponents->getDescription();

getch();
}
C++:

Добавлено:
В чем проблема? Всегда рады;)
Привет lazybiz,
1) Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей. - Правильно ли я сделала? Или надо как-нибудь через "Private" для каждого класса отдельно?
2) Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).-Что-то я ничего не нашла по поводу "ShapeFactory", поэтому сделала просто через Factory или они имеют ввиду создание общего класса "Shape"- Посоветуй как нужно сделать.
У меня код пока такой:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <conio.h>

using namespace std;

class Vehicle{
public:
int type;
virtual void getDescription()=0;
};

class Car:
public Vehicle{
public:
void getDescription()
{cout << "Car: 4-wheels and 4-cylinder engine" << endl;};
public:
Car()
{type=1;};
};

class Tractor:
public Vehicle{
void getDescription()
{cout << "Tractor: 4-wheels and 4-cylinder engine" << endl;};
public:
Tractor()
{type=2;};
};

class Moped:
public Vehicle{
void getDescription()
{cout << "Moped: 2-wheels and 1-cylinder engine" << endl;};
public:
Moped()
{type=3;}
};

class Factory{
public:
static Vehicle * create(int type) {
static Car *CarInstance;
static Tractor *TractorInstance;
static Moped *MopedInstance;
switch (type) {
case 1:
CarInstance=new Car();
return CarInstance;
case 2:
TractorInstance=new Tractor();
return TractorInstance;
case 3:
MopedInstance=new Moped();
return MopedInstance;
default:
return 0;
}
}
};

int main(){
vector<Vehicle*> pccomponents;
pccomponents.push_back(Factory::create(1));
pccomponents.push_back(Factory::create(2));
pccomponents.push_back(Factory::create(3));

for(int i = 0; i<3; i++)
pccomponents->getDescription();

getch();
}
C++:
 
L

lazybiz

Что не получается? В двух словах, а не тремя абзацами.
Задание пересказывать не надо, просто объясни что у тебя не получается.
 
T

Tiina

Что не получается? В двух словах, а не тремя абзацами.
Задание пересказывать не надо, просто объясни что у тебя не получается.
Я не уверена, что я правильно создала "компоненты" транспортных средств и как мне использавать пример с Shape?
 
I

igrok

f) обеспечить возможность в дополнение к отечественному производству автомобилей -Китайский завод. Китайский завод для получения налоговых скидок производят трехколесный трактор и двухцилиндровые автомобили.
h) при создании транспортного средства, необходимо сначала найти подходящий завод (отечественные заводы, китайские заводы), а затем каждый завод отвечает за создание корректного автомобиля. Используйте абстрактный шаблон завода (Factory Pattern, Factory Method Pattern).

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

C++:
class Vehicle {
protected:
int engine, wheels, pollut_rate, whl_tax_rate, vehicle_tax;
public:
Vehicle(int engn=1, int whls=2, int pltn_rt=0, int whl_tx_rt=0);
virtual void GetDescription() = 0;
virtual int GetPollutTax() = 0;
int GetVehicleTax();
int GetTax();
};

class Car: public Vehicle {
public:
Car(int engn=CAR_TRAC_ENGN, int whls=CAR_TRAC_WHLS, int pltn_rt=CYL_POL_RATE, int whl_tx_rt=WHEEL_TAX_RATE);
void GetDescription();
int GetPollutTax();
};

class Tractor: public Vehicle {
public:
Tractor(int engn=CAR_TRAC_ENGN, int whls=CAR_TRAC_WHLS, int pltn_rt=CYL_POL_RATE, int whl_tx_rt=WHEEL_TAX_RATE);
void GetDescription();
int GetPollutTax();
};

class Moped: public Vehicle {
public:
Moped(int engn=MOPED_ENGN, int whls=MOPED_WHLS, int pltn_rt=MPD_POL_RATE, int whl_tx_rt=0);
void GetDescription();
int GetPollutTax();
};

//NullVehicle is a vehicle whose type is neither a Car, nor a Tractor, nor a Moped
//Methods don't do anything
class NullVehicle: public Vehicle {
public:
void GetDescription();
int GetPollutTax();
};

class VehicleFactory {
public:
// CreateVehicle makes vehicles, such as cars, tractors, mopeds and underfined vehicles.
// parameter type means the type of the vehicle. 1 for a Car, 2 for a Tractor, 3 for a Moped, all the rest for an Underfined Vehicle
// parameter engn means the number of cylinders in the vehicle
// parameter whls stands for the number of wheels
// parameter pltn_rt is a pollution rate. 15 for cars and tractors and 0 for mopeds.
// parameter whl_tx_rt is a tax rate for the number of wheels. 0 for 2 wheels's vehicle and changes depending on the vehicle type
// parameter stnd_vhcl equals 1 when we create a standard vehicle, for instance, a car with 4 cylinders and 4 wheels
// parameter stnd_vhcl equals 0 when we create a vehicle, for instance, a car with 6 cylinders and/or 3 wheels
virtual Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=1)=0;
virtual void GetFactoryDescr() = 0;
};

//Chinese factory produces 2 cylinders' cars and 3 wheels' tractors
//Assuming that it doesn't make standard cars and tractors
class ChineseVF : public VehicleFactory {
public:
Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=0) {
switch(type) {
case TYPE_CAR: 
return new Car(CHN_CAR_ENGN,whls,pltn_rt,whl_tx_rt);
case TYPE_TRACTOR:
return new Tractor(engn,CHN_TRCT_WHL,pltn_rt,whl_tx_rt);
case TYPE_MOPED:
return new Moped; 
default: return new NullVehicle; 
}
}
void GetFactoryDescr() { cout<<"Using Chinese Factory."<<endl; }
};

//Home factory produces both standard and non-standard vehicles
class HomeVF : public VehicleFactory {
public: 
Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=1) {
switch(type) {
case TYPE_CAR: 
if (stnd_vhcl) return new Car;
return new Car(engn,whls,pltn_rt,whl_tx_rt);
case TYPE_TRACTOR:
if (stnd_vhcl) return new Tractor; 
return new Tractor(engn,whls,pltn_rt,whl_tx_rt);
case TYPE_MOPED:
if (stnd_vhcl) return new Moped; 
return new Moped(engn,whls,pltn_rt,whl_tx_rt);
default: return new NullVehicle; 
}
}
void GetFactoryDescr() { cout<<"Using Home Factory."<<endl; }
};


//Creating a vector of vehicles and calculate their total tax
int _tmain(int argc, _TCHAR* argv[])
{
const size_t count = 2;

vector<Vehicle *> v(VECTOR_LEN);
VehicleFactory* vf[count] = { new ChineseVF(), new HomeVF() };

int tax_sum;
unsigned int i,j;

tax_sum=0;

for(i=0;i<v.size();i++) {
j=rand()%2;
v[i] = vf[j]->CreateVehicle(rand()%5,rand()%6+1,rand()%4,CYL_POL_RATE,WHEEL_TAX_RATE,rand()%2);
vf[j]->GetFactoryDescr();
v[i]->GetDescription();

tax_sum=tax_sum+v[i]->GetTax();
cout<<"------------------------------"<<endl;
} 

cout<<"The Total Tax is "<<tax_sum<<"."<<endl;

for(i=0;i<v.size();i++) delete v[i];

for (i = 0; i < count; i++) delete vf[i];

return 0;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!