Question
You will be writing classes that implement a simulation of a playlist for a digital music device. The list will be a dynamic array of
You will be writing classes that implement a simulation of a playlist for a digital music device. The list will be a dynamic array of Song objects, each of which stores several pieces of information about a song. You will need to finish the writing of two classes: Song and Playlist. The full header file for the Song class has been provided in a file called song.h. You can get a copy of it here.
Program Details and Requirements
1) Using the Song class declaration, write the song.cpp file and define all of the member functions that are declared in the file song.h. (Do not change song.h in any way. Just take the existing class interface and fill in the function definitions). Notice that there are only six categories of songs in this class: POP, ROCK, ALTERNATIVE, COUNTRY, HIPHOP, and PARODY. The expected functions behaviors are described in the comments of this header file.
2) Write a class called Playlist (filenames are playlist.h and playlist.cpp). A Playlist object should contain a list of songs. There is no size limit to the song list, so it should be implemented with a dynamically allocated array. (This means you'll need an array of Song objects). You can add any public or private functions into the Playlist class that you feel are helpful. In addition to the Playlist class itself, you will also create a menu program to manage the playlist. Note that the Playlist class should provide most of the functionality -- as the idea is to build a versatile and reusable class. The menu program you write is just for testing purposes, so the major functionality will be in the Playlist class itself. The Playlist member functions will be the interface betwen this menu program and the internally stored data (the list of songs).
Rules for the Playlist class:
All member data of class Playlist must be private
There should be no cin statements inside the Playlist class member functions. To ensure the class is more versatile, any user input (i.e. keyboard) described in the menu program below should be done in the menu program itself. Design the Playlist class interface so that any items of information from outside the class are received through parameters of the public member functions.
The list of Songs must be implemented with a dynamically allocated array. Between calls to Playlist member functions, there should never be more than 5 unused slots in this array (i.e. the number of allocated spaces may be at most 5 larger than the number of slots that are actually filled with real data). This means that you will need to ensure that the array allocation expands or shrinks at appropriate times. Whenever the array is resized, print a message (for testing purposes) that states that the array is being resized, and what the new size is. Example: "** Array being resized to 10 allocated slots".
Since dynamic allocation is being used inside the Playlist class, an appropriate destructor must be defined, to clean up memory. The class must not allow any memory leaks
You must use the const qualifier in all appropriate places (const member functions, const parameters, const returns, where appropriate).
3) Write a main program (filename menu.cpp) that creates a single Playlist object and then implements a menu interface to allow interaction with the object. Your main program should implement the following menu loop (any single letter options should work on both lower and upper case inputs):
A: Add a song to the playlist F: Find a song on the playlist D: Delete a song from the playlist S: Show the entire playlist C: Category summary Z: Show playlist size M: Show this Menu X: eXit the program
Behavior of menu selections:
Always ask for user input in the order specified. Remember, all user inputs described in the menu options below should be done by the menu program (not inside the Playlist class). Such input can then be sent into the Playlist class -- the Playlist class member functions should do most of the actual work, since they will have access to the list of songs. For all user inputs (keyboard), assume the following:
a song title and artist will always be input as c-strings (c-style strings), of maximum lengths 35 and 20, respectively. You may assume that the user will not enter more characters than the stated limits for these inputs.
when asking for the category, user entry should always be a single character. The correct values are P, R, A, C, H, and Y - for Pop, Rock, Alternative, Country, HipHop, and Parody, respectively. Uppercase and lowercase inputs should both be accepted. Whenever the user enters any other character for the category, this is an error -- print an error message and prompt the user to enter the data again (Example error message: "Invalid category. Please re-enter: ").
user input of the size should be a positive int, in kilobytes. You may assume that the user will enter an integer. Whenever the user enters a number that is not positive, it is considered an error -- so an error message should be printed and the user should be prompted to re-enter the size. (Example: "Must enter a positive size. Please re-enter: ").
User input of menu options are letters, and both upper and lower case entries should be allowed.
A: This menu option should allow the adding of a song to the playlist. The user will need to type in the song's information. Prompt and allow the user to enter the information in the following order: title, artist, category, size. The information should be sent into the Playlist object and stored in the list of songs.
F: This option should allow the user to search for a song in the playlist by title or by artist. When this option is selected, ask the user to enter a search string (may assume user entry will be a string 35 characters or less). If the search string matches a song title, display the information for that song (output format is described in the operator<< function that goes with the Song class). If the search string matches an artist/group in the list, display the information for all songs by that artist. If no matching songs are found in the search , display an appropriate message informing the user that there were no results in the playlist.
D: This option should delete a song from the playlist. When this option is selected, ask the user to type in the title of the song (you may assume that song titles in the list will be unique). Remove this song from the playlist. If there is no such title, inform the user and return to the menu.
S: This option should simply print the entire playlist to the screen, one line per song, in an organized manner (like a table). Each line should contain one song's information, as described in the song.hfile. Also, display the total number of songs in the playlist, as well as the total size of the playlist (in Megabytes, to 2 decimal places).
C: This option should list the playlist contents for one specific category. When this option is selected, ask the user to input a category to print. For the category selected, print out the contents of the playlist, as in the Show option, but for the songs matching the selected category only. (e.g. list all of the Pop songs). After this, also display the total quantity, as well as the total file size (the sum of the sizes), taken up by songs in this category. Print this size in Megabytes to 2 decimal places.
Z: This option should compute and print the total file storage taken up by the playlist, printed out in kilobytes.
M: Re-display the menu. X: Exit the menu program.
5) General Requirements:
All class member data must be private
ALL string usages in this assignment are to be implemented with C-style strings (i.e. null-terminated character arrays). You may NOT use the C++ string class library. A large point of this assignment is to do your own dynamic memory allocation and management, as well as to practice with fixed size C-strings
An invalid menu selection should produce an appropriate output message to the user, like "Not a valid option, choose again."
For all of these options, any output to the screen should be user-friendly. By this, assume that the user of the program has never seen it before. All output should clearly indicate what information is being presented, and the user should always be told what is expected in terms of input.
Adhere to the good programming practices discussed in class. (No global variables, other than constants or enumerations. Use const in all appropriate places. Don't #include .cpp files. Document your code. etc).
You may use the following libraries: iostream, iomanip, cstring, cctype
Extra Credit:
Write a function called "Sort", and add in a menu option (using the letter 'O') for sorting the playlist. When this menu option is chosen, ask the user whether they want to sort by artist or title (enter 'A' or 'T', allowing upper or lower case). Then, sort the playlist by ascending alphabetic (or actually, lexicographic) order, on the appropriate field (author or title).
Submit the following files through the web page in the usual manner:
song.cpp playlist.h playlist.cpp menu.cpp
song.h was provided
// song.h -- header file for the Song class
// // An object of type Song will store information about a single // digitally recorded song file. // The variable "category" stores the category of the song // (one of the six items in the enumerated type Style). #includeusing namespace std; #ifndef _SONG_H #define _SONG_H enum Style {POP, ROCK, ALTERNATIVE, COUNTRY, HIPHOP, PARODY}; class Song { // operator overload -- described at bottom friend ostream& operator<<(ostream& os, const Song& s); public: Song(); // default constructor, sets up blank song object void Set(const char* t, const char* a, Style st, int sz); // the Set function should allow incoming data to be received through // parameters and loaded into the member data of the object. (i.e. // this function "sets" the state of the object to the data passed in). // The parameters t, a, st, and sz represent the title, artist, style, // and size of the song file, respectively. const char* GetTitle() const; // returns the title stored in the object const char* GetArtist() const; // returns the artist int GetSize() const; // returns the file size in kilobytes Style GetCategory() const; // returns the song category private: char title[36]; // may assume title is 35 characters or less char artist[21]; // may assume artist name is 20 characters or less Style category; // style of the given song int size; // file size, stored in kilobytes }; /* operator<< function The operator<< overload should print out a Song object on one line (to the given ostream) -- use no more than 80 characters per line -- as follows, in an organized manner. Size should be printed in Megabytes (use 1000 kilobytes = 1 MB for this calculation), to 1 decimal place. The category abbreviations used should be: Pop, Rock, Alt, Ctry, HH, Par Title Artist Style Size (MB) Examples: Pictures of You The Cure Alt 4.4 Bohemian Rhapsody Queen Rock 5.7 What Does the Fox Say Ylvis Par 12.6 */ #endif
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started