Lab 9 An Object Oriented Logistics System (Sheep Based) Introduction ============ Kudos to you lucky few who have survived your first glimpse at Computer Science. Usually the response to all the code and all the rest of what dwells beyond the silicon curtain is similar to the response to R'lyah. (To look upon it is madness). Take a moment to reflect on the wide range of problems we have solved. We have explored the laws of physics, learned about fundamental triangle relationships (and the loyalty between pupils and teachers), explored ancient number systems, learned how to stuff a sheep into a computer, and (recently) harnessed the raw power of dynamic memory. We have done all this, and yet we have only scratched the surface of what lies ahead in computer science. There is a wonderfully rich field stretched out in front of you, and you have taken the first steps in exploring it! I hope you enjoy this final lab, as well as the rest of your studies. Now! Down to business! While it is a lot of fun to explore simple computing problems, eventually every computer scientist has to come down from the ivory towers and write an actual computer application. That's where this lab comes in. You are going to use the objects we developed in lab 8, as well as the ones from the guided lab in class, to build a full blown application. This sort of application programming is what OOP is really used for as it allows us to abstract away a lot of the application and offload the actual business logic to a series of objects. This lab will involve a fair bit of code, but you've already written most of what you'll need. There will be plenty of places where you can improve upon this application, and as always, I will award extra credit for any nice touches you place on this application. This program, while still set in the ancient world, is a common type of application in use today. We will be writing a logistics system. A logistics system is a system which manages the coming and going of merchandise within a company. Generally these interface with inventory control systems so as to allow the company to know what it has on hand, what is out in transit, and what shipments are expected to arrive. Logistics is actually a very rich area of study, and these systems can become quite complex very quickly. This is why we need the abstraction of objects, otherwise the complexity would be overwhelming and we could not achieve even a simple logistics system. The system which you will be building is, of course, a very simple system. However, it will give you a feel for how a larger application system is built. For those of you who are going to be coding for The Man, this will also give you a feel for the sorts of applications you are going to be writing in the very near future! Oh, and as always, this lab contains a bit of very odd humor, though it is a little subtle. If you read up on your Roman history, however, it is worth at least a chuckle. If you really know your Roman history, then there is a point of inaccuracy which goes beyond the idea of the ancient Etruscans using computers. Lab 9.1 ======= You will need the linked list template class we developed in class. If you haven't already completed this, scanned images of my code are available. You will need to have completed the ListNode and List classes. When you submit your complete lab, you will get credit for this as a guided lab. Lab 9.2 ======= Emboldened by the invention of object oriented programming, the Etruscan Software Development company decided to produce something of real value. Something that would save the company gobs of money by eliminating dozens of jobs. They had a plan, and they met with Stan one night to show it to him. "Yes lads, I understand you have something to show to me?" "Indeed we do!" called the programmers in unison. "But why are meeting in the dead of night?" "Because," said Reg (who had taken up programming), "we don't want the logistics clerks to see it." "But why?" asked Stan. "Because once we have this, they'll be redundant. We'll have to send them all to the dole queue!" "Ah! I like the sound of that!" replied Stan, rubbing his hands together greedily. He could already smell the Corinthian leather in his new chariot if this went through. "Tell me then, how does it work?" "Well," said Reg, "Currently our clerks make a listing of all of our orders, then they pass this on to the logistics staff who then divvy up the sheep between ships, right?" "Right" nodded Stan. "Well, we could replace them with a program that we hand the sheep orders to. The first screen would look like this..." Reg bent down and sketched the first screen in the sand: -- Begin Main Menu -- Welcome to the Shepherd Sheep Shipping Logistics Program! MAIN MENU 1.) Add a Sheep to Ship 2.) Print number of needed ships. 3.) Print number of ships for each destination. 4.) Print Manifests 5.) Clear Sheep List 6.) Quit Choice: 1 -- End Main Menu -- "Then, when we enter a new sheep, the system will work out how many ships we need and then the total value of each of those ships. We can give the more valuable shipments to our more reliable sea captains." Reg then sketched out the interface for entering the sheep: -- Begin Sheep Entry -- Sheep Entry Sex (M/F): M Origin [(T)uscany, (J)udea, (G)reece]: J Destination: Gaul Cost: 30 Has the sheep been sheared (Y/N)? N Color: Plaid -- End Sheep Entry -- "Oh, I like the look of that!" exclaimed Stan. So then what happens? "Well we run reports. For instance, the next thing we need to know is how many ships to order." "Right!" "As you know, that is a complex problem. Each ship can only hold 10 sheep, and can only sail to one destination on a single outing. So the program will take all that into account and tell us the total number to hire." -- Begin Ship Count Report -- You will need 4 ships. -- End Ship Count Report -- "How quickly can it work that out?" Stan asked in an astonished tone. "Almost instantly!" Bragged Stev (one of the programmers). "Good God! It takes Augustus over a day to work that out! I guess he'll have to go back into politics." "I guess so" replied Stan, "What harm could it do?" "Next, we want a break down of how many ships are going to each country. That way we can alert the docks as to how many to expect. Also, we want to know how many sheep and how much they cost. This will be useful to our marketing department. They will know the wealthy regions as well as the regions which need a little more development. Their report will look like this:" -- Begin Destination Report -- Ships per Destination --------------------- Destination Ships Sheep Total Value ----------- ----- ----- ----------- Gaul 1 2 40 Anglesey 2 15 170 Sparta 1 4 60 -- End Destination Report -- "The final report is a listing of what sheep are on which ship. This is automatically worked out by the program. A short version of this report is as follows: " -- Begin Shipping Manifest -- Shipping Manifests ------------------- Ship #1 Bound for Gaul Sex Origin Sheared Color Cost --- ------ ------- ----- ----- M Judea N Plaid 30 M Tuscany Y Black 10 ===================================== 2 Sheep Total Value: 40 ... and so on for the other ships ... -- End Shipping Manifest -- "That's brilliant! Quick! Cover it! Augustus is coming!" They all nervously scratched out what they had written. Augustus hardly noticed them, I mean, why would he suspect they were all plotting against him. Besides, he was excited because his adoptive father was addressing the senate the following day. His family was really going places! Nothing bad was about to happen to him or his dad. Nothing bad at all.... "Ok, now the best part. You don't have to do all your work in one run of the program. We'll store the list of sheep in a file, and when you resume the program, it will remember what was there." "Ah, so that's why you've included a clear function?" "Yes, when you call clear, it will empty out the list of sheep like so:" -- Begin Clear -- Clear Sheep ----------- Are you sure you want to clear this shipping list (Y/N)? Y Sheep list cleared -- End Clear -- "So once the ships ship the sheep we simply clear the sheep ship data of the shipped sheep?" "Right!" "Ok! This looks great Reg. Start on it right away!" Procedure ========= You heard the man! Get coding! Note that the entire interface is laid out for you. Also, you already have most of the classes you need to get started. Here's the order that I would tackle this in. Note that this is just a recommended way to compartmentalize the program. If you work with just one part at a time this really won't be so bad. Force yourself to stay with each item until it is 100% complete, then move on to the next. 1. Create the menu system. 2. Create the entry for one sheep. 3. Create a global variable which will store a list of sheep. You will want to sort the sheep by destination. This means that you will need to implement overloaded operators for the comparison operators for the sheep class and use addSorted when adding to the list. 4. Implement a class for counting the sheep going to each destination. I did this with a struct containing two elements. Whenever I ran the reports which show the number of ships per destination and/or the shipping manifest, I called a function which implemented the following psuedocode (note that you will have to adjust to how you implemented your sheep class in lab 8.): Struct Destination string name int count int value Destination d List dl for each sheep s in the list if d.name != s.destination if d.count > 0 dl.add(d) d.name = s.destination d.count = 1 d.value = s.cost else d.count++ d.value += s.cost end for dl.add(d) After you run the above, you can scan through the destination list and print out the number of sheep. To compute the number of ships, you'll need the ceiling of the sheep count divided by ten. So: ships = (int) ceil(d.count / 10) Note that ceil is in the cmath library. Make sure you read over and understand the above psuedocode and this math. I have just given you a sketch of how to do it. The actual context of this is completely up to you. 5. After you get that working, work out how to print out your ship manifest list. This is going to be similar to what we did to figure out how many ships would be at each element. You can do this with dynamic arrays of ships as we know how many ships we need at each point. Just make an array with the total number of ships in it. You can work this out using the formulas listed in step 4. Populate the arrays, and then use the ship's print functions to print out the manifest. Note that you'll need to modify the sheep print function in order to make things print the way we want. Do the print formatting last. 6. Get the file storage mechanism to work. Everything is driven by the sorted sheep list, so that is the only thing you need to write to the file. I just put each sheep field on a line in the file. This is very easy to read and write with. This is super easy to write if you build sheep insertion and extraction operators. Basically the sequence of events should work like this: Program Start Load the sheep file Do all the menu items the user wants Save the file when the user selects to exit 7. Dress it up a bit. Maybe you could make the input be done in Roman Numerals or perhaps you could have ships that have more complex paths. Perhaps you could have a ship visit multiple locations, but you'd have to work out the itinerary for each ship. The more extras you add, the more points I'll give you on your final exam. If you have big plans, let me know and maybe we can make this program count as your final exam as well! Closing Thoughts ================ You all have worked very hard this semester. I have really enjoyed being your teacher, and I hope you will get many years of enjoyment out of computer science. I know at this juncture it can feel very frustrating and overwhelming (especially given how hard I've worked you this semester), however if you stay with it a little more, you'll find that you will gain mastery of the subject in no time! Also, consider this. Our world works on computers. Computers are the pinnacle of human achievement in which we have finally harnessed the promise of mathematics and fused it with logic. Math, philosophy, art, language, poetry, and more; computers touch on virtually everything our species has accomplished in the past two and a half millenia. If you keep at it, you'll get to explore all of that. A computer scientist walks with the ancients while pulling the world into the future. I can't put into words just how vast and fascinating our field is. Suffice it to say that all the pains you take to learn how to code, how to prove algorithms, how to build computers, and how to conceive of universal computation is well worth it. A world of unspeakable beauty and complexity is stretched out before you. It's your birthright as a human, and I hope you will step up to take the challenge and enjoy yourself while doing it! Now, all that being said, you must write programs and think of algorithms as much as possible in the coming weeks. Please, don't put this down until the next semester, especially if you have a non-cs course in between this and your next bought with programming. To that end, I have some recommendations for you: * Free Online Books & Resources - Structure and Interpretation of Computer Programs http://mitpress.mit.edu/sicp/ This book has been used for many years as the introductory text in computer science at MIT. This book will teach you to program in Scheme, a dialect of LISP. Honestly, if I had my choice, I would have either taught you LISP or C, not C++. The reason is that C++ has gobs of syntax, LISP has practically none. Because the language is simple, this book quickly goes into detail about algorithms, parsers, data structures, and more. You'll learn LISP organically as you get a survey of the computing you'll be doing in the future. I read this book when I was a freshman in college, and it really put me ahead of the rest of my classmates. My school used C++, as yours does, but the ideas where equally applicable. Read this book, and you'll be better at all programming languages. This book will show you what computer science really is. Reading this book is one of the things that has led me to love computer science so much! - Mathematics for Computer Science by Albert R Meyer http://archive.org/details/ost-computer-science-mcs This is a recent book released under creative commons. This details the mathematics of theoretical computer science. It is a very nice and very complete treatment of the matter. Read this over, and you'll ace your discrete structure and theory of computation courses. Also, I believe this will be a good introduction to higher mathematics for you. There is nothing quite so exhilarating as studying infinity with nothing more than a pencil and a legal pad in your hand. - Meno by Plato http://www.gutenberg.org/ebooks/1643 While not strictly a computer science book, there are still many things in this classical work. In particular, we see Socrates's theory of forms and inborn knowledge. The discussions in this short dialog sound an awful like object oriented programming. Meditating on Socrates can make you a better programmer, and also can make you more interesting to talk to. The world needs more people that have read Meno, and fewer that have watched walking dead. Read Meno. Be wise. - Project Euler http://projecteuler.net/ This is a great place to test out your programming chops. This site gives you problems to solve, and then you solve them and post the correct solution. Once you get it right, you gain access to a forum where you can discuss your solutions. I often use project Euler as a problem source for when I am learning new programming languages. Lately, I've been writing a lot of go-lang code for these problems. This will give you a way to keep your brain thinking in C++, LISP, or whatever language you decide to love. - TopCoder Programming Contests http://www.topcoder.com/tc This is kind of like mad max for geeks (except everyone survives). There are a lot of modes of competition here, ranging from algorithm writing to marathon complex problems. It's challenging and fun for programmers at all levels. Come on in and pit your coding against others! * Start your CS library! If you want to be a serious scholar in any field, you must build a personal library in it. In Computer Science this can be tricky because there a lot of books about programming, but few on computer science itself. Here's my recommendations for starting your library. - The C Programming Language 2nd Edition by Brian Kernighan and Dennis Ritchie. Every programmer has a copy of this one. You should too. - The C++ Programming Language by Bjarne Stroustrup - A standard text for anyone who has to use C++. This book is a great reference. If you read it and understand it all, you'll be a C++ wizard. - The Art of Computer Programming by Donald Knuth This is quite possibly the only comprehensive introduction to pure computer science that has ever been written. I got my copy when I was a junior in high school. It was so intriguing, and confusing, that I decided to major in computer science just so I could understand the concepts in these books. (It's a 4 volume set so far. More volumes are on the way!) If you buy these books now, they will provide you with hours of enjoyment all the way through your BS up until your PhD. Another thing you may try is reading through the source code of some open source applications. Look at the Linux source (it has a document in the source which guides you through it). Look at firefox, gnome, something. Just make sure you think about computing this summer. I'm sure you will. Enjoy!