0

Hello everyone.
First of all i'm new here, and i registered particulary for this problem of mine i can't figure.
In the code shown below, in the function void printExpensiveThanT(..) i'm supposed to print out the destination, distance and the price for the offers which are more expensive than the offer T in the function, sorted in ascending order by the distance value.
I'm not sure what should i use to sort them, i experimented something with vectors but it didn't work out so i deleted it.
Any help would be appreciated.

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

class Transport {
protected:
    char destination[100];
    int basePrice;
    int distance;
public:
    Transport() {}
    Transport(char *destination, int basePrice, int distance) {
        strcpy(this->destination, destination);
        this->basePrice = basePrice;
        this->distance = distance;
    }
     virtual ~Transport() {}
    virtual int priceTransport() = 0;
    friend bool operator<(const Transport &t1, const Transport &t2) {
        return t1.distance<t2.distance;
    }
    int getDistance(){ return distance; }
    char *getDestination() { return destination; }
    int getPrice() { return basePrice; }
};

class AutomobileTransport : public Transport {
private:
    bool ifDriver;
public:
    AvtomobilTransport() {}
    AvtomobilTransport(char *destination, int basePrice,int distance, bool ifDriver) : Transport(destination,basePrice,distance) {
        this->ifDriver = ifDriver;
    }

    void setIfDriver(bool ifDriver) {
        this->ifDriver = ifDriver;
    }
    bool getIfDriver() {
        return ifDriver;
    }

    int priceTransport() {
        if(ifDriver) {
            basePrice+=basePrice*20/100;
        }
        return basePrice;
    }
    friend bool operator<(const AutomobileTransport &a1, const AutomobileTransport &a2) {
        return a1.distance<a2.distance;
    }
};

class VanTransport: public Transport {
private:
    int passengers;
public:
    KombeTransport() {}
    KombeTransport(char *destination, int basePrice, int distance, int passengers) : Transport(destination, basePrice, distance) {
        this->passengers = passengers;
    }
    void setPassengers(int passengers) {
        this->passengers = passengers;
    }
    int getPassengers() {
        return passengers;
    }
    int priceTransport() {
        for(int i = 0; i < passengers; i++) {
            basePrice-=200;
        }
        return basePrice;
    }
    friend bool operator<(const VanTransport &k1, const VanTransport &k2) {
        return k1.distance<k2.distance;
    }
};

void printExpensiveThanT(Transport **offers,int n,AutomobileTransport &T) {
    Transport *tmp;
    for(int i = 0; i <= n; i++){
        if(offers[i]->priceTransport() > T.priceTransport())

            cout<<offers[i]->getDestination()<<" "<<offers[i]->getDistance()<<" "<<offers[i]->getPrice()<<endl;    
        }       
}

int main() {

    char destination[20];
    int type,price,distance,passengers;
    bool driver;
    int n;
    cin>>n;
    Transport  **offers;
    offers=new Transport *[n];

    for (int i=0; i<n; i++) {

        cin>>type>>destination>>price>>distance;
        if (type==1) {
            cin>>driver;
            offers[i]=new AutomobileTransport(destination,price,distance,driver);

        } else {
            cin>>passengers;
            offers[i]=new VanTransport(destination,price,distance,passengers);
        }


    }

    AutomobileTransport at("Ohrid",2000,600,false);
    printExpensiveThan(offers,n,at);

    for (int i=0; i<n; i++) delete offers[i];
    delete [] offers;
    return 0;
}

Edited by Vlatko_1

2
Contributors
1
Reply
24
Views
1 Year
Discussion Span
Last Post by AssertNull
0

There are a lot of different sorting algorithms. Since you are reading in the values one at a time from user input, you start with a sorted list of one element. Given that, I would say that the Insertion Sort is your easiest approach. You have a sorted list and you never let it get unsorted. You'll need a swap variable for just about any sort, including the Insert Sort, so I would read the input into that swap variable rather than the end of the array since the end of the array will be overwritten anyway.

So let's say you have 6 elements in your ordered array (looks like you are sorting on distance). Your array indexes are 0 to 5. You read in your 7th element from cin into your swap/temporary variable. Let's say the distances (in order) are: 3, 6, 9, 12, 15, 18. The new element's distance is 10, so it's bigger than 9 and less than 12, so it belongs at array index 3. You'll move array elements 3 to 5 to be elements 4 to 6 either by iterating through a loop or by using memmove http://www.cplusplus.com/reference/cstring/memmove/
You then insert the new element to be array index 3. You now have a sorted array of seven elements. Do the same thing for the 8th element, then the ninth, etc. Your array never gets out of order.

https://en.wikipedia.org/wiki/Insertion_sort

That'd be my vote.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.