-1

I have this "movie store.cpp"

#include "List.h"

#include <iomanip>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath> 
using namespace std;    
//****************************************************************************************************

const static char* FILE_NAME = "Movies.csv";
    int totalCheckedIn1 = 0;
    int totalCheckedOut1 = 0;    
//****************************************************************************************************    

struct Movie
{
    int MPAC;
    int year;
    int runtime;
    int checkedIn;
    int checkedOut;
    string title;

    Movie()
    {    
    }

    Movie(int m, int y, int r, int ci, int co, string t)  
    {
        MPAC = m; 
        year = y; 
        runtime = r;
        checkedIn = ci; 
        checkedOut = co; 
        title = t;
    }

    bool operator == (const Movie& rhs) const
    {
        return (MPAC == rhs.MPAC);
    }

    Movie& operator =(const Movie& rhs)
    {
        MPAC = rhs.MPAC;
        year = rhs.year;
        runtime = rhs.runtime;
        checkedIn = rhs.checkedIn;
        checkedOut = rhs.checkedOut;
        title = rhs.title;
        return *this;
    }    
    friend ostream& operator <<(ostream& os, const Movie& m);
};    

void setInventory(List<Movie> z, double f)
{   
}
    //****************************************************************************************************

ostream& operator<<(ostream& os, const Movie& m)
{
    os << setw(7) << left << m.MPAC
        << setw(25) << left << m.title
        << setw(7) << left << m.year
        << setw(10) << left << m.runtime
        << setw(7) << left << m.checkedIn
        << setw(7) << left << m.checkedOut;
    return os;
}    
//****************************************************************************************************

void getData(List<Movie>& Movies);
void displayList(List<Movie>& Movies);
void findMovies(List<Movie> Movies);
    //****************************************************************************************************

int main()
{
    List<Movie> WebsterMovies;
    getData(WebsterMovies);

    cout << "CHECK";    
    displayList(WebsterMovies);

//  findMovies(WebsterMovies);

    setInventory(WebsterMovies, 10.5);
    cout << "The following data is the updated Webster Movies store\n";
    //displayList(WebsterMovies);       

    system("PAUSE");
    return 0;
}    
//****************************************************************************************************

void getData(List<Movie>& Movies)
{
    ifstream infile(FILE_NAME);
    if (!infile)
    {
        cout << "Problem opening file" << endl;
        exit(99);
    }

    while (!infile.eof())
    {
        Movie m;
        if (infile.peek() == EOF)
            break;
        infile >> m.MPAC;
        infile.ignore();
        infile >> m.year;
        infile.ignore();
        infile >> m.runtime;
        infile.ignore();
        infile >> m.checkedIn;
        infile.ignore();
        infile >> m.checkedOut;
        infile.ignore();
        getline(infile, m.title);
        Movies.insert(m);
    }

    infile.close();
}    
//****************************************************************************************************

void displayList(List<Movie>& Movies)
{
    int totalCheckedIn = 0;
    int totalCheckedOut = 0;
    cout << "The Webster Movie Store list includes : " << endl;
    cout << setw(7) << left << "MPAC"
        << setw(25) << left << "Title"
        << setw(7) << left << "Year"
        << setw(10) << left << "RunTime"
        << setw(7) << left << "In"
        << setw(7) << left << "Out" << endl;
    cout << "-------------------------------------------------------------------------------" << endl;
    double totalRunTime = 0;

    for (int i = 0, size = Movies.getNumber();
        i < size; ++i)
    {
        Movie m = Movies.getNext();
        cout << m << endl;
        totalRunTime += m.runtime;
        totalCheckedIn += m.checkedIn;
        totalCheckedOut += m.checkedOut;            
    }

    cout << "The average run time for the " << Movies.getNumber()
        << " movies is " << fixed << setprecision(1)
        << totalRunTime / Movies.getNumber() << endl;
    cout << "There are " << totalCheckedIn << " movies checked in " << endl;
    cout << "There are " << totalCheckedOut << " movies checked out" << endl;
    totalCheckedIn1 = totalCheckedIn;
}    
//****************************************************************************************************

void findMovies(List<Movie> Movies)
{
    while (true)
    {
        cout << "Enter the MPAC of a movie to locate:";
        int input;
        cin >> input;
        if (input == 0)
            break;
        Movie m;
        m.MPAC = input;
        if (Movies.getMember(m))
        {
            cout << setw(7) << left << "MPAC"
                << setw(25) << left << "Title"
                << setw(7) << left << "Year"
                << setw(10) << left << "RunTime"
                << setw(7) << left << "In"
                << setw(7) << left << "Out" << endl;
            cout << "-------------------------------------------------------------------------------" << endl;
            cout << m << endl;
        }
        else
        {
            cout << "That movie is not in the store" << endl;
        }
    }
}

this is "list.h"

#ifndef LIST_H
#define LIST_H

#include <iostream>    
//********************************************************************************

template <typename T>

class List
{
public:
    List();
    List(int size);
    List(const List &obj);
    ~List();
    void insert(T);
    T getNext();  // Returns the next element in the array.
    bool getMember(T&);  // Returns true if we can find the member, false otherwise.
    int getNumber();  // Returns the number of items in the list.

private:
    T *pList;
    int numberInList;  // Number of elements in the list.
    int listSize;  // Size of the list.
    int nextIndex;  // Index that points to the next element in the array.
};

//********************************************************************************
// Default Constructor
template <typename T>
List<T>::List()  
{
    numberInList = 0; 
    listSize = 100; 
    nextIndex = 0;

    pList = new T[listSize];
}

//********************************************************************************
// Overloaded Constructor
template <typename T>
List<T>::List(int size)  
{
    numberInList = 0; 
    listSize = size; 
    nextIndex = 0;

    pList = new T[listSize];
}

//********************************************************************************
// Copy Constructor
template <typename T>
List<T>::List(const List &obj) 
{
    numberInList = obj.numberInList;
    listSize = obj.listSize;
    nextIndex = obj.nextIndex;
    pList = new T[listSize];

    for (int i = 0; i < listSize; i++)
    {
        pList[i] = obj.pList[i];
    }
}
    //********************************************************************************
// Destructor
template <typename T>
    List<T>::~List()        
    {
        delete[]pList;
    }

//********************************************************************************

template <typename T>
void List<T>::insert(T item)
{
    int temp = numberInList++;
    pList[temp] = item;
}    
//********************************************************************************
template <typename T>
T List<T>::getNext()
{
    return pList[nextIndex++];
}
    //********************************************************************************

template <typename T>
bool List<T>::getMember(T& item)
{
    for (int i = 0; i < numberInList; ++i)
    {
        if (item == pList[i])
        {
            item = pList[i];
            return true;
        }
    }    
    return false;
}
    //********************************************************************************

template <typename T>
int List<T>::getNumber()
{
    return numberInList;
}
#endif

Problem i have is that setInventory function needs to update the checkedIn member of each list element using the formula (CheckedIn + CheckedOut) * ( f /100.0). Can someone guide me how can i update individual element using this function.help i got said" In order to update each element of the List, you need modify the template to include a setItem function that sets the associated element in the List object to the item that is passed to the setItem function. HINT: This function should only contain one C++ statement."

if someone can guide me syntax of how i can update individual elements. this is something i wrote for setInventory()

    void setInventory(List<Movie> WebsterMovies , double f)
    {
    Movie m = WebsterMovies.getNext();
    cout << m << endl;
    cout << "Check again" << endl << endl;
    int size = WebsterMovies.getNumber();
    int increment = 0;
    for (int i = 0 ; i < size; ++i)
    {   
        cout << m << endl;
        increment = trunc(((m.checkedIn + m.checkedOut) * f )/ 100);
        m.checkedIn = m.checkedIn + increment;

        cout << "updated checkin is : " << m.checkedIn << endl;
        WebsterMovies.setItem(m);
        Movie m = WebsterMovies.getNext();

    } 
}

this is setItem i wrote

 template <typename T>
    void List<T>::setItem(T item)
    {
        pList[numberInList] = item;
    }

p.s beginner here so sorry for bad English or any other mistake.

ArK
  • 20,698
  • 67
  • 109
  • 136
  • 1
    Stack Overflow isn't meant as a tutoring service. – πάντα ῥεῖ Sep 27 '16 at 17:00
  • appreciated your input. – user3478383 Sep 27 '16 at 17:04
  • @πάνταῥεῖ Neither as a tutoring service nor as a code writing service, as far as I remember. ;-) – skypjack Sep 27 '16 at 17:29
  • 1
    @skypjack Sure. I was referring to _"if someone can guide me syntax of how i can update individual elements"_ – πάντα ῥεῖ Sep 27 '16 at 17:31
  • Off topic: This is an almost infamous common error: `while (!infile.eof())`. The only way to know if you've reached eof is to have reached eof. You can't test for eof before reading, you have to test after reading and before using what you read. More here: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – user4581301 Sep 27 '16 at 17:34
  • off topic: in `void List::setItem(T item)` consider passing `item` by `const` reference. It opens the compiler up to a wider pool of potential optimizations. – user4581301 Sep 27 '16 at 17:40
  • on topic: Also consider returning a reference here: `T List::getNext()`. It will make it much, much easier to perform the update you want to do. – user4581301 Sep 27 '16 at 17:41
  • I recommend you overload `operator >>` in your class to read in the member data of your class. This would be more OOP because you are hiding the data members from external entities and reducing the coupling strength. – Thomas Matthews Sep 27 '16 at 18:01

1 Answers1

0

To update an element in a container, such as std::list, you need to find the element, then update the fields.

An example:

std::list<Movie> database;
// Search by title
std::list<Movie>::iterator iter;
const std::list<Movie>::iterator end_iter = database.end();
for (iter = database.begin();
     iter != end_iter;
     ++iter)
{
  if (iter->title == search_title)
  {
     Update_Movie(*iter);
  }
}
Thomas Matthews
  • 56,849
  • 17
  • 98
  • 154