Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

COP 3530 Project 1 Video Store (100 Points) We need to write a program for a Vid

ID: 3795439 • Letter: C

Question

COP 3530 Project 1 Video Store (100 Points) We need to write a program for a Video Store. The Video Store will do the following tasks: Rent a video; that is, check out a video. Return, or check in, a video. Create a list of videos owned by the store. Show the details of a particular video. Print a list of all the videos in the store. Check whether a particular video is in the store. Maintain a customer database. Print a list of all the videos rented by each customer. The video store has two major components: videos and customers. The class videoType will be used to implement a video. The common things associated with a video are as follows: Title of the movie Names of the stars

Explanation / Answer

testVideoStore.cpp

#include <iostream>
#include <fstream>
#include <string>
#include "binarySearchTree.h"
#include "videoType.h"
#include "videoBinaryTree.h"
#include "unorderedLinkedList.h"
#include "customerType.h"


using namespace std;

void createVideoList(ifstream& infile,
                   videoBinaryTree& videoList);
void createCustomerList(ifstream& infile,
                   unorderedLinkedList<customerType>& videoList);

void displayMenu();

void loginView(customerType&, unorderedLinkedList<customerType>&, bool&);

int main()
{
    videoBinaryTree videoList;
   unorderedLinkedList<customerType> custList;
   customerType currentCustomer;
    int choice;
   bool found;   //finding customer rented movies
   bool custLogin = false;   //whether there is a customer logged in
    char ch;
    string title;

    ifstream infile;

    infile.open("videoDat.txt");
    if (!infile)
    {
        cout << "The input file does not exist" << endl;
        return 1;
    }

    createVideoList(infile, videoList);
    infile.close();

   infile.open("custDat.txt");
   if (!infile)
   {
       cout << "The input file does not exist" << endl;
       return 1;
   }

   createCustomerList(infile, custList);
   infile.close();


   loginView(currentCustomer, custList, custLogin); //logs in the customer
   while (custLogin) { //if customer is logged in
       cout << "Your checked out videos:" << endl;
       currentCustomer.printVideos();
       cout <<"________________________"<< endl;
       displayMenu();
       cout << "Enter your choice: ";
       cin >> choice; //get the request
       cin.get(ch);
       cout << endl;

       //process the request
       while (choice != 9)
       {
           switch (choice)
           {
           case 1:
               cout << "Enter the title: ";
               getline(cin, title);
               cout << endl;
               if (videoList.videoSearch(title))
                   cout << "Title found." << endl;
               else
                   cout << "The store does not carry this title."
                   << endl;
               break;

           case 2:
               cout << "Enter the title: ";
               getline(cin, title);
               cout << endl;
               if (videoList.videoSearch(title))
               {
                   if (videoList.isVideoAvailable(title))
                   {
                       currentCustomer.checkOut(title); //updates customers titles
                       videoList.videoCheckOut(title);
                       cout << "Enjoy your movie: " << title << endl;
                   }
                   else
                       cout << "The video is currently out of stock."
                       << endl;
               }
               else
                   cout << "The video is not in the store." << endl;
               break;

           case 3:
               cout << "Enter the title: ";
               getline(cin, title);
               cout << endl;
               if (videoList.videoSearch(title))
               {
                   found = false;
                   currentCustomer.checkIn(title, found); // searches in customer's list
                   if (!found) { // if not found
                       cout << "You dont have this movie" << endl;
                       break;
                   }
                   videoList.videoCheckIn(title);
                   cout << "Thanks for returning " << title << endl;
               }
               else
                   cout << "This video is not from our store." << endl;
               break;

           case 4:
               cout << "Enter the title: ";
               getline(cin, title);
               cout << endl;
               if (videoList.videoSearch(title))
               {
                   if (videoList.isVideoAvailable(title))
                       cout << "The video is currently in stock."
                       << endl;
                   else
                       cout << "The video is out of stock." << endl;
               }
               else
                   cout << "The video is not in the store." << endl;
               break;

           case 5:
               videoList.videoPrintTitle();
               break;

           case 6:
               videoList.inorderTraversal();
               break;

           default: cout << "Invalid selection." << endl;
           }//end switch

           cout << "Your checked out videos:" << endl;
           currentCustomer.printVideos();
           cout << "________________________" << endl;
           displayMenu();
           cout << "Enter your choice: ";
           cin >> choice; //get the next request
           cin.get(ch);
           cout << endl;
       }//end while
       loginView(currentCustomer, custList, custLogin);
   }
    return 0;
}
void createCustomerList(ifstream& infile, unorderedLinkedList<customerType>& custList)
{
   string fname;
   string lname;
   int num;

   //char   ch;
   while (infile>>fname >> lname >> num)
   {
       cout << "Inserting " << fname << " " << lname << endl; // debug
       custList.insertLast(customerType(fname, lname));
      
   }//end while
}//end createVideoList
void createVideoList(ifstream& infile, videoBinaryTree& videoList)
{
    string title;
    string star1;
    string star2;
    string producer;
    string director;
    string productionCo;
    char   ch;
    int   inStock;

    videoType newVideo;

    getline(infile, title);
    while (infile)
    {
        getline(infile, star1);
        getline(infile, star2);
        getline(infile, producer);
        getline(infile, director);
        getline(infile, productionCo);
        infile >> inStock;
        infile.get(ch);
        newVideo.setVideoInfo(title, star1, star2, producer,
                             director, productionCo, inStock);
        videoList.insert(newVideo);

        getline(infile, title);
    }//end while
}//end createVideoList

void displayMenu()
{
    cout << "Select one of the following: " << endl;
    cout << "1: To check whether a particular video is in "
         << "the store" << endl;
    cout << "2: To check out a video" << endl;
    cout << "3: To check in a video" << endl;
    cout << "4: To see whether a particular video is in stock"
         << endl;
    cout << "5: To print the titles of all the videos" << endl;
    cout << "6: To print a list of all the videos" << endl;
    cout << "9: To exit" << endl;
}


void loginView(customerType& current, unorderedLinkedList<customerType>& custList, bool& custLogin)
{
   int choice;
   bool loggingIn = true; // for log in looop
   custLogin = false; //updates global bool of having a customer logged in
   string fname, lname, ftemp, ltemp;//for use of finding customer in list
   customerType temp, newCust;
   while (loggingIn) { // customer has these options that loop until customer is found, created a new account or exited
       cout << "Welcome to the Video store type a number and hit enter to make a choice" << endl;
       cout << " 1: Existing user (from database)" << endl;
       cout << " 2: New user" << endl;
       cout << " 3: Exit now" << endl;
       cin >> choice;

      
       switch (choice) {
           case 1:
              
               cout << "Enter a first name" << endl;
               cin >> ftemp;
               cout << "Enter a last name" << endl;
               cin >> ltemp;
               temp = customerType(ftemp, ltemp); //temp customer for search
               if (custList.search(temp)) { //search customer
                   current = custList.get(temp); //retrieves that customer
                   cout << "Hello " << current.getFullName(); //greet
                   //set boolean parameters
                   loggingIn = false;
                   custLogin = true;
               }
               else {
                   cout << "Customer not found" << endl;
               }
               break;
           case 2:
              
               cout << "Enter a first name" << endl;
               cin >> fname;
               cout << "Enter a last name" << endl;
               cin >> lname;
               newCust = customerType(fname, lname); // create a new customer
               custList.insertLast(newCust);//insert to list
               current = newCust; // set current to the new customer
               cout << "Welcome " << current.getFullName(); // greet
               //set boolean params
               custLogin = true;
               loggingIn = false;
               break;
           case 3:
               cout << "Good bye" << endl;

               custLogin = false;
               loggingIn = false;
               break;
           default:
               cout << "Incorrect input" << endl;
               break;
       }

          
   }
}

binarySearchTree.h

//Header File Binary Search Tree

#ifndef H_binarySearchTree
#define H_binarySearchTree
#include <iostream>
#include <cassert>
#include "binaryTree.h"


using namespace std;

template <class elemType>
class bSearchTreeType: public binaryTreeType<elemType>
{
public:
    bool search(const elemType& searchItem) const;
    void insert(const elemType& insertItem);

    void deleteNode(const elemType& deleteItem);

private:
    void deleteFromTree(binaryTreeNode<elemType>* &p);
};


template <class elemType>
bool bSearchTreeType<elemType>::
              search(const elemType& searchItem) const
{
    binaryTreeNode<elemType> *current;
    bool found = false;

    if (root == NULL)
       cerr << "Cannot search the empty tree." << endl;
    else
    {
        current = root;

        while (current != NULL && !found)
        {
            if (current->info == searchItem)
                found = true;
            else if (current->info > searchItem)
                current = current->llink;
            else
                current = current->rlink;
        }//end while
    }//end else

    return found;
}//end search

template <class elemType>
void bSearchTreeType<elemType>::insert(const elemType& insertItem)
{
    binaryTreeNode<elemType> *current; //pointer to traverse the tree
    binaryTreeNode<elemType> *trailCurrent; //pointer behind current
    binaryTreeNode<elemType> *newNode; //pointer to create the node
   trailCurrent = root;//fix error
    newNode = new binaryTreeNode<elemType>;
    assert(newNode != NULL);
    newNode->info = insertItem;
    newNode->llink = NULL;
    newNode->rlink = NULL;

    if (root == NULL)
        root = newNode;
    else
    {
        current = root;

        while (current != NULL)
        {
            trailCurrent = current;

            if (current->info == insertItem)
            {
                cerr << "The insert item is already in the list-";
                cerr << "duplicates are not allowed."
                     << insertItem << endl;
                return;
            }
            else if (current->info > insertItem)
                current = current->llink;
            else
                current = current->rlink;
        }//end while

        if (trailCurrent->info > insertItem)
            trailCurrent->llink = newNode;
        else
            trailCurrent->rlink = newNode;
    }
}//end insert

template <class elemType>
void bSearchTreeType<elemType>::deleteNode(const elemType& deleteItem)
{
    binaryTreeNode<elemType> *current; //pointer to traverse the tree
    binaryTreeNode<elemType> *trailCurrent; //pointer behind current
    bool found = false;

    if (root == NULL)
        cout << "Cannot delete from the empty tree." << endl;
    else
    {
        current = root;
        trailCurrent = root;

        while (current != NULL && !found)
        {
            if (current->info == deleteItem)
                found = true;
            else
            {
                trailCurrent = current;

                if (current->info > deleteItem)
                    current = current->llink;
                else
                    current = current->rlink;
            }
        }//end while

        if (current == NULL)
            cout << "The delete item is not in the tree." << endl;
        else if (found)
        {
            if (current == root)
                deleteFromTree(root);
            else if (trailCurrent->info > deleteItem)
                deleteFromTree(trailCurrent->llink);
            else
                deleteFromTree(trailCurrent->rlink);
        }//end if
    }
}//end deleteNode

template <class elemType>
void bSearchTreeType<elemType>::deleteFromTree
                                 (binaryTreeNode<elemType>* &p)
{
    binaryTreeNode<elemType> *current; //pointer to traverse the tree
    binaryTreeNode<elemType> *trailCurrent;   //pointer behind current
    binaryTreeNode<elemType> *temp;        //pointer to delete the node

    if (p == NULL)
        cerr << "Error: The node to be deleted is NULL." << endl;
    else if(p->llink == NULL && p->rlink == NULL)
    {
        temp = p;
        p = NULL;
        delete temp;
    }
    else if(p->llink == NULL)
    {
        temp = p;
        p = temp->rlink;
        delete temp;
    }
    else if(p->rlink == NULL)
    {
        temp = p;
        p = temp->llink;
        delete temp;
    }
    else
    {
        current = p->llink;
        trailCurrent = NULL;

        while (current->rlink != NULL)
        {
            trailCurrent = current;
            current = current->rlink;
        }//end while

        p->info = current->info;

        if (trailCurrent == NULL) //current did not move;
                                  //current == p->llink; adjust p
            p->llink = current->llink;
        else
            trailCurrent->rlink = current->llink;

        delete current;
    }//end else
}//end deleteFromTree


#endif

binaryTree.h

//Header File Binary Search Tree
#ifndef H_binaryTree
#define H_binaryTree


#include <iostream>

using namespace std;

     //Definition of the node
template <class elemType>
struct binaryTreeNode
{
    elemType info;
    binaryTreeNode<elemType> *llink;
    binaryTreeNode<elemType> *rlink;
};

   //Definition of the class
template <class elemType>
class binaryTreeType
{
public:
    const binaryTreeType<elemType>& operator=
                 (const binaryTreeType<elemType>&);
    bool isEmpty() const;
    void inorderTraversal() const;
    void preorderTraversal() const;
    void postorderTraversal() const;
    int treeHeight() const;
    int treeNodeCount() const;
    int treeLeavesCount() const;
    void destroyTree();
    binaryTreeType(const binaryTreeType<elemType>& otherTree);
    binaryTreeType();
    ~binaryTreeType();

protected:
    binaryTreeNode<elemType> *root;

private:
    void copyTree(binaryTreeNode<elemType>* &copiedTreeRoot,
                  binaryTreeNode<elemType>* otherTreeRoot);
    void destroy(binaryTreeNode<elemType>* &p);
    void inorder(binaryTreeNode<elemType> *p) const;
    void preorder(binaryTreeNode<elemType> *p) const;
    void postorder(binaryTreeNode<elemType> *p) const;

    int height(binaryTreeNode<elemType> *p) const;
    int max(int x, int y) const;
    int nodeCount(binaryTreeNode<elemType> *p) const;
    int leavesCount(binaryTreeNode<elemType> *p) const;
};

    //Definition of member functions

template <class elemType>
binaryTreeType<elemType>::binaryTreeType()
{
    root = NULL;
}

template <class elemType>
bool binaryTreeType<elemType>::isEmpty() const
{
    return (root == NULL);
}

template <class elemType>
void binaryTreeType<elemType>::inorderTraversal() const
{
    inorder(root);
}

template <class elemType>
void binaryTreeType<elemType>::preorderTraversal() const
{
    preorder(root);
}

template <class elemType>
void binaryTreeType<elemType>::postorderTraversal() const
{
    postorder(root);
}

template <class elemType>
int binaryTreeType<elemType>::treeHeight() const
{
    return height(root);
}

template <class elemType>
int binaryTreeType<elemType>::treeNodeCount() const
{
    return nodeCount(root);
}

template <class elemType>
int binaryTreeType<elemType>::treeLeavesCount() const
{
    return leavesCount(root);
}

template <class elemType>
void binaryTreeType<elemType>::copyTree
                      (binaryTreeNode<elemType>* &copiedTreeRoot,
                       binaryTreeNode<elemType>* otherTreeRoot)
{
    if (otherTreeRoot == NULL)
        copiedTreeRoot = NULL;
    else
    {
        copiedTreeRoot = new binaryTreeNode<elemType>;
        copiedTreeRoot->info = otherTreeRoot->info;
        copyTree(copiedTreeRoot->llink, otherTreeRoot->llink);
        copyTree(copiedTreeRoot->rlink, otherTreeRoot->rlink);
    }
} //end copyTree

template <class elemType>
void binaryTreeType<elemType>::inorder(binaryTreeNode<elemType> *p) const
{
    if (p != NULL)
    {
        inorder(p->llink);
        cout << p->info << " ";
        inorder(p->rlink);
    }
}

template <class elemType>
void binaryTreeType<elemType>::preorder(binaryTreeNode<elemType> *p) const
{
   if (p != NULL)
   {
       cout<<p->info<<" ";
       preorder(p->llink);
       preorder(p->rlink);
   }
}

template <class elemType>
void binaryTreeType<elemType>::postorder(binaryTreeNode<elemType> *p) const
{
    if (p != NULL)
    {
        postorder(p->llink);
        postorder(p->rlink);
        cout << p->info << " ";
    }      
}

     //Overload the assignment operator
template <class elemType>
const binaryTreeType<elemType>& binaryTreeType<elemType>::
           operator=(const binaryTreeType<elemType>& otherTree)
{
    if (this != &otherTree) //avoid self-copy
    {
        if (root != NULL) //if the binary tree is not empty,
                           //destroy the binary tree
            destroy(root);

        if (otherTree.root == NULL) //otherTree is empty
            root = NULL;
        else
            copyTree(root, otherTree.root);
    }//end else

    return *this;
}

template <class elemType>
void binaryTreeType<elemType>::destroy(binaryTreeNode<elemType>* &p)
{
    if (p != NULL)
    {
        destroy(p->llink);
        destroy(p->rlink);
        delete p;
        p = NULL;
    }
}

template <class elemType>
void binaryTreeType<elemType>::destroyTree()
{
    destroy(root);
}

   //copy constructor
template <class elemType>
binaryTreeType<elemType>::binaryTreeType
              (const binaryTreeType<elemType>& otherTree)
{
    if (otherTree.root == NULL) //otherTree is empty
        root = NULL;
    else
        copyTree(root, otherTree.root);
}

template <class elemType>
binaryTreeType<elemType>::~binaryTreeType()
{
    destroy(root);
}

template <class elemType>
int binaryTreeType<elemType>::height(binaryTreeNode<elemType> *p) const
{
    if (p == NULL)
        return 0;
    else
        return 1 + max(height(p->llink), height(p->rlink));
}

template <class elemType>
int binaryTreeType<elemType>::max(int x, int y) const
{
    if (x >= y)
        return x;
    else
        return y;
}

template <class elemType>
int binaryTreeType<elemType>::nodeCount(binaryTreeNode<elemType> *p) const
{
    cout << "Write the definition of the function nodeCount"
         << endl;

    return 0;
}

template <class elemType>
int binaryTreeType<elemType>::leavesCount(binaryTreeNode<elemType> *p) const
{
    cout << "Write the definition of the function leavesCount"
         << endl;

    return 0;
}

#endif

customerType.cpp

#include "customerType.h"

customerType::customerType(string f, string l)
{
   fname = f;
   lname = l;
}

customerType::customerType()
{
}

string customerType::getFullName() const
{
   return fname + " " + lname;
}

string customerType::getFirstName() const
{
   return fname;
}

string customerType::getLastName() const
{
   return lname;
}

int customerType::getNumCheckedOut() const
{
   return videoList.length();
}


void customerType::setFisrtName(string name)
{
   fname = name;
}

void customerType::setFirstName(string name)
{
   fname = name;
}

void customerType::printVideos()
{
   videoList.print();
}

void customerType::checkOut(string video)
{
   videoList.insertFirst(video);
}

void customerType::checkIn(string video, bool found)
{
   if (videoList.search(video)) {
       videoList.deleteNode(video);
       found = true;
   }
   else {
       cout << "You dont have that video" << endl;
       found = false;
   }

}

bool customerType::operator==(const customerType& right) const
{
   return (getFullName() == right.getFullName());
}

bool customerType::operator!=(const customerType& right) const
{
   return (getFullName() != right.getFullName());
}

bool customerType::operator<(const customerType& right) const
{
   return (getFullName() < right.getFullName());
}

bool customerType::operator<=(const customerType& right) const
{
   return (getFullName() <= right.getFullName());
}

bool customerType::operator>(const customerType& right) const
{
   return (getFullName() > right.getFullName());
}

bool customerType::operator>=(const customerType& right) const
{
   return (getFullName() >= right.getFullName());
}

ostream& operator<<(ostream& os, const customerType &cust)
{
   os << endl;
   os << "First Name " << cust.getFirstName() << endl;
   os << "Last Name " << cust.getLastName() << endl;
   os << "Movies Checked out: "<< cust.getNumCheckedOut() << endl;
  
   os << "_____________________________________" << endl;
   return os;
}

customerType.h

#include "videoType.h"
#include "unorderedLinkedList.h"
#include "videoBinaryTree.h"
using namespace std;


class customerType {
public:
   customerType(string,string);
   customerType();
   string getFullName()const;
   string getFirstName() const;
   string getLastName() const;
   int getNumCheckedOut()const;
   void setFisrtName(string);
   void setFirstName(string);
   void checkOut(string video);
   void checkIn(string,bool);
   void printVideos();
  
   bool operator==(const customerType&) const;
   bool operator!=(const customerType&) const;
   bool operator<(const customerType&) const;
   bool operator<=(const customerType&) const;
   bool operator>(const customerType&) const;
   bool operator>=(const customerType&) const;

  
private:
   string fname;
   string lname;
   unorderedLinkedList<string> videoList;


};

note: due to limited character i cant able to post all files

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote