Answer:
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <iomanip>
#include <sstream>
using namespace std;
// Given struct
struct Camera {
// Declaring variables
string manufacturer;
string model;
int releaseYear;
int resolution;
int weight;
double price;
};
vector<string> bestValue(const vector<Camera>& cameraNew) {
vector<string> display;
double winnerOne = 0;
double winnerTwo = 0;
double realWinnerOne = 0;
double realWinnerTwo = 0;
string displayOne;
string displayTwo;
string ans;
int find = 0;
// Calculating best value using given formula
for (unsigned i = 1; i < cameraNew.size(); i++) {
winnerOne = cameraNew[i].price / static_cast<double>(cameraNew[i].resolution);
winnerTwo = cameraNew[i-1].price / static_cast<double>(cameraNew[i - 1].resolution);
if (cameraNew[i].manufacturer == cameraNew[i - 1].manufacturer) {
if (winnerOne > winnerTwo && winnerOne > realWinnerOne) {
find = 1;
}
else if (winnerOne < winnerTwo && winnerTwo > realWinnerTwo) {
find = 2;
}
if (find == 1) {
realWinnerOne = cameraNew[i].price/ static_cast<double>(cameraNew[i].resolution) ;
ostringstream displayStream1;
displayStream1 << fixed << setprecision(2) << cameraNew[i].price;
displayOne = cameraNew[i].manufacturer + ":" + cameraNew[i].model + ":$" + displayStream1.str();
find = 0;
}
else if (find == 2) {
realWinnerTwo = cameraNew[i - 1].price / static_cast<double>(cameraNew[i - 1].resolution);
ostringstream displayStream2;
displayStream2 << fixed << setprecision(2) << cameraNew[i - 1].price;
displayTwo = cameraNew[i-1].manufacturer + ":" + cameraNew[i-1].model + ":$" + displayStream2.str();
find = 0;
}
}
else {
if (realWinnerOne >= realWinnerTwo) {
display.push_back(displayOne);
realWinnerOne = 0;
realWinnerTwo = 0;
}
else if (realWinnerOne < realWinnerTwo) {
display.push_back(displayTwo);
realWinnerOne = 0;
realWinnerTwo = 0;
}
}
}
if (realWinnerOne > realWinnerTwo) {
display.push_back(displayOne);
}
else if (realWinnerOne < realWinnerTwo) {
display.push_back(displayTwo);
}
else if (realWinnerOne == realWinnerTwo) {
display.push_back(displayTwo);
}
return display;
}
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& display) {
if (display.size() > 0) {
out << "0. " << display[0];
out << endl;
//displaying output in the given format
for (size_t i = 1; i < display.size(); i++) {
out << i << ". " << display[i];
out << endl;
}
}
else
{
out << "Size of the vector is 0 or less than 0." << endl;
}
return out;
}
void camBestValue() {
const vector<Camera> vCameras = {
{ "Agfa", "ePhoto 1280", 1996, 1024, 400, 180 },
{ "Agfa", "ePhoto CL45", 2000, 1600, 275, 180 },
{ "Canon", "PowerShot 350", 1996, 640, 315, 150 },
{ "Canon", "PowerShot 600", 1994, 832, 445, 139 },
{ "Canon", "PowerShot A10", 2001, 1280, 355, 139 },
{ "Casio", "Exilim EX-P505", 2005, 2560, 250, 260 },
{ "Casio", "Exilim EX-P600", 2006, 2816, 275, 260 },
{ "Casio", "Exilim EX-P700", 2006, 3072, 275, 260 },
{ "Epson", "PhotoPC 800", 1997, 1600, 285, 220 },
{ "Epson", "PhotoPC L-500V", 2004, 2560, 205, 150 },
{ "Fujifilm", "FinePix 40i", 2000, 2400, 185, 180 },
{ "Fujifilm", "FinePix 50i", 2001, 2400, 205, 180 },
{ "Fujifilm", "DS-260HD", 1997, 1280, 845, 190 },
{ "Fujifilm", "DS-300", 1995, 1280, 845, 200 },
{ "HP", "Photosmart 320", 2002, 1632, 230, 190 },
{ "HP", "Photosmart 435", 2003, 2048, 180, 190 },
{ "HP", "Photosmart 620", 2002, 1632, 260, 190 },
};
vector<string> display;
display = bestValue(vCameras);
cout << display << endl;
}
int main() {
camBestValue();
}
Explanation:
The program takes one input parameter: a vector of Camera. The vector is sorted by manufacturer, so all cameras of a particular manufacturer are together in the vector.
The function returns a vector of string, with the manufacturer, model number and price concatenated together.
It produces the best value.