The goal of this lab is to continue your introduction to basic concepts in the C++ programming language. Concepts you will be familiar with after this lab include:
For this assignment, you will be working with a partner. Your partner for this lab has been chosen at random Both partners should be present and working on the code together. You will both be responsible for understanding all concepts, so dividing and conquering is not an option. The academic integrity policy applies to the partnership; you cannot work or share code with anyone outside your partner.
You and your lab partner will share the same git repository, which is named lab02-<user1>-<user2>.git
.
Please access your lab by cloning the appropriate git repository, e.g.:
$ cd ~/cs35 $ git clone git@github.swarthmore.edu:CS35-S18/lab02-mgagne1-lmeeden1.git ./lab02You can also get the ssh git url from CS35 github org.
We've given you a skeleton version of the program.
In this lab, you will create several classes representing different
types of media, including text, pictures, and videos. All of these
classes will be subclasses of an abstract Media
class.
This Media
class will encapsulate all functionality common to
all types of media. Your subclasses will add additional unique data
as well as implement inherited methods in a way specific to that
media. For example, "opening" a text file should be different from
"opening" a picture or video.
In addition, you will create a MediaLibrary
class which
acts as a container for up to 50 Media
objects (think of how
iTunes stores all of your eBooks, music, movies, etc.). You will
also build capability in the MediaLibrary
class for
obtaining information about your different media objects and for
playing the media itself.
Below is an overview of the files required for submitting this
week's lab. Those highlighted in blue
will require
implementation on your part. Those
in black
are complete and should
not be modified except for comments.
Makefile
- contains scripts for
compiling. You should not change this file but are responsible
for understanding its contents.example1.library
- small test file of
media items.example2.library
- input file for loading
all media objects. You do not need to modify this except to add
more examples (optional).media.h
- declares the Media
class, an abstract parent class of all media types.text.h/.cpp
- declares and defines
the Text
class, a subclass of Media
. Some
of this implementation has been provided for you.image.h/.cpp
- declares and defines
the Image
class, a subclass of Media
.video.h/.cpp
- declares and defines
the Video
class, a subclass of Media
.mediaLibrary.h
and mediaLibrary.cpp
- declares and defines
the MediaLibrary
class. This class acts as the
overall container for all Media
items.main.cpp
- This is the main function for your
program.manualTests.cpp
- This has another main
function that you can use to experiment with your
program. Graders will look at this file to see how you
tested your program.README.md
- complete this when your lab is
finished and you are ready to make your final git push to hand
in the assignment.
Media
class
contains virtual methods which are common to all media
objects. See the method comments on the declarations fo those classes
for more information about the behavior you need to implement.
Media
objects in a library. It allows a user
to ask how many Media
objects are in the library and gives
them access to them on request. Its constructor takes in a single
string which represents the name of the file containing the media
library. In the MediaLibrary
constructor, you should open
this file and create Media
objects accordingly.
$ ./iswatmedia Welcome to the iSwat Media Library! What is the name of your media file? example1.library 1. [image] Brown-Flames 2. [image] Aliens 3. [text] Gettysburg-Address 0. (quit) What would you like to open? 0 Goodbye!The first line of the media library file should indicate the number of media objects it contains. Each item is represented by several lines depending on what kind of media it is:
text
. The
following line will contain the location of the text file
e.g. (e.g. /usr/local/doc/GettsburgAddress
); the next
line will contain the document's name
(e.g. Gettysburg-Address
).
image
. The
following line will contain the location of the image file
(e.g. /usr/swat/pics/brownflames.gif
); the next line will
contain the image's name (e.g. Brown-Flames
).
video
. The
following line will be the URL for the video
(e.g. https://vimeo.com/28241047
). The line after that
will be the name of the video (e.g. Running-Gerbil
)
followed by a line containing the video length as a string
(e.g. (0:29)
)
For example, we have posted an example media library file.
As mentioned above, your main
function should ask the
user for the name of a media library file. Using that file,
it should display a menu listing the media files in order and
allow the user to pick a media file to open. If the user gives an invalid
file name, your program should print an error message on screen and end.
Media files should be listed by positive integers. The first media file you show should be selected by the input 1. After opening that media file, the menu should be repeated again. The program should continue until the user types 0, after which the program should terminate. If the user enters an invalid option, your program should print an error message, then print the menu again.
To display the media in a menu, you need to have a way of
representing it. The getDescription
method
is virtual
and unimplemented; each Media
subclass implements it in a different way.
getDescription
method on Text
should give the string "[text] "
followed by the name
of the document (e.g. "[text] Gettysburg-Address"
).getDescription
method on Image
should do likewise but with the prefix "[image]"
(e.g. "[image] Brown-Flames"
).getDescription
method on Video
uses the prefix "[video]"
and suffixes the video
length in parentheses (e.g.
"[video] Running-Gerbil (0:29)"
).The act of opening a media file is also performed by the
particular Media
subclass. The open
method of each Media
object should behave as
follows:
open
method on Text
should open the file, read it line by line, and
print each line it reads.open
method on Image
should open the image viewer gpicview
to
display the image to the user. You can accomplish this by using the
system
function discussed below.open
method on Video
should open the URL of the video using
firefox
. You should use system
for this as well.system
FunctionThe library cstdlib
contains a function system
which can run commands for
you. You pass a C-style string to the system
function and it will run it in
much the same way as the shell we use to e.g. compile our programs. For
instance, the following program will open Firefox to the Google home page.
After it does that, it will open a text editor.
#include <cstdlib> #include <string> using namespace std; int main() { string cmd1 = "firefox http://www.google.com"; string cmd2 = "gedit"; system(cmd1.c_str()); system(cmd2.c_str()); return 0; }
In larger applications, we avoid using the system
function in favor of more
precise ways to launch other programs from within our own code. For this lab,
however, the system
function suits us quite well.
Text
class – be able to view a text file.
Image
and Video
classes – be able to
open an image or play a video.
MediaLibrary
class which holds up to 50 media objects and lets the user
access the objects.
MediaLibrary
set up, complete the program. When
completed, your program should ask the user for a media library,
present a menu of media objects, and allow the user to select and
open the media.
Your code in this assignment is broken in to several different
files. To aid in the compilation process, we've created
a Makefile
which should make compilation easy. To compile
your test program, just type:
$ make manualTestsCompiling your main program is even easier. Just enter:
$ make
To summarize the requirements of this lab:
MediaLibrary
object.
manualTests.cpp
Once you are satisfied with your code, hand it in using git. Remember the add, commit, push development cycle. You can push as many times as you like, but only the most recent submission will be graded. You may want to run git status to confirm all modifications have been pushed.