Line 1: |
Line 1: |
| + | ==MovieType.h== |
| <pre> | | <pre> |
− | //Programmer:Derek Elder
| |
− | //Assignment:Lab 2
| |
− | //Section:0112
| |
− | //Instructor:Hyman
| |
− | //Time:T/TH 7:30 - 11:10 AM
| |
− |
| |
| #include <iostream> | | #include <iostream> |
| #include <fstream> | | #include <fstream> |
Line 12: |
Line 7: |
| using namespace std; | | using namespace std; |
| | | |
− | class BigInt | + | #ifndef __MovieType_H__ |
| + | #define __MovieType_H__ |
| + | |
| + | const string EndOfFile = "***"; |
| + | |
| + | class MovieType |
| { | | { |
− | friend BigInt operator+(const BigInt& num1, const BigInt& num2); | + | string m_title; |
− | //Purpose:Operator overloaded, + operator will call AddBigInts. | + | int m_year; |
− | //Precondition:None.
| + | int m_gross; |
− | //Postcondition:The two BigInts have been added together.
| + | string m_studio; |
− | friend ostream& operator<<(ostream& os, const BigInt& num); | + | string m_stars; |
− | //Purpose:Operator overloaded, << operator will call PrintToBigInt. | |
− | //Precondition:None.
| |
− | //Postcondition:The BigInt is printed.
| |
− | friend bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum);
| |
− | //Purpose:Add two integers together into a sum. | |
− | //Precondition:BigInts num1 and num2 are valid.
| |
− | //Postcondition:1.Return true if sum is valid.
| |
− | // 2.Return false if there is overflow.
| |
− | friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum);
| |
− | //Purpose:Modularize AddBigInts function to make it more efficent.
| |
− | //Precondition:BigInts num1 and num2 have been entered and contain good data.
| |
− | //Postcondition:1.Sum has been populated by good data as long as numDigits <= MAX.
| |
− | // 2.If there is overflow (numDigits > MAX) it will be indicated in operator+.
| |
| public: | | public: |
− | static const int MAX = 5; | + | MovieType(); |
− | BigInt();
| + | //Purpose:Default Constructor. |
− | //Default Constructor | + | //Precondition:None |
− | //Purpose:Set numDigits to 0 to indicate an array is not populated. | + | //Postcondition:None |
− | //Precondition:None. | + | int CompareKeys(const MovieType& movie2) const; |
− | //Postcondition:Constructor has set numDigits to 0 indicating the array is not populated. | + | //Purpose:To compare two movies and determine where it should be inserted. |
− | BigInt(const string& goodString); | + | //Precondition:Add function must be called and executed. |
− | //Constructor
| + | //Postcondition:String compare function is called to execute the comparison, resulting in two possible outcomes: |
− | //Purpose:If num is intitalized in main with a value, the constructor calls StringToBigInt. | + | // 1.A positive value is returned and is added into the list. |
− | //Precondition:None. | + | // 2.A 0 or a negative value is returned and isn't added into the list. |
− | //Postcondition:BigInt num has been converted from a string into an array. | + | void Initialize(string title, int year, int gross, string studio, string stars); |
− | bool ReadBigInt(istream& is = cin); | + | //Purpose:Initializes a movie item with data, basically a constructor. |
− | //default stream arg; ReadBigInt() means use "cin".
| + | //Precondition:None |
− | //Purpose:Read a BigInt, deposit into a string and call StringToBigInt. | + | //Postcondition:Populated with initial data. |
− | //Precondition:None. | + | bool ReadOneMovieFromFile(istream& is = cin); |
− | //Postcondition:1.Array is populated, data is valid. | + | //Purpose:To read one movie from a file at a time. |
− | // 2.BigInt is too large, loops until an Int is entered that is small enough. | + | //Precondition:ReadAllMovies() must be called. |
− | void PrintBigInt(ostream& os = cout) const; | + | //Postcondition:1.True is returned if one movie was taken from the data file and entered into the list. |
− | //default stream arg; PrintBigInt() means use "cout".
| + | // 2.False is returned if the EndOfFile flag was reached. |
− | //Purpose:Print a BigInt in the same way it was entered by reversing the way it was stored into the array. | + | void Display(ostream&os = cout) const; |
− | //Precondition:BigInt num is valid. | + | //Purpose:Displays one movie from the list. |
− | //Postcondition:Data is printed on screen matching the way it was entered from the console. | + | //Precondition:List array must contain data. |
− | private:
| + | //Postcondition:Data listed to the console screen. |
− | void StringToBigInt(const string& goodString);
| |
− | //Purpose:Convert from characters to numeric data
| |
− | //Precondition:Assume "goodString" is perfect.
| |
− | //Postcondition:goodString is converted into numeric data and entered into an array.
| |
− | int Digits[MAX];
| |
− | int numDigits;
| |
| }; | | }; |
− | | + | int MovieType::CompareKeys(const MovieType& movie2) const |
− | class OverFlowException
| + | { |
| + | return (m_title.compare(movie2.m_title)); |
| + | } |
| + | void MovieType::Initialize(string title, int year, int gross, string studio, string stars) |
| + | { |
| + | m_title = title; |
| + | m_year = year; |
| + | m_gross = gross; |
| + | m_studio = studio; |
| + | m_stars = stars; |
| + | } |
| + | void MovieType::Display(ostream& os) const |
| { | | { |
− | public:
| + | if(m_title == EndOfFile) |
− | BigInt m_num1, m_num2; | |
− | char m_op;
| |
− | OverFlowException(const BigInt& num1,const BigInt& num2, char op)
| |
| { | | { |
− | m_num1 = num1; | + | os<<""; |
− | m_num2 = num2;
| |
− | m_op = op;
| |
| } | | } |
− | };
| + | else |
− | | |
− | void main()
| |
− | {
| |
− | BigInt num1, num2;//("12345");
| |
− | bool moreNumbers = true;
| |
− | char update = ' ';
| |
− | | |
− | while(moreNumbers)
| |
| { | | { |
− | try | + | os<<"Title:\t"<<m_title<<endl; |
− | {
| + | os<<"Year:\t"<<m_year<<endl; |
− | num1.ReadBigInt();
| + | os<<"Gross:\t$ "<<m_gross<<endl; |
− | num2.ReadBigInt();
| + | os<<"Studio:\t"<<m_studio<<endl; |
− | cout<<"The BigInt entered is: ";
| + | os<<"Stars:\t"<<m_stars<<endl; |
− | num1.PrintBigInt();
| + | os<<endl; |
− | cout<<"The BigInt entered is: ";
| |
− | num2.PrintBigInt();
| |
− | cout<<"The sum is: "<<num1 + num2;
| |
− | } | |
− | catch(OverFlowException ex)
| |
− | {
| |
− | cout<<"The sum has caused OVERFLOW"<<endl;
| |
− | } | |
− | | |
− | cout<<"Do you wish to add more numbers? ";
| |
− | cin>>update; | |
− | cin.ignore(50,'\n');
| |
− | if(update == 'Y' || update == 'y')
| |
− | {
| |
− | moreNumbers = true;
| |
− | }
| |
− | else
| |
− | {
| |
− | moreNumbers = false;
| |
− | }
| |
| } | | } |
− | cout<<"Program Terminated on request."<<endl;
| |
| } | | } |
− | | + | bool MovieType::ReadOneMovieFromFile(istream& is) |
− | bool BigInt::ReadBigInt(istream& is) | |
| { | | { |
− | int len = 0; | + | int index; |
− | bool tooBig = false;
| + | string str = ""; |
− | string inputString = ""; | |
| | | |
− | while(!tooBig) //Initialize tooBig, if integer is too big loop until BigInt entered is valid. | + | getline(is,m_title); |
| + | if(m_title == EndOfFile) |
| { | | { |
− | cout<<"Enter an integer: "; | + | return false; |
− | getline(cin,inputString); | + | } |
− | | + | else |
− | len = (int)inputString.length(); //Length of the string entered into len | + | { |
− | | + | is>>m_year; |
− | if(len > MAX) | + | is>>m_gross; |
− | {
| + | is>>m_studio; |
− | cout<<"The number you entered is too big, try again!"<<endl; | + | getline(is,str); |
− | tooBig = false;
| + | index = (int)str.find_first_of(",",0); |
− | }
| + | if(index > 0) |
| + | m_stars = str.substr(index+2,(str.length() - (index+1))); |
| else | | else |
− | {
| + | m_stars = "None"; |
− | StringToBigInt(inputString); | + | return true; |
− | tooBig = true;
| |
− | }
| |
| } | | } |
− | return true;
| |
| } | | } |
− | void BigInt::PrintBigInt(ostream& os) const | + | MovieType::MovieType() |
| + | :m_title(""), m_year(-1), m_gross(-1), m_studio(""), m_stars("") |
| + | {} |
| + | #endif |
| + | </pre> |
| + | ==SortedMovieList.h== |
| + | <pre> |
| + | #include <iostream> |
| + | #include <fstream> |
| + | #include <string> |
| + | #include <iomanip> |
| + | #include "MovieType.h" |
| + | using namespace std; |
| + | typedef MovieType MovieListItemType; |
| + | |
| + | const int MAX = 20; |
| + | int counter = 0; |
| + | |
| + | class SortedMovieList |
| + | { |
| + | public: |
| + | SortedMovieList(); |
| + | //Purpose:Default Constructor. |
| + | //Precondition:None |
| + | //Postcondition:None |
| + | void listAdd(const MovieListItemType& newItem, bool& success); |
| + | //Purpose:To insert a movie in the array. |
| + | //Precondition:ReadAllMovies function executes. |
| + | //Postcondition:listInsert function is called to find the correct position for the movie to be inserted. |
| + | void listInsert(int index, MovieListItemType newItem, bool& success); |
| + | //Purpose:To insert a movie in the correct position in the array. |
| + | //Precondition:listAdd function is called. |
| + | //Postcondition:Item is inserted into the correct place in the list. |
| + | void listSubtract(const MovieListItemType& itemToRemove, bool& success); |
| + | //Purpose:To remove a movie from the array. |
| + | //Precondition:Remove choice is called from the menu. |
| + | //Postcondition:The movie is removed from the list |
| + | void listRemove(int index, bool& success); |
| + | //Purpose:To remove a movie from the array. |
| + | //Precondition:Remove choice is called from the menu. |
| + | //Postcondition:The movie is removed from the list. |
| + | void ReadAllMovies(); |
| + | //Purpose:Reads all of the movies in an input file. |
| + | //Precondition:ReadOneMovieFromFile executes correctly. |
| + | //Postcondition:The list is populated with all of the movies from the file. |
| + | void DisplayList() const; |
| + | //Purpose:Displays the entire list of movies. |
| + | //Precondition:Array is populated from ReadAllMovies(). |
| + | //Postcondition:The list is displayed to the console. |
| + | void Search(const MovieListItemType& itemToSearch, bool& success); |
| + | //Purpose:To search through the list for the correct movie |
| + | //Precondition:Search called from the menu. |
| + | //Postcondition:1.If the movie is found the index where it was found is returned. |
| + | // 2.If the movie is not found the user will be notified. |
| + | |
| + | private: |
| + | MovieListItemType items[MAX]; |
| + | int size; |
| + | }; |
| + | |
| + | SortedMovieList::SortedMovieList() |
| + | :size(0) |
| + | {} |
| + | void SortedMovieList::listAdd(const MovieListItemType& newItem, bool& success) |
| { | | { |
− | int counter = numDigits - 1; | + | int i = 0; |
| | | |
− | for(int i = 0; i < numDigits; i++) | + | if(size == 0) |
| + | { |
| + | listInsert(i,newItem,success); |
| + | return; |
| + | } |
| + | while((i < size) && (newItem.CompareKeys(items[i]) == 1)) |
| { | | { |
− | cout<<Digits[counter]; | + | i++; |
− | counter--;
| |
| } | | } |
− | cout<<endl; | + | |
| + | listInsert(i,newItem,success); |
| + | } |
| + | void SortedMovieList::listInsert(int index, MovieListItemType newItem, bool& success) |
| + | { |
| + | success = ((index >= 0) && (index <= size) && (size < MAX)); |
| + | |
| + | if(success) |
| + | { |
| + | for(int pos = size; pos >= index; pos--) |
| + | { |
| + | items[pos+1] = items[pos]; |
| + | } |
| + | items[index] = newItem; |
| + | size++; |
| + | counter++; |
| + | } |
| } | | } |
− | bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum)
| + | void SortedMovieList::listSubtract(const MovieListItemType& itemToRemove, bool& success) |
| { | | { |
− | if(num1.numDigits >= num2.numDigits) | + | int i = 0; |
| + | |
| + | if(size == 0) |
| { | | { |
− | firstIntegerLarger(num1, num2, sum); | + | cout<<"List is empty"<<endl; |
| } | | } |
− | else | + | |
| + | while((i < size) && (itemToRemove.CompareKeys(items[i]) == 1)) |
| { | | { |
− | firstIntegerLarger(num2, num1, sum); | + | i++; |
| } | | } |
| | | |
− | //If Overflow return false, otherwise return true | + | listRemove(i,success); |
− | if(sum.numDigits > MAX) | + | } |
| + | void SortedMovieList::listRemove(int index, bool& success) |
| + | { |
| + | success = ((index >= 0) && (index < size)); |
| + | |
| + | if(success) |
| { | | { |
− | return false;
| + | for(int fromPosition = index + 1; fromPosition < size; fromPosition++) |
| + | items[fromPosition-1] = items[fromPosition]; |
| + | size--; |
| + | counter--; |
| } | | } |
− | else | + | } |
| + | void SortedMovieList::ReadAllMovies() |
| + | { |
| + | MovieListItemType newItem; |
| + | ifstream Input; |
| + | int i = 0; |
| + | bool success; |
| + | string inputFile = ""; |
| + | |
| + | Input.clear(); |
| + | cout<<"Welcome, please enter the name of your Input file: "; |
| + | cin>>inputFile; |
| + | cin.ignore(50,'\n'); |
| + | Input.open(inputFile.c_str()); |
| + | |
| + | while(newItem.ReadOneMovieFromFile(Input)) |
| { | | { |
− | return true; | + | this->listAdd(newItem,success); |
| } | | } |
| + | |
| + | Input.close(); |
| } | | } |
− | void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum) | + | void SortedMovieList::DisplayList() const |
| { | | { |
| int i; | | int i; |
− | int remainder = 0;
| |
| | | |
− | for(i = 0; i < smallest.numDigits; i++) | + | for(i = 0; i < size; i++) |
| { | | { |
− | sum.Digits[i] = largest.Digits[i] + smallest.Digits[i] + remainder; | + | items[i].Display(); |
| | | |
− | if(sum.Digits[i] >= 10) | + | if(i%3 == 0) //Every 3 movies, pause. |
| { | | { |
− | sum.Digits[i] = (sum.Digits[i] - 10); | + | cout<<"Press 'ENTER' if you wish to display more movies"; |
− | remainder = 1; | + | cin.get(); |
− | }
| + | cout<<endl; |
− | else
| |
− | {
| |
− | remainder = 0;
| |
| } | | } |
| } | | } |
| + | } |
| + | void SortedMovieList::Search(const MovieListItemType& itemToSearch, bool& success) |
| + | { |
| + | int i; |
| | | |
− | for(; i < largest.numDigits; i++) | + | for(i = 0; i < size; i++) |
| { | | { |
− | sum.Digits[i] = largest.Digits[i] + remainder; | + | if(itemToSearch.CompareKeys(items[i]) == 0) |
| + | { |
| + | cout<<endl<<"The Movie has been found at index "<<i<<"."<<endl;//add ... |
| + | items[i].Display(); |
| + | break; //If the movie is found, go no further. |
| + | } |
| | | |
− | if(sum.Digits[i] >= 10) | + | if(itemToSearch.CompareKeys(items[i]) == -1) |
| { | | { |
− | sum.Digits[i] = (sum.Digits[i] - 10); | + | cout<<endl<<"The movie you wished to search for has not been found."<<endl; |
− | remainder = 1; | + | break; //If you have gone past the point |
| + | //where the movie should be stored in the list, go no further. |
| } | | } |
− | else
| |
− | {
| |
− | remainder = 0;
| |
− | }
| |
| } | | } |
| | | |
− | if(i == largest.numDigits && remainder == 1) | + | if(i == size) |
| + | cout<<endl<<"The movie you wished to search for has not been found."<<endl; |
| + | } |
| + | </pre> |
| + | ==Main.cpp== |
| + | <pre> |
| + | #include <iostream> |
| + | #include <fstream> |
| + | #include <string> |
| + | #include <iomanip> |
| + | #include "MovieType.h" |
| + | #include "SortedMovieList.h" |
| + | using namespace std; |
| + | |
| + | void clearScreen(); |
| + | //Purpose:To clear the screen. |
| + | //Precondition:None |
| + | //Postcondition:Screen is cleared. |
| + | char displayMenuAndGetSelection(); |
| + | //Purpose:To display the menu and get the selection for searching. |
| + | //Precondition:None |
| + | //Postcondition:Search choice is entered and appropriate function is called. |
| + | void addPerson(SortedMovieList& movieList); |
| + | //Purpose:To add a person to the list. |
| + | //Precondition:Choice must be selected from the menu. |
| + | //Postcondition:List is searched and results are output to the console. |
| + | void removePerson(SortedMovieList& movieList); |
| + | //Purpose:To remove a person from the list. |
| + | //Precondition:Choice must be selected from the menu. |
| + | //Postcondition:List is searched and results are output to the console. |
| + | void Pause(); |
| + | //Purpose:To pause the program and allow the user a break. |
| + | //Precondition:None |
| + | //Postcondition:None |
| + | void searchList(SortedMovieList& movieList); |
| + | //Purpose:To call the search function and find a movie in the list. |
| + | //Precondition:Choice must be selected from the menu. |
| + | //Postcondition:Search function is called. |
| + | void quitProgram(); |
| + | //Purpose:To inform the user the program has been terminated. |
| + | //Precondition:None |
| + | //Postcondition:Program terminated. |
| + | |
| + | void main() |
| + | { |
| + | char menuChoice = ' '; |
| + | bool done = false; |
| + | SortedMovieList movieList; |
| + | |
| + | movieList.ReadAllMovies(); |
| + | |
| + | while(!done) |
| { | | { |
− | sum.Digits[i] = 1; | + | menuChoice = displayMenuAndGetSelection(); |
− | sum.numDigits = largest.numDigits + 1; | + | clearScreen(); |
− | }
| + | switch(menuChoice) |
− | else
| + | { |
− | {
| + | case '1': |
− | sum.numDigits = largest.numDigits;
| + | movieList.DisplayList(); |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | case '2': |
| + | searchList(movieList); |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | case '3': |
| + | removePerson(movieList); |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | case '4': |
| + | addPerson(movieList); |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | case '5': |
| + | cout<<"There are currently "<<counter<<" movies in the list."<<endl; |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | case '6': |
| + | quitProgram(); |
| + | done = true; |
| + | break; |
| + | default: |
| + | cout<<"Incorrect choice selected"<<endl; |
| + | Pause(); |
| + | done = false; |
| + | break; |
| + | } |
| } | | } |
| } | | } |
− | void BigInt::StringToBigInt(const string& goodString) | + | |
| + | void clearScreen() |
| + | { |
| + | system("cls"); |
| + | } |
| + | char displayMenuAndGetSelection() |
| + | { |
| + | char choice; |
| + | clearScreen(); |
| + | cout<<endl<<endl<<endl; |
| + | cout<<"'1' -- View the list."<<endl<<endl; |
| + | cout<<"'2' -- Search the list."<<endl<<endl; |
| + | cout<<"'3' -- Delete a movie from the list."<<endl<<endl; |
| + | cout<<"'4' -- Add a movie to the list."<<endl<<endl; |
| + | cout<<"'5' -- Count the number of movies in the list."<<endl<<endl; |
| + | cout<<"'6' -- Quit the program."<<endl<<endl; |
| + | cin>>choice; |
| + | cin.ignore(50,'\n'); |
| + | return choice; |
| + | } |
| + | void addPerson(SortedMovieList& movieList) |
| + | { |
| + | MovieType movie; |
| + | string title, studio, stars; |
| + | int year, gross; |
| + | cout<<"Enter title: "; |
| + | getline(cin,title,'\n'); |
| + | cout<<"Enter year: "; |
| + | cin>>year; |
| + | cout<<"Enter gross: "; |
| + | cin>>gross; |
| + | cout<<"Enter studio: "; |
| + | cin>>studio; |
| + | cout<<"Enter stars: "; |
| + | cin>>stars; |
| + | movie.Initialize(title,year,gross,studio,stars); |
| + | bool success; |
| + | movieList.listAdd(movie,success); |
| + | |
| + | cout<<endl<<"The movie has been added to the list."<<endl; |
| + | } |
| + | void removePerson(SortedMovieList& movieList) |
| { | | { |
− | int counter = 0; | + | MovieType movie; |
− | string str = ""; | + | string title; |
− | str = goodString; | + | cout<<"Enter the title of the movie you wish to remove: "; |
− | numDigits = (int)str.length(); | + | getline(cin,title,'\n'); |
− | char ch = ' '; | + | movie.Initialize(title,0,0,"",""); |
| + | bool success; |
| + | movieList.listSubtract(movie,success); |
| | | |
− | for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers | + | cout<<endl<<"The movie has been removed from the list."<<endl; |
− | {
| |
− | ch = str[i]; //Convert from char to numeric value
| |
− | Digits[counter] = ch - '0'; //char c = '2';
| |
− | counter++; //int n = c - '0';
| |
− | }
| |
| } | | } |
− | BigInt operator+(const BigInt& num1, const BigInt& num2)
| + | void searchList(SortedMovieList& movieList) |
| { | | { |
− | BigInt sum; | + | MovieType movie; |
− | if(AddBigInts(num1,num2,sum) == false) | + | string title; |
− | { | + | cout<<"Enter the title of the movie you wish to search for: "; |
− | OverFlowException ex(num1,num2,'+');
| + | getline(cin,title,'\n'); |
− | throw ex;
| + | bool success; |
− | }
| + | movie.Initialize(title,0,0,"",""); |
− | else | + | movieList.Search(movie,success); |
− | return sum;
| + | |
| + | cout<<endl<<"The search has been conducted."<<endl; |
| } | | } |
− | ostream& operator<<(ostream& os, const BigInt& num)
| + | void Pause() |
| { | | { |
− | num.PrintBigInt(os); | + | cout<<endl<<"Press 'ENTER' to continue..."<<endl; |
− | return os; | + | cin.get(); |
| } | | } |
− | BigInt::BigInt()
| + | void quitProgram() |
− | :numDigits(0)
| |
− | {}
| |
− | BigInt::BigInt(const string& goodString)
| |
| { | | { |
− | StringToBigInt(goodString); | + | cout<<"Program terminated, good bye!"<<endl; |
| + | cout<<endl; |
| } | | } |
| </pre> | | </pre> |