2016-09-27 49 views
-1

我有這樣的「電影store.cpp」如何更新這個OOP案例中的單個元素?

#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; 
     } 
    } 
} 

這是「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 

問題我已經是setInventory功能需要使用更新每個列表元素的checkedIn構件公式(CheckedIn + CheckedOut)*(f/100.0)。有人可以指導我如何使用此函數更新單個元素。幫助我說:「爲了更新列表中的每個元素,您需要修改模板以包含一個setItem函數,該函數將List對象中的關聯元素設置爲item傳遞給setItem函數提示:這個函數應該只包含一個C++語句。「

如果有人可以指導我如何更新單個元素的語法。 這是我寫的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(); 

    } 
} 

這是setItem我寫

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

P.S初學者在這裏很抱歉壞英語或其他任何錯誤。

+1

堆棧溢出並不意味着作爲一個輔導服務。 –

+0

讚賞你的意見。 – user3478383

+0

@πάνταῥεῖ據我所知,既不是輔導服務也不是代碼寫作服務。 ;-) – skypjack

回答

0

要更新容器中的元素(例如std::list),您需要查找該元素,然後更新這些字段。

一個例子:

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); 
    } 
}