My code

mail@pastecode.io avatar
unknown
plain_text
3 years ago
10 kB
2
Indexable
Never
#include<iostream>

#include<string>

#include<vector>

#include<set>

using namespace std;

//abstract class Item
class Item {
public:
        virtual double GetTotalPrice() = 0;
};

//Enum for discount type

enum Discount_Type { amount, percentage };

//to store all the department id to check for duplication

set<string> departmentID;

//Department class which contains id, name,room phone number and parent department

class Department {

        string id;

        string name;

        int room;

        string phoneNumber;

        Department* parent;

public:

        //Empty constructor

        Department() {}

        //parametrized constructor

        Department(string id, string name, int room, string phoneNumber, Department* parent) {

                //check for duplication of id

                if (departmentID.count(id) > 0) {

                        cout << "Oject Not created Due to Department ID already exist\n ";

                        return;

                }
                else {

                        departmentID.insert(id);

                }

                this->id = id;

                this->name = name;

                this->room = room;

                this->phoneNumber = phoneNumber;

                this->parent = parent;

        }

        //this will return all the values of the object for printing

        string toString() {

                string output = "\n";

                output += "\tId: " + id + "\n";

                output += "\tName: " + name + "\n";

                output += "\tRoom: " + to_string(room) + "\n";

                output += "\tPhoneNumber: " + phoneNumber + "\n";

                if (parent != NULL) {

                        output += "Parent Department: " + parent->toString();

                }

                return output;

        }

};

//Product class whih Contains name, description category, department, price, discount,discount type

class Product :public Item{

protected:

        string name;

        string description;

        string category;

        Department department;

        double price;

        double discount;

        int discount_type;



public:

        //empty constructor

        Product() {}

        //parametrized constructor

        Product(string name, string description, string category, Department department, float price, float discount, Discount_Type discount_type) {

                //if price value is negative then it returns with a messsage;

                if (price < 0) {

                        cout << "No object create due to negative value of price\n";

                        return;

                }

                //if discount value is negative then it returns with a messsage;

                if (discount < 0) {

                        cout << "No object create due to negative value of discount\n";

                        return;

                }

                //if every thing fine then we just simply add values to the variables

                this->name = name;

                this->description = description;

                this->category = category;

                this->department = department;

                this->price = price;

                this->discount = discount;

                this->discount_type = discount_type;

        }

        //this will return the total price after neglect the discount

        virtual double GetTotalPrice() {

                //if discount is of type amount

                if (discount_type == amount) {

                        double finalP = price - discount;

                        if (finalP < 0) {

                                cout << "Total Price cannot be negative";

                                return 0;

                        }
                        else {

                                return finalP;

                        }

                }
                else {

                        //if the discount is of the type percentage

                        double finalP = price - (price * discount / 100);

                        if (finalP < 0) {

                                cout << "\nTotal Price cannot be negative\n";

                                return 0;

                        }
                        else {

                                return finalP;

                        }

                }

        }

        //return the values of each variable to print in string form

        virtual string toString() {

                string output = "";

                output += "Name: " + name + "\n";

                output += "Description: " + description + "\n";

                output += "Category: " + category + "\n";

                output += "Department: " + department.toString() + "\n";

                double totalPrice = this->GetTotalPrice();

                output += "Total Price " + to_string(totalPrice) + "\n";

                return output;

        }



};

//Service class which contains duration and it import the class Product in public accessor mode

class Service : public Product {

        double duration;

        //Call the product i.e. super class constructor

public:

        Service(string name, string description, string category, Department department, double duration, double rate, double rate_discount, Discount_Type discount_type) :Product(name, description, category, department, rate, rate_discount, discount_type) {

                this->duration = duration;

        }



        //this will return all the variables value

        virtual string toString2() {

                string output = "";

                output += toString();

                output += "Duration: " + to_string(duration) + "\n";

                return output;

        }

};

void quickSort(vector<Item* >&, int, int);
int partition(vector<Item* >&, int, int);

int main() {

        //create vector of all the class

        vector<Department> department;

        //Remove the Products and Services vectors
        /*vector<Product> product;

        vector<Service> service;*/

        //Add a new vector called Items,
        //which contains pointers to Item instances

        vector<Item*> items;

        // add 3 objects of departments

        Department d1("ABCD-EFGH-1234", "Electronics", 260, "0888123456", NULL);

        Department d2("ABCD-EFGH-8965", "Mechanical", 452, "0963258741", NULL);

        Department d3("ABCD-EFGH-7412", "IT", 153, "0258777412", &d1);

        //add department object to the vector

        department.push_back(d1);

        department.push_back(d2);

        department.push_back(d3);

        //Add at least 3 products and 3 services to the Items collection

        //create object of products

        Product *p1= new Product("PC Tools", "Tools used to design, repair or develop an PC", "Games", d3, 185.99, 30, amount);

        Product *p2= new Product("Car Tools", "Tools used to repair cars i.e. open and closing", "Repair", d2, 199.99, 15, percentage);

        Product *p3 = new Product("Bulb", "Led bulb operate on very low power", "Electonics", d1, 400.56, 80, amount);

        //add product objects to the vector

        items.push_back(p1);

        items.push_back(p2);

        items.push_back(p3);

        //Create objects of service

        Service *s1 = new Service("Repairing Cars", "Repairing of Cars and automobile", "Cars", d2, 2, 20.20, 10, percentage);

        Service *s2= new Service("Web Developer", "crete any web app or android app", "IT", d3, 12, 500, 50, amount);

        Service *s3 = new Service("Repairing of Electronics tools", "Repairing of CPU,montior", "Electornics", d1, 1.5, 8.50, 30, percentage);

        //add service objects to vector

        items.push_back(s1);

        items.push_back(s2);

        items.push_back(s3);

        //Use a loop to calculate and display the total
        //prices of all elements in the Items collection
        double totalPrice = 0;
        for (int i = 0; i < items.size(); i++)
        {
                totalPrice += items[i]->GetTotalPrice();
        }
        cout << "Total Price: $" << totalPrice << endl;
    
    
    int p = 0;
        int q = 6;

        quickSort (items, p, q);
        for ( int i = 0; i<6; i++ ) {
            items[i]->Out();
            cout << endl;
        }

        return 0;
    }

    void quickSort(vector<Item*>& items, int a, int b)
    {
        if (a<b)
        {
            int r = partition(items, a, b);
            quickSort(items, a, r);
            quickSort(items, r + 1, b);
        }
    }


    int partition(vector<Item*>& items, int a, int b)
    {

        int x = items[a]->GetTotalPrice(), i=a;
        for (int j = a + 1; j<b; j++)
        {
            if ( items[j]->GetTotalPrice() <= x ){
                i++;
                swap(items[i], items[j]);
            }
        }
        swap(items[i], items[a]);

        return i;
    }


        //print product vector data using for loop

        //cout << "Products\n";

        //cout << "================================\n";

        //for (int i = 0; i < items.size(); i++) {

        //      if (Product* p = dynamic_cast<Product*>(items[i])) {

        //              cout << dynamic_cast<Product*>(items[i])->toString();

        //              cout << endl;

        //              cout << "========================================\n";
        //      }

        //}

        ////print service vector using for loop

        //cout << "\n\nServices\n";

        //cout << "================================\n";

        //for (int i = 0; i < items.size(); i++) {
        //      if (Service* s = dynamic_cast<Service*>(items[i])) {

        //              cout << dynamic_cast<Service*>(items[i])->toString2();

        //              cout << endl;

        //              cout << "========================================\n";
        //      }

        //}

        //check duplication of id

        //cout << "\nCheck duplication of id \n";

        //Department d4("ABCD-EFGH-7412", "IT", 153, "0258777412", &d1);

        ////check for negative price entered

        //cout << "\n\ncheck for negative price entered \n";

        //Product p4("PC Tools", "Tools used to design, repair or develop an PC", "Games", d3, -185.99, 30, amount);