简体   繁体   中英

How do I return an average of a number of vector objects? C++

Hi I'm quite new to c++ and I have a project but to do but a question in the project requires me to add a function, getAverageCostPerDay(), which takes a vector of Reservations object and returns the average cost of a car reservation. How do I got about doing this? Thanks

Reservation.h

#pragma once
#include <string>

class Reservation
{
    private:
        int id;
        std::string name;
        int stDate;
        int stMonth;
        int stYear;
        int duration;
        float cost;
        std::string licensePlate;

        static int reservationCount;

public:
    //Constructor
    Reservation();

    Reservation(int id, std::string name, int stDate, int stMonth, int
    stYear, int duration, float cost, std::string licensePlate);

    //Destructor
    ~Reservation();

    //Getters
    int getId();
    std::string getName();
    int getStDate();
    int getStMonth();
    int getStYear();
    int getDuration();
    float getCost();
    std::string getLicensePlate();

    //Setters
    void setId(int id);
    void setName(std::string name);
    void setStDate(int stDate);
    void setStMonth(int stMonth);
    void setStYear(int stYear);
    void setDuration(int duration);
    void setCost(float cost);
    void setLicensePlate(std::string licensePlate);

    static int getReservationCount()
    {
        return reservationCount;
    }
};

Reservation.cpp

#include "pch.h"
#include "Reservation.h"

int Reservation::reservationCount = 0;

//Constructor
Reservation::Reservation()
{
    this->id = 0;
    this->name = "";
    this->stDate = 0;
    this->stMonth = 0;
    this->stYear = 0;
    this->duration = 0;
    this->cost = 0;
    this->licensePlate = "";
    reservationCount++;
}

Reservation::Reservation(int id, std::string name, int stDate, int stMonth, 
int stYear, int duration, float cost, std::string licensePlate)
{
    this->id = id;
    this->name = name;
    this->stDate = stDate;
    this->stMonth = stMonth;
    this->stYear = stYear;
    this->duration = duration;
    this->cost = cost;
    this->licensePlate = licensePlate;
    reservationCount++;
}

//Destructor
Reservation::~Reservation()
{
    reservationCount--;
    std::cout << "Destroying (" << this->name << ")" << std::endl;
}

//Getters
int Reservation::getId()
{
    return this->id;
}

std::string Reservation::getName()
{
    return this->name;
}

int Reservation::getStDate()
{
    return this->stDate;
}

int Reservation::getStMonth()
{
    return this->stMonth;
} 

int Reservation::getStYear()
{
    return this->stYear;
}

int Reservation::getDuration()
{
    return this->duration;
}

float Reservation::getCost()
{
    return this->cost;
}

std::string Reservation::getLicensePlate()
{
    return this->licensePlate;
}

//Setters
void Reservation::setId(int id)
{
    this->id = id;
}

void Reservation::setName(std::string name)
{
    this->name = name;
}

void Reservation::setStDate(int stDate)
{
    this->stDate = stDate;
}
void Reservation::setStMonth(int stMonth)
{
    this->stMonth = stMonth;
}
void Reservation::setStYear(int stYear)
{
    this->stYear = stYear;
}
void Reservation::setDuration(int duration)
{
    this->duration = duration;
}
void Reservation::setCost(float cost)
{
    this->cost = cost;
}
void Reservation::setLicensePlate(std::string licensePlate)
{
    this->licensePlate = licensePlate;
}

Main.cpp

#include "pch.h"
#include "Reservation.h"

//Regular Expressions
std::string idRegexStr = "[0-9]{3,4}";
std::string nameRegexStr = "[A-Za-z]{1}[a-z]{1,30} [A-Za-z]{1}[a-z]{1,30}";
std::string stDateRegexStr = "[0-3]{1}[0-9]{1}";
std::string stMonthRegexStr = "[0-1]{1}[0-9]{1}";
std::string stYearRegexStr = "[1-2]{1}[0-9]{1}[0-9]{1}[0-9]{1}";
std::string durationRegexStr = "[1-9]{1}[0-9]{1}";
std::string costRegexStr = "[0-9]{2}.[0-9]{2}";
std::string licencePlateRegexStr = "[0-9]{2,3}\\s*[A-Z]{2,3}\\s*[0-9]+";

//Validates data against a user-defined string
bool validate(std::string regexStr, std::string data)
{
    return std::regex_match(data, std::regex(regexStr));
}

std::vector<Reservation>populateVector(Reservation defaultVector, int size)
{
    std::vector<Reservation> outVector;
    for (int i = 0; i < size; i++)
    {
        outVector.push_back(defaultVector);
    }
    return outVector;
}

double getAverageCostPerDay(const std::vector<Reservation> outVector)
{
    double average = 0;
    for (std::size_t i = 0; i < outVector.size(); i++)
    {
        average = std::vector<Reservation>outVector.at(float cost);
    }
    return true;
}

int main()
{
    /*
    //these were example values to see if regex works
    bool idIsValid = validate(idRegexStr, "101");
    bool nameIsValid = validate(nameRegexStr, "John Smith");
    bool stDateIsValid = validate(stDateRegexStr, "24");
    bool stMonthIsValid = validate(stMonthRegexStr, "10");
    bool stYearIsValid = validate(stYearRegexStr, "2018");
    bool durationIsValid = validate(durationRegexStr, "10");
    bool costIsValid = validate(costRegexStr, "22.50");
    bool licenseIsValid = validate(licencePlateRegexStr, "181 LH 555");

    std::cout << "Invalid = 0 / Valid = 1\n";
    std::cout << "\n";
    std::cout << "Valid ID: " << idIsValid << std::endl;
    std::cout << "Valid Name: " << nameIsValid << std::endl;
    std::cout << "Valid Start Date: " << stDateIsValid << std::endl;
    std::cout << "Valid Start Month: " << stMonthIsValid << std::endl;
    std::cout << "Valid Start Year: " << stYearIsValid << std::endl;
    std::cout << "Valid Duration: " << durationIsValid << std::endl;
    std::cout << "Valid Cost: " << costIsValid << std::endl;
    std::cout << "Valid License: " << licenseIsValid << std::endl;
    */

    Reservation r1(101, "John Smith", 24, 10, 2018, 4, 22.50, "181 LH 
    5555");
    Reservation r2(102, "Jane Caroll", 31, 01, 2017, 6, 34.25, "161 DUB 
    55454");
    Reservation r3(103, "Sean Morrissey", 16, 06, 2014, 2, 67.50, "162 WEX 
    83675");
    Reservation r4(104, "Billy Joe", 04, 03, 2016, 8, 51.20, "152 DUB 
    10347");
    std::cout << "Reservation Count: " << Reservation::getReservationCount() 
    << 
    std::endl;
}

There are a couple of ways to do this.

  1. You could wrap your vector of reservations inside of a class and keep track of how many there are, what the total cost is, and calculate the average.

  2. However, if you have to return this information through the Reservation class, then you'll have to use a static variable for sum of costs and number of reservation objects. Static attributes are available in all objects of that class and will have the same value between all objects. So, every time you create a Reservation object, increment the count and sum of costs. Then when you need the average, you can calculate it from any of the objects or through the class (if you make a static function to do this).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM