Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Добавление транспортного средства

Поиск

Функция Main::AddVehicle() функция реализует добавление нового транспортного средства.

Блок-схема изображена на рисунке 4.2.

Рис. 4.2. – Алгоритм добавления транспортного средства

 


Удаление транспортного средства

Функция Main::DeleteVehicle() удаляет транспортное средство по указанному индексу.

Блок-схема изображена на рисунке 4.3.

Рис. 4.3. – Алгоритм удаления транспортного средства

Вывод значений специфических характеристик

 

Транспортные средства с наибольшей характеристикой

Функция Main::outputMaxSpecial() выводит на экран те транспортные средства, у которых значение специфической характеристики наибольшее среди своих классов.

Блок-схема изображена на рисунке 4.4.1.

Рис. 4.4.1 – Алгоритм вывода транспортных средств с наибольшей характеристикой.

Транспортные средства с наименьшей характеристикой

Функция Main::outputMinSpecial() выводит на экран те транспортные средства, у которых значение специфической характеристики наименьшее среди своих классов.

Блок-схема изображена на рисунке 4.4.2.

Рис. 4.4.2 – Алгоритм вывода транспортных средств с наименьшей характеристикой.

Транспортные средства с наибольшей ценой

Функция Main::outputMaxPrice() выводит на экран то транспортное средство, у которого наибольшая стоимость.

Блок-схема изображена на рисунке 4.5.

Рис. 4.5. – Алгоритм вывода транспортного средства с максимальной ценой

Транспортные средства с наименьшей ценой

Функция Main::outputMinPrice() выводит на экран то транспортное средство, у которого наименьшая стоимость.

Блок-схема изображена на рисунке 4.6.

Рис. 4.6. – Алгоритм вывода транспортного средства с минимальной ценой

Транспортные средства с наибольшей скоростью

Функция Main::outputMaxSpeed() выводит на экран то транспортное средство, у которого наибольшая скорость.

Блок-схема изображена на рисунке 4.7.

Рис. 4.7. – Алгоритм вывода транспортного средства с максимальной скоростью

Транспортные средства с наименьшей скоростью

Функция Main::outputMinSpeed() выводит на экран то транспортное средство, у которого наибольшая скорость.

Блок-схема изображена на рисунке 4.8.

Рис. 4.8. – Алгоритм вывода транспортного средства с минимальной скоростью

Выводы: в результате выполнения этапа описания были пошагово разобраны и проанализированы все алгоритмы функций главной программы, а именно алгоритмы функций добавления и удаления транспортного средства, а так же вывод транспортного средства на экран отвечающего определенной характеристике.


 

ТЕСТИРОВАНИЕ

Тестирование взаимодействия классов

 

План тестирование 2-го этапа

1. Написание кода

2. Тестирование

3. Описание теста

4. Анализ полученных результатов

5. Результаты тестирования

6. Вывод

5.1.1 Тесты

 

Тест_1

 

Код:

Описание:

В данном тесте я тестирую взаимодействие классов Main и Car, а именно добавляет машину в гараж.

 

Результат:

 

Ожидалось – 1

Получили – 1

Вывод: тест пройден, программа работает корректно.

 

Тест_2

 

Код:

Описание:

В данном тесте я тестирую взаимодействие классов Main и Bicycle, а именно добавляет мотоцикл в гараж.

Результат:

 

Ожидалось – 1

Получили – 1

Вывод: тест пройден, программа работает корректно.

 

 

Тест_3

 

Код:

Описание:

В данном тесте я тестирую взаимодействие классов Main и Lorry, а

именно - добавляет грузовик в гараж.

Результат:

 

Ожидалось – 1

Получили – 1

Вывод:

Тест пройден, программа работает корректно.

 

Тестирование взаимодействия классов в составе динамической

Коллекции

 

План тестирование 3-го этапа

1. Написание кода

2. Тестирование

3. Описание теста

4. Анализ полученных результатов

5. Результаты тестирования

6. Вывод

 

 

Тест_1

 

Код:

Описание:

В данном тесте я тестирую взаимодействие классов Garage

( динам. коллекция ) и Main, а именно - показываю содержимое гаража.

Результат:

 

Ожидалось – 1

Получили – 1

Вывод: тест пройден, программа работает корректно.

5.3 Тестирование всех задач заданных по варианту

 

 

Тест_1

 

Код:

Описание:

В данном тесте я проверяю работу выхода с программы.

Результат:

 

Ожидалось – 0

Получили – 0

Вывод: тест пройден, программа работает корректно.

Тест_2

 

Код:

Описание:

В данном тесте я проверяю на корректность вывод макс. и мин. цены транспорта.

Результат:

 

Ожидалось – 6

Получили – 6

Вывод: тест пройден, программа работает корректно.

Тест_3

 

Код:

Описание:

В данном тесте я проверяю на корректность вывод макс. и мин. скорости транспорта.

 

Результат:

 

Ожидалось – 7

Получили – 7

Вывод: тест пройден, программа работает корректно.

 

Тест_4

 

Код:

Описание:

В данном тесте я проверяю программу на удаление транспорта.

Результат:

 

Ожидалось – 2

Получили – 2

Вывод: тест пройден, программа работает корректно.

 

Тест_5

 

Код:

Описание:

В данном тесте я проверяю программу на возможность добавления характеристик транспорту.

Результат:

 

Ожидалось – 1

Получили – 1

Вывод: тест пройден, программа работает корректно.

 

Тест_6

 

Код:

Описание:

В данном тесте я проверяю программу на возможность записи в файл.

Результат:

 

Ожидалось – 0

Получили – 0

Вывод: тест пройден, программа работает корректно.

 

Usability тестирование

 

1. Цель

- Проверить интерфейс на удобство пользования.

2. Время и место

- Время – не имеет значения, место – в домашних условиях.

3. Продолжительность

- Час

4. Необходимое оборудование и софт

- Необходимо только наличие ПК, Visual Studio 2010-2013 и самой программы курсового

5. Дополнительные настройки оборудования и софта (начальные экраны, время реакции)

- Отсутствуют

6. Ответственный за проведение тестирования

- Тестировщик Карпинский С.И.

7. Количество и состав участников и где их взять

- 3 человека, между собой не знакомы, добровольцы с ВУЗа

8. Количество и состав заданий

- 5 заданий:

· 1 задание – добавить в гараж транспорт (любой)

· 2 задание – удалить из гаража транспорт (любой)

· 3 задание – показать максимальную скорость (любой транспорт)

· 4 задание – показать гараж

· 5 задание – показать минимальные характеристики

 

9. Возможность использования вспомогательных материалов для выполнения заданий

- Запрещено

 

10. Признаки успешного и ошибочного выполнения заданий

- Время, затраченное на выполнения 1 задания, если t>1 мин., то задание считается проваленным, иначе – выполненным.

- Время, затраченное на выполнения 2 задания, если t>20 сек., то задание считается проваленным, иначе – выполненным.

- Время, затраченное на выполнения 3 задания, если t>20 сек., то задание считается проваленным, иначе – выполненным.

- Время, затраченное на выполнения 4 задания, если t>20 сек., то задание считается проваленным, иначе – выполненным.

- Время, затраченное на выполнения 5 задания, если t>20 сек., то задание считается проваленным, иначе – выполненным.

Если среднее время, затраченное на выполнение 5-и заданий, будет меньше 15 сек. то считается, что тест пройден.

11. Степень допустимого участия (подсказок) со стороны проводящего тестирование

- Одна или две подсказки, не более

12. Анализ полученных данных будем проводить по таблице результатов (рис.5.1).

 

Проведение тестирования

 

№ участника 1 задание 2 задание 3 задание 4 задание 5 задание Среднее затраченное время
  30 сек. 10 сек. 15 сек. 5 сек. 5 сек. 13 сек.
  40 сек. 13 сек. 10 сек. 7 сек. 8 сек. 15,6 сек.
  25 сек. 12 сек. 11 сек. 5 сек. 6 сек. 11,8 сек.

 

Рис. 5.1 Таблица результатов Usability тестирование

 

Вывод: Как мы видим, в 2-х случаях из 3-х время, затраченное на выполнение всех заданий, лежит в приделах нормы, а это значит, что интерфейс сделан удобно для пользования.

 

ВЫВОД

 

В ходе курсового проекта была разработана программа на языке программирования С++, в котором реализуется динамический полиморфизм на примере роботы с транспортными средствами.

В программе реализовано:

- массив из объектов абстрактного класса;

- добавление и удаление транспортного средства;

- минимальное и максимальное значение специфического поля;

- максимальную и минимальную скорость передвижения;

- максимальную и минимальную цену транспортного средства;

 

Был создан проект автоматического тестирования UnitTest1, который тестирует программу на корректность работы функций.

При тестировании ошибок не обнаружено.


 

ПРИЛОЖЕНИЕ А. ЛИСТИНГИ ИСХОДНЫХ КОДОВ

Bicycle.h

#pragma once

#include "Vehicle.h"

#include "Convert.h"

#include "Constant.h"

#include <iostream>

class Bicycle: public Vehicle

{

// специальное свойство: количество колес //

int wheelNumber;

public:

Bicycle(void);

virtual ~Bicycle(void);

int outputWheelNumber(void);

bool inputWheelNumber(int value);

virtual string getClass(void);

virtual string toString(void);

};

 

 

Car.h

#pragma once

#include "Vehicle.h"

#include "Convert.h"

#include "Constant.h"

class Car: public Vehicle

{

//специальное свойство: количество лошадиных сил //

double horsepower;

public:

Car(void);

virtual ~Car(void);

double outputHorsepower(void);

bool inputHorsepower(double value);

virtual string getClass(void);

virtual string toString(void);

};

 

Constant.h

#pragma once

//для задания начальных значений для объектов car и lorry //

#define NOT_SET_NUM -1

// если не введено -1 = not set //

static const char* NOT_SET_CHAR = "not_set";

// при чтении из файла возникла ошибка //

static const char* FILE_FORMAT_EXCEPTION = "wrong file format";

Convert.h

#pragma once

#include <string>

#include <vector>

class Convert

{

public:

// перевод из double в string //

static std::string toString(double value);

// из int в string //

static std::string toString(int value);

// чтобы разбить строку - массив слов: ' ' //

// vector - массив слов //

static std::vector<std::string> Convert::splitByGraps(std::string text);

// перевод строки в double //

static double toDouble(std::string value);

// перевод строки в int //

static int toInt(std::string value);

};

 

Garage.h

#pragma once

#include <vector>

#include "Convert.h"

#include "Lorry.h"

#include "Bicycle.h"

#include "Car.h"

// массив из объектов vehicle (car, lorry, bicycle) //

// vector - стандартный класс библиотеки stl //

// наследуется от vector указателей на объекты vehicle //

class Garage: public vector<Vehicle*>

{

public:

Garage(void);

~Garage(void);

string toString(void);

Lorry* outputMinCapacity(void);

Lorry* outputMaxCapacity(void);

Car* outputMinHorsepower(void);

Car* outputMaxHorsepower(void);

Bicycle* outputMinWheelsCount(void);

Bicycle* outputMaxWheelsCount(void);

Vehicle* outputMinSpeed(char *vechicleName);

Vehicle* outputMaxSpeed(char *vechicleName);

Vehicle* outputMinPrice(char *vechicleName);

Vehicle* outputMaxPrice(char *vechicleName);

Vehicle* outputMinSpeed(void);

Vehicle* outputMaxSpeed(void);

Vehicle* outputMinPrice(void);

Vehicle* outputMaxPrice(void);

};

 

Lorry.h

#pragma once

#include "Vehicle.h"

#include "Convert.h"

#include "Constant.h"

// наследование от базового класса vehicle //

class Lorry: public Vehicle

{

// грузоподъемность грузового автомобиля //

int capacity;

public:

Lorry(void);

virtual ~Lorry(void);

int outputCapacity(void);

bool inputCapacity(int value);

virtual string getClass(void);

virtual string toString(void);

};

Main.h

#pragma once

#include "Vehicle.h"

#include "Garage.h"

#include "Constant.h"

#include <iostream>

#include <conio.h>

using namespace std;

// основной класс - содержит объект класса "гараж" //

class Main

{

// указатель на массив //

// Garage - класс //

// *garage - указатель на "гараж" //

 

Garage *garage;

public:

Main(void);

~Main(void);

void AddVehicle(void);

void DeleteVehicle(void);

void outputMaxSpecial(void);

void outputMinSpecial(void);

void outputMaxPrice();

void outputMinPrice();

void outputMaxSpeed();

void outputMinSpeed();

Garage *GetGarage(void);

void WriteToFile(void);

void ReadFromFile(void);

bool bin(fstream &file);

unsigned int length(fstream &file);

unsigned int capacity(fstream &file);

unsigned int max_size(fstream &file);

bool empty(fstream &file);

};

Vehicle.h

#pragma once

#include <string>

#include <ostream>

#include <sstream>

#include "Constant.h"

#include <iostream>

// абстрактный класс, содержащий характеристики всех моделей //

// содержит функцию для коректного ввода данных //

// private - иначе мы нарушим ООП код //

using namespace std;

class Vehicle

{

string model;

string color;

double maxSpeed;

double price;

int year;

double weight;

public:

// output - вывод данных //

//input - ввод данных //

// Vehicle(void) - конструктор //

// ~Vehicle(void) - деструктор //

Vehicle(void);

virtual ~Vehicle(void);

// для всех классов (bicycle, car, lorry) //

string outputModel(void);

string outputColor(void);

double outputMaxSpeed(void);

double outputPrice(void);

int outputYear(void);

double outputWeight(void);

bool inputModel(string value);

bool inputColor(string value);

bool inputMaxSpeed(double value);

bool inputPrice(double value);

bool inputYear(int value);

bool inputWeight(double value);

// для абстракции необходимо объявить виртуальную функцию //

// getClass - название класса //

virtual string getClass(void) = 0;

// ввод string - представления //

virtual string toString(void) = 0;

};


 

Bicycle.cpp

#include "Bicycle.h"

using namespace std;

// задание количества колес велосипеда //

Bicycle::Bicycle(void)

{

wheelNumber = NOT_SET_NUM;

#ifdef _DEBUG

cout << "\nConstructor Bicycle\n";

#endif

}

Bicycle::~Bicycle(void)

{

#ifdef _DEBUG

cout << "\nDestructor Bicycle\n";

#endif

}

int Bicycle::outputWheelNumber(void)

{

return wheelNumber;

}

bool Bicycle::inputWheelNumber(int value)

{

if(value <= 0 || value > 6)

return false;

wheelNumber = value;

return true;

}

// вывод названия класса //

string Bicycle::getClass(void)

{

return "Bicycle";

}

// формирование строки вывода //

string Bicycle::toString(void)

{

string result;

result.append(getClass());

result.append(": название ");

result.append(outputModel());

result.append(", цвет ");

result.append(outputColor());

result.append(", максимальная скорость ");

result.append(Convert::toString(outputMaxSpeed()));

result.append(", цена ");

result.append(Convert::toString(outputPrice()));

result.append(", год ");

result.append(Convert::toString(outputYear()));

result.append(", вес ");

result.append(Convert::toString(outputWeight()));

result.append(", количество колес ");

result.append(Convert::toString(outputWheelNumber()));

return result;

}

 

Car.cpp

#include "Car.h"

using namespace std;

Car::Car(void)

{

horsepower = NOT_SET_NUM;

#ifdef _DEBUG

cout << "\nConstructor Car\n";

#endif

}

Car::~Car(void)

{

#ifdef _DEBUG

cout << "\nDestructor Car\n";

#endif

}

double Car::outputHorsepower(void)

{

return horsepower;

}

bool Car::inputHorsepower(double value)

{

if(value <= 0)

return false;

horsepower = value;

return true;

}

 

string Car::getClass(void)

{

return "Car";

}

string Car::toString(void)

{

string result;

result.append(getClass());

result.append(": название ");

result.append(outputModel());

result.append(", цвет ");

result.append(outputColor());

result.append(", максимальная скорость ");

result.append(Convert::toString(outputMaxSpeed()));

result.append(", цена ");

result.append(Convert::toString(outputPrice()));

result.append(", год ");

result.append(Convert::toString(outputYear()));

result.append(", вес ");

result.append(Convert::toString(outputWeight()));

result.append(", лошадиная сила ");

result.append(Convert::toString(outputHorsepower()));

return result;

}

 

Convert.cpp

#include "Convert.h"

#include <sstream>

#include "Constant.h"

// перевод в строку //

std::string Convert::toString(double value)

{

if(value == NOT_SET_NUM)

return NOT_SET_CHAR;

std::ostringstream strs;

// заносим в поток value //

strs << value;

// заносим в строку поток //

return strs.str();

}

std::string Convert::toString(int value)

{

if(value == NOT_SET_NUM)

return NOT_SET_CHAR;

std::ostringstream strs;

strs << value;

return strs.str();

}

// вводим текст и разбиваем на слова //

std::vector<std::string> Convert::splitByGraps(std::string text)

{

// tokens - массив слов //

std::vector<std::string> tokens;

// создание потока //

std::istringstream iss(text);

copy(std::istream_iterator<std::string>(iss),

std::istream_iterator<std::string>(),

std::back_inserter<std::vector<std::string> >(tokens));

return tokens;

}

double Convert::toDouble(std::string value)

{

return atof(value.c_str());

}

int Convert::toInt(std::string value)

{

return atoi(value.c_str());

}

 

Garge.cpp

#include "Garage.h"

#include <iostream>

 

Garage::Garage(void){}

Garage::~Garage(void){}

string Garage::toString()

{

string result = "";

iterator pGarage = begin();

int index = 0;

while(pGarage!= end())

{

result += Convert::toString(index++);

result += ") " + (*pGarage)->toString() + "\n";

pGarage++;

}

return result;

}

Lorry* Garage::outputMinCapacity()

{

iterator pGarage = begin();

Lorry* min = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Lorry" && (min == nullptr || static_cast<Lorry*>(*pGarage)->outputCapacity() < min->outputCapacity()))

min = static_cast<Lorry*>(*pGarage);

pGarage++;

}

return min;

}

// функция поиска максимальной грузоподъемности //

Lorry* Garage::outputMaxCapacity()

{

// создаем итератор - указатель на начало гаража //

iterator pGarage = begin();

// указатель на текущий максимальный элемент, в начале равен 0 //

Lorry* max = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Lorry" && (max == nullptr || static_cast<Lorry*>(*pGarage)->outputCapacity() > max->outputCapacity()))

max = static_cast<Lorry*>(*pGarage);

pGarage++;

}

return max;

}

Car* Garage::outputMinHorsepower()

{

iterator pGarage = begin();

Car* min = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Car" && (min == nullptr || static_cast<Car*>(*pGarage)->outputHorsepower() < min->outputHorsepower()))

min = static_cast<Car*>(*pGarage);

pGarage++;

}

return min;

}

Car* Garage::outputMaxHorsepower()

{

iterator pGarage = begin();

Car* max = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Car" && (max == nullptr || static_cast<Car*>(*pGarage)->outputHorsepower() > max->outputHorsepower()))

max = static_cast<Car*>(*pGarage);

pGarage++;

}

return max;

}

Bicycle* Garage::outputMinWheelsCount()

{

iterator pGarage = begin();

Bicycle* min = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Bicycle" && (min == nullptr || static_cast<Bicycle*>(*pGarage)->outputWheelNumber() < min->outputWheelNumber()))

min = static_cast<Bicycle*>(*pGarage);

pGarage++;

}

return min;

}

Bicycle* Garage::outputMaxWheelsCount()

{

iterator pGarage = begin();

Bicycle* max = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == "Bicycle" && (max == nullptr || static_cast<Bicycle*>(*pGarage)->outputWheelNumber() > max->outputWheelNumber()))

max = static_cast<Bicycle*>(*pGarage);

pGarage++;

}

return max;

}

Vehicle* Garage::outputMinSpeed(char *vechicleName)

{

iterator pGarage = begin();

Vehicle* min = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == vechicleName && (min == nullptr || (*pGarage)->outputMaxSpeed() < min->outputMaxSpeed()))

min = *pGarage;

pGarage++;

}

return min;

}

Vehicle* Garage::outputMaxSpeed(char *vechicleName)

{

iterator pGarage = begin();

Vehicle* max = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == vechicleName && (max == nullptr || (*pGarage)->outputMaxSpeed() > max->outputMaxSpeed()))

max = *pGarage;

pGarage++;

}

return max;

}

Vehicle* Garage::outputMinPrice(char *vechicleName)

{

iterator pGarage = begin();

Vehicle* min = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == vechicleName && (min == nullptr || (*pGarage)->outputPrice() < min->outputPrice()))

min = *pGarage;

pGarage++;

}

return min;

}

Vehicle* Garage::outputMaxPrice(char *vechicleName)

{

iterator pGarage = begin();

Vehicle* max = nullptr;

while(pGarage!= end())

{

if ((*pGarage)->getClass() == vechicleName && (max == nullptr || (*pGarage)->outputPrice() > max->outputPrice()))

max = *pGarage;

pGarage++;

}

return max;

}

Vehicle* Garage::outputMinSpeed()

{

iterator pGarage = begin();

Vehicle* min = nullptr;

while(pGarage!= end())

{

if ((min == nullptr || (*pGarage)->outputMaxSpeed() < min->outputMaxSpeed()))

min = *pGarage;

pGarage++;

}

return min;

}

Vehicle* Garage::outputMaxSpeed()

{

iterator pGarage = begin();

Vehicle* max = nullptr;

while(pGarage!= end())

{

if ((max == nullptr || (*pGarage)->outputMaxSpeed() > max->outputMaxSpeed()))

max = *pGarage;

pGarage++;

}

return max;

}

Vehicle* Garage::outputMinPrice()

{

iterator pGarage = begin();

Vehicle* min = nullptr;

while(pGarage!= end())

{

if ((min == nullptr || (*pGarage)->outputPrice() < min->outputPrice()))

min = *pGarage;

pGarage++;

}

return min;

}

Vehicle* Garage::outputMaxPrice()

{

iterator pGarage = begin();

Vehicle* max = nullptr;

while(pGarage!= end())

{

if ((max == nullptr || (*pGarage)->outputPrice() > max->outputPrice()))

max = *pGarage;

pGarage++;

}

return max;

}

KursV2T1.cpp

// KursV2T1.cpp - определяет точку входа для консольного приложения //

 

#include "stdafx.h"

#include "Main.h"

 

using namespace std;

Main main;

 

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_CTYPE, "russian");

start:

try

{

// считывание из файла данных //

main.ReadFromFile();

// выбор: добавить или удалить //

int act;

begin:

do

{

cout << "\n\nУкажите что желаете сделать: \n\n1 - Добавить транспортное средство\n2 - Удалить транспортное средство\n3 - Показать гараж\n4 - Показать максимальное значение специфической характеристики\n5 - Показать минимальное значение специфической характеристики\n6 - Показать максимальную цену\n7 - Показать минимальную цену\n8 - Показать максимальную скорость\n9 - Показать минимальную скорость\n0 - ВЫХОД\n\n";

cout << "Ваш выбор: ";

cin >> act;

} while (act > 9 || act < 0);

switch (act)

{

case 1:

{

main.AddVenicle(); goto begin; break; }

case 2:

{

main.DeleteVenicle(); goto begin; break; }

case 3:

{ cout << main.GetGarage()->toString(); goto begin; break; }

case 4:

{ main.outputMaxSpecial(); goto begin; break; }

case 5:

{ main.outputMinSpecial(); goto begin; break; }

case 6:

{ main.outputMaxPrice(); goto begin; break; }

case 7:

{ main.outputMinPrice(); goto begin; break; }

case 8:

{ main.outputMaxSpeed(); goto begin; break; }

case 9:

{ main.outputMinSpeed(); goto begin; break; }

case 0:

{

main.WriteToFile();

Garage::iterator pGarage = main.GetGarage()->begin();

while (pGarage!= main.GetGarage()->end())

{

delete *pGarage; pGarage++;

}

_getch();

break;

}

}

}

catch (exception ex)

{

cout << ex.what() << endl;

_getch();

}

return 0;

}

 

Lorry.cpp

#include "Lorry.h"

#include "Constant.h"

using namespace std;

 

Lorry::Lorry(void)

{

capacity = NOT_SET_NUM;

#ifdef _DEBUG

cout << "\nConstructor Lorry\n";

#endif

}

Lorry::~Lorry(void)

{

#ifdef _DEBUG

cout << "\nDestructor Lorry\n";

#endif

}

int Lorry::outputCapacity(void)

{

return capacity;

}

bool Lorry::inputCapacity(int value)

{

if(value <= 0 || value > 1000000)

return false;

capacity = value;

return true;

}

string Lorry::getClass(void)

{

return "Lorry";

}

string Lorry::toString(void)

{

string result;

result.append(getClass());

result.append(": название ");

result.append(outputModel());

result.append(", цвет ");

result.append(outputColor());

result.append(", максимальная скорость ");

result.append(Convert::toString(outputMaxSpeed()));

result.append(", цена ");

result.append(Convert::toString(outputPrice()));

result.append(", год ");

result.append(Convert::toString(outputYear()));

result.append(", вес ");

result.append(Convert::toString(outputWeight()));

result.append(", грузоподъемность ");

result.append(Convert::toString(outputCapacity()));

return result;

}


 

Main.cpp

#include "Main.h"

#include <fstream>

#include "Bicycle.h"

#include "Car.h"

#include "Lorry.h"

#include <stdlib.h> // srand, rand //

#include <time.h>

using namespace std;

unsigned int _capacity = 0;

 

Main::Main(void)

{

// создаем гараж в динамической памяти //

garage = new Garage();

}

Main::~Main(void)

{

// обязательно удалять //

delete garage;

}

bool okInput()

{

// проверка коректности ввода //

if(cin.bad() || cin.fail())

return false;

return true;

}

void Main::DeleteVenicle()

{

setlocale(LC_CTYPE, "russian");

if(garage->size() == 0)

{

cout << "\nВ гараже пусто.\n";

return;

}

int index;

do

{

cout << "\nУкажите номер транспортного средства которое желаете удалить: ";

cout << "Ваш выбор: ";

cin >> index;

// размер массива "гараж" //

}

while(index > garage->size() -1 && index < 0);

delete *(garage->begin() + index);

garage->erase(garage->begin() + index);

cout << "Удалять еще?(no - ESC)\n";

if(_getch()!= 27)

DeleteVenicle();

}

void Main::AddVenicle()

{

setlocale(LC_CTYPE, "russian");

// указатель на абстрактный класс //

Vehicle *vehicle;

int mod;

string str;

double Double;

int Int;

do{

cout << "\nУкажите тип транспортного средства которое желаете добавить: Car - 1, Bicycle - 2, Lorry- 3, random - 0\n";

cout << "Ваш выбор: ";

cin >> mod;

 

} while (okInput() && (mod < 0 || mod > 3));

srand(time(nullptr));

if (mod == 0)

mod = rand() % 3 + 1;

cout << "Укажите специфическую характеристику для типа ";

cout << "Ваш выбор: ";

switch (mod)

{

case 1:

{

// создание указателя на класс car //

Car *temp = new Car();

cout << temp->getClass();

do{

cout << "\ndouble лошадиная сила ";

cin >> Double;

} while (okInput() &&!temp->inputHorsepower(Double));

//конвертация на venicle //

vehicle = temp;

break;

}

case 2:

{

Bicycle *temp = new Bicycle();

cout << temp->getClass();

do{

cout << "\nint количество колес ";

cin >> Int;

} while (okInput() &&!temp->inputWheelNumber(Int));

vehicle = temp;

break;

}

case 3:

{

Lorry *temp = new Lorry();

cout << temp->getClass();

do{

cout << "\nint грузоподъемность ";

cin >> Int;

} while (okInput() &&!temp->inputCapacity(Int));

vehicle = temp;

break;

}

default:

{

throw exception("rand exception" + mod);

}

}

// ввод характеристики для всех моделей //

cout << "Укажите характеристики транспортного средства\n";

 

do

{

cout << "\nstring название ";

cin >> str;

}

while (okInput() &&!vehicle->inputModel(str));

 

do

{

cout << "\nstring цвет ";

cin >> str;

}

while (okInput() &&!vehicle->inputColor(str));

 

do

{

cout << "\ndouble максимальная скорость ";

cin >> Double;

}

while (okInput() &&!vehicle->inputMaxSpeed(Double));

 

do

{

cout << "\ndouble цена ";

cin >> Double;

 

// занесение цены в vehicle //

}

while (okInput() &&!vehicle->inputPrice(Double));

 

do{

cout << "\nint год ";

cin >> Int;

}

while (okInput() &&!vehicle->inputYear(Int));

 

do{

cout << "\ndouble вес ";

cin >> Double;

}

while (okInput() &&!vehicle->inputWeight(Double));

// push_back - заносим в конец массива //

garage->push_back(vehicle);

cout << "Добавлять еще?(no - ESC)\n";

if (_getch()!= 27)

AddVenicle();

}

Garage *Main::GetGarage()

{

return garage;

}

// запись - обязательная функция //

void Main::WriteToFile()

{

fstream file;

// out - для записи //

file.open("save.txt", ios::out);

if(!file)

throw "opening file error";

// перевод в строку //

string str = "garage\n" + garage->toString();

file.write(str.c_str(), str.size());

file.close();

}

void Main::ReadFromFile()

{

fstream file;

file.open("save.txt", ios::in);

if (!file)

throw "opening file error";

string str = "";

char ch;

// цикл для чтения посимвольно в переменную ch //

while (file.get(ch))

// занос всех символов в str //

str += ch;

// создаем массив из слов //

vector<string> strVect = Convert::splitByGraps(str);

//указатель на первое слово

vector<string>::iterator pStrVect = strVect.begin();

// указатель на специфическую характеристику передвижения //

vector<string>::iterator pSpecial;

Vehicle *vehicle;

pStrVect++;

 

#ifdef _DEBUG

cout << ((empty(file))? "": "\nnot") << " empty, ";

cout << ((bin(file))? "": "not") << " binary, ";

cout << "length " << length(file) << ", ";

cout << "capacity " << capacity(file) << ", ";

cout << "max_size " << max_size(file) << ".\n";

#endif

 

while (pStrVect!= strVect.end())

{

pStrVect++;

pSpecial = pStrVect + 14;

if (*pStrVect == "Car:")

{

Car *car = new Car();

car->inputHorsepower(Convert::toDouble(*pSpecial));

vehicle = car;

}

else if (*pStrVect == "Bicycle:")

{

Bicycle *bicycle = new Bicycle();

bicycle->inputWheelNumber(Convert::toInt(*pSpecial));

vehicle = bicycle;

}

else if (*pStrVect == "Lorry:")

{

Lorry *lorry = new Lorry();

lorry->inputCapacity(Convert::toInt(*pSpecial));

vehicle = lorry;

}

else

throw FILE_FORMAT_EXCEPTION;

pStrVect += 2;

vehicle->inputModel(pStrVect->substr(0, pStrVect->size() - 1));

pStrVect += 2;

vehicle->inputColor(pStrVect->substr(0, pStrVect->length() - 1));

pStrVect += 2;

vehicle->inputMaxSpeed(Convert::toDouble(pStrVect->substr(0, pStrVect->length() - 1)));

pStrVect += 2;

vehicle->inputPrice(Convert::toDouble(pStrVect->substr(0, pStrVect->length() - 1)));

pStrVect += 2;

vehicle->inputYear(Convert::toInt(pStrVect->substr(0, pStrVect->length() - 1)));

pStrVect += 2;

vehicle->inputWeight(Convert::toDouble(pStrVect->substr(0, pStrVect->length() - 1)));

pStrVect += 3;

garage->push_back(vehicle);

// вместимость файла - количество записей //

_capacity++;

}

 

}

bool Main::bin(fstream &file)

{

file.clear();

file.seekg(0, ios_base::beg);

char ch;

string str;

for(int i = 0; i < 6, file.get(ch); ++i)

{

str += ch;

}

return (str == "garage");

}

unsigned int Main::length(fstream &file)

{

file.clear();

file.seekg(0, ios_base::end);

return file.tellg();

}

unsigned int Main::capacity(fstream &file)

{

file.clear();

file.seekg(0);

unsigned int result = 0;

char ch;

while(file.get(ch))

if(ch == '\n')

result++;

return result;

}

unsigned int Main::max_size(fstream &file)

{

return string().max_size();

}

bool Main::empty(fstream &file)

{

return (length(file) == 0);

}

void Main::outputMaxSpecial()

{

Vehicle *vehicle = garage->outputMaxCapacity();

cout << "\nМаксимальная грузоподъемность \n" << ((vehicle == nullptr)? "not found": vehicle->toString());

vehicle = garage->outputMaxWheelsCount();

cout << "\nВелосипед с максимальным количеством колес\n" << ((vehicle == nullptr)? "not found": vehicle->toString());

vehicle = garage->outputMaxHorsepower();

cout << "\nМашина с максимальной лошадиной силой\n" << ((vehicle == nullptr)? "not found": vehicle->toString());

}

void Main::outputMinSpecial()

{

Vehicle *vehicle = garage->outputMinCapacity();

cout << "\nМинимальная грузоподъемность \n" << ((vehicle == nullptr)? "not found": vehicle->toString());

vehicle = garage->outputMinWheelsCount();

cout << "\nВелосипед с минимальным количеством колес\n" << ((vehicle == nullptr)? "not found": vehicle->toString());

vehicle = garage->outputMinHorsepower();

cout << "\nМашина с минимальной лошадиной силой\n" << ((vehicle == nullptr)? "not found": vehicle->toString());

}

void Main::outputMaxPrice()

{

setlocale(LC_CTYPE, "russian");

int vehicleType = 0;

char* vehicleName = "";

cout << "\nЖелаете выбрать тип транспортного средства?(no - ESC)\n";

if (_getch()!= 27)

{

beg: cout << "\nУкажите тип транспортного средства 1- Lorry, 2 - Bicycle, 3- Car\n";

cout << "Ваш выбор: ";

cin >> vehicleType;

switch (vehicleType)

{

case 1:

vehicleName = "Lorry";

break;

case 2:

vehicleName = "Bicycle";

break;

case 3:

vehicleName = "Car";

break;

default:

goto beg;

break;

}

}

Vehicle *vehicle;

if (vehicleType == 0)

{

vehicle = garage->outputMaxPrice();

}

else

vehicle = garage->outputMaxPrice(vehicleName);

cout << "Максимальная цена " << ((vehicle == nullptr)? "не найдена": vehicle->toString()) << endl;

}

void Main::outputMinPrice()

{

setlocale(LC_CTYPE, "russian");

int vehicleType = 0;

char* vehicleName = "";

cout << "\nЖелаете выбрать тип транспортного средства?(no - ESC)\n";

if (_getch()!= 27)

{

beg: cout << "\nУкажите тип транспортного средства 1- Lorry, 2 - Bicycle, 3- Car\n";

cout << "Ваш выбор: ";

cin >> vehicleType;

switch (vehicleType)

{

case 1:

vehicleName = "Lorry";

break;

case 2:

vehicleName = "Bicycle";

break;

case 3:

vehicleName = "Car";

break;

default:

goto beg;

break;

}

}

Vehicle *vehicle;

if (vehicleType == 0)

{

vehicle = garage->outputMinPrice();

}

else

vehicle = garage->outputMinPrice(vehicleName);

cout << "Минимальная цена " << ((vehicle == nullptr)? "не найдена": vehicle->toString()) << endl;

}

void Main::outputMaxSpeed()

{

setlocale(LC_CTYPE, "russian");

int vehicleType = 0;

char* vehicleName = "";

cout << "\nЖелаете выбрать тип транспортного средства?(no - ESC)\n";

if (_getch()!= 27)

{

beg: cout << "\nУкажите тип транспортного средства 1- Lorry, 2 - Bicycle, 3- Car\n";

cout << "Ваш выбор: ";

cin >> vehicleType;

switch (vehicleType)

{

case 1:

vehicleName = "Lorry";

break;

case 2:

vehicleName = "Bicycle";

break;

case 3:

vehicleName = "Car";

break;

default:

goto beg;

break;

}

}

Vehicle *vehicle;

if (vehicleType == 0)

{

vehicle = garage->outputMaxSpeed();

}

else

vehicle = garage->outputMaxSpeed(vehicleName);

cout << "Максимальная скорость " << ((vehicle == nullptr)? "не найдена": vehicle->toString()) << endl;

 

}

void Main::outputMinSpeed()

{

setlocale(LC_CTYPE, "russian");

int vehicleType = 0;

char* vehicleName = "";

cout << "\nЖелаете выбрать тип транспортного средства?(no - ESC)\n";

if (_getch()!= 27)

{

beg: cout << "\nУкажите тип транспортного средства 1- Lorry, 2 - Bicycle, 3- Car\n";

cout << "Ваш выбор: ";

cin >> vehicleType;

switch (vehicleType)

{

case 1:

vehicleName = "Lorry";

break;

case 2:

vehicleName = "Bicycle";

break;

case 3:

vehicleName = "Car";

break;

default:

goto beg;

break;

}

}

Vehicle *vehicle;

if (vehicleType == 0)

{

vehicle = garage->outputMinSpeed();

}

else

vehicle = garage->outputMinSpeed(vehicleName);

cout << "Минимальная скорость " << ((vehicle == nullptr)? "не найдена": vehicle->toString()) << endl;

}

 

Vehicle.cpp

#include "Vehicle.h"

Vehicle::Vehicle(void)

{

model = NOT_SET_CHAR;

color = NOT_SET_CHAR;

maxSpeed = NOT_SET_NUM;

price = NOT_SET_NUM;

year = NOT_SET_NUM;

weight = NOT_SET_NUM;

#ifdef _DEBUG

cout << "\nConstructor Vehicle\n";

#endif

}

Vehicle::~Vehicle(void)

{

#ifdef _DEBUG

cout << "\nDestructor Vehicle\n";

#endif

}

string Vehicle::outputModel(void)

{ return model;}

 

string Vehicle::outputColor(void)

{ return color;}

double Vehicle::outputMaxSpeed(void)

{ return maxSpeed;}

 

double Vehicle::outputPrice(void)

{ return price;}

 

int Vehicle::outputYear(void)

{ return year;}

 

double Vehicle::outputWeight(void)

{ return weight;}

 

bool Vehicle::inputModel(string value)

{

if(value == "")

return false;

model = value;

return true;

}

bool Vehicle::inputColor(string value)

{

if(value == "")

return false;

color = value;

return true;

}

bool Vehicle::inputMaxSpeed(double value)

{

if(value > 1000 || value <= 0)

return false;

maxSpeed = value;

return true;

}

bool Vehicle::inputPrice(double value)

{

if(value <= 0)

return false;



Поделиться:


Познавательные статьи:




Последнее изменение этой страницы: 2016-09-19; просмотров: 162; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.216.209.235 (0.016 с.)