Lab 3 Deciding What to Do, and Doing it With Style Introduction ============ Last week we took a deeper look at UNIX, chose sides in the editor debate, and we wrote our first programs in C++. It was a pretty big deal, and your head is probably still throbbing from it. I'm sure you're asking yourself, "What happens next?" with a feeling of both excitement and dread. What happens next is that we will take a few small steps toward understanding C++. This week will be a bit easier, and will give you a chance to catch up if you didn't quite finish last week. The reason this week will be easier is that the previous 2 weeks have consisted of a great deal of "ramp up" which is necessary to get you started. The learning curve is always a bit steep at first because there is so much to take in to build a foundation in computer science. Now that we have a little bit of base skills out of the way we can build on that. There will be no new Unix commands, text editors, or tools this week. It's all about further exploration of the code. This gives you just one thing to focus on. In this lab we are going to look at simple flow control and text formatting. This will help us write more useful programs as our programs will be able to make decisions. Also, our output won't be so ugly, we are going to learn to format it. Along the way we will also explore an invaluable reference, http://www.cplusplus.com. Part I: Guided by Pythagoras ============================ Journey with me back through the ages to meet with a madman. The year is 550 BC. The man is Pythagoras of Samos. The place is Croton, a Greek colony in southern Italy. There, this bearded robed man set up a religious sect, called the Pythagoreans. He taught that the universe was governed by order, and he founded the first school of mathematics to prove it. Its principle teaching was that everything could be described fully as a set of units; one only must find what that unit was. For instance, if we observed a square, we could treat the length of its side as a unit and, therefore, the perimeter would be 4. Thus 4 was the harmonious whole number of the square. Pythagoras taught that this was the way the world worked, and everything was governed by this principle. Then one fateful morning, one of his disciples came to Pythagoras and sketched a shape in the sand. The shape looked like this: |\ | \ | \ |___\ This is, of course, a right triangle. The triangle, whose Pythagorean number of harmony was 3. The simplest enclosed shape of straight lines. The student then said to Pythagoras, "Teacher! I cannot find a unit that matches these sides. Show me the true unit of this triangle." Pythagoras struggled for days trying to unlock the base unit of the triangle. He began to become more and more panicked and more and more distraught as his world view crumbled around him. Fortunately, Pythagoras's other students came up with a solution. They laid hands on the disciple that pointed out the flaw in their faith, and they drowned him in a well. The problem was solved, and so they went about finding the units for everything, having thus established the base line of loyalty of pupils to their teacher's teachings. (I expect nothing less from each of you.) The above story is, of course, largely apocryphal. We don't know if it took place, but we do know that Pythagoras really did struggle with right triangles in Croton. Eventually, Pythagoras decided to revisit this triangle and discovered that if he allowed for square units, he could find the harmony of this vexing triangle. He sketched an amazing proof of this, which ASCII art can't render completely. Well, here goes. Emacs, don't fail me now! Suppose we had 4 right triangles with dimensions a, b, c and we arrange them in a square as: ################################# # ### # # ##### # 2 # # ####c # b # # ### b# # ### a # # ################################# # ## b # # 2 # ### # # a # ### c a# # #a ### # # # ### # # # b ### ################################# Note that we have the areas a^2 and b^2, the remaining area can be computed by rearranging the 4 triangles (which we can do because from the above diagram, the square has sides of length a+b): ################################# # a #### b # # ### ## # #b ### ## a# # ### ### # # ### 2 ## # 2 2 2 ### c ## # Thus a + b = c ## ### # ## ### # # ### ## # #a ## ### b# # ### ### # # b #### a # ################################# Hence, we have proven the pythagorean theorem graphically, using nothing but ascii art. Pretty cool, huh? We are going to implement a program which can calculate the sides of any right triangle. I wanted you to have a little background though, after all, one of your ancient brethren had to die to bring you this knowledge. The three parts of the triangle are the legs (A & B) and the Hypotenuse (C). Clearly if you know any two of these 3, you know the other one. Due to the commutativity of addition, we can extract just two possible formulas for a right triangle. The first is for when the two legs are known: ________ | 2 2 C= \| A + B (1) The second is for when only one of the legs, A, is known: ________ | 2 2 B= \| C - A (2) Design ====== Our program will do the following: 1. Ask the user if they know both legs, or a leg and a hypotenuse. 2. If the legs are known apply formula 1, otherwise apply formula 2. 3. Display the results rounde to two decimal places. Implementation ============== 1. Create a folder for lab 3 by running: mkdir lab3. 2. Change into the lab3 folder: cd lab3. 3. Using your favorite editor, create pythagoras.cpp and type in the following code: #include #include #include using namespace std; int main(void) { return 0; } 4. Notice the #include and #include lines? Open up a web browser and go to http://www.cplusplus.com and look up the cmath and iomanip in the reference section. See anything that could be useful here? There are tons of built in libraries available to you in C++. cplusplus.com is a great place to learn about them. Pay particular attention to the following four items: * pow * sqrt * fixed * setprecision After looking at those function's pages and examples, proceed to step 5. 5. We need to select variables for a, b, and c, as well as a variable to store the user's choice. Double is the best fit for the triangle as, unlike what pythagoras originally thought, right triangles have fractional parts. The user will be entering an integer to make their selection, and so choice is an int. Add the following declarations to the appropriate part of the main function: double a, b, c; int choice; 6. Now we need to display the menu to the user. Add the following lines of code underneath the declarations. (Leave a blank line for style.) Note that we are also reading the user's choice. //Get the user's choice cout << endl << " Triangle Calculator" << endl; cout << "What do you know about your triangle?" << endl; cout << " 1.) Both Legs" << endl; cout << " 2.) A leg and a hypotenuse" << endl; cout << " Choice? "; cin >> choice; 7. Now we need to apply the correct formula. Note that there are just two possibilities, so we are going to use an if..else structure. Place this code next in the file: if(choice == 1) { //apply formula 1 cout << "A="; cin >> a; cout << "B="; cin >> b; c = sqrt(pow(a, 2) + pow(b, 2)); } else { //apply formula 2 cout << "A="; cin >> a; cout << "C="; cin >> c; b = sqrt(pow(c, 2) - pow(a, 2)); } 8. Now we want to display the output to the user. We want to round everything off to two decimal places. Notice the use of iomanip functions: cout << fixed << setprecision(2) << "A=" << a << endl << "B=" << b << endl << "C=" << c << endl; 9. Save the file and then compile it with the following compile line (from the shell): g++ pythagoras.cpp -o pythagoras 10. Run the program and try out a few example triangles. When it works, proceed to part II. Part II: Improving the Barometer Drop (self lab) ================================================ The professor, angry at the loss of his favorite barometer, was less than patient when his wayward pupil returned. "You chowder head! That barometer has been in my family for over 4 generations!", he said. The boy replied "Sorry, but I was so excited, I also wrote this program to go with it." Never missing a chance to read good C++ code (I mean, who would?) he read over the work of his student. "Hmmm, this code is good. Not bad for a first attempt." the professor said. "What do you mean not bad?", the student replied. "Well, I would prefer if it could solve more aspects of the problem at hand. For instance, we live in the US, and thanks to the failings of Jimmy Carter, we still use the imperial system. It would be nice if it could work in both imperial and SI units. Also, it would be great if it could predict the number of seconds of a fall from a given height, as well as the final velocity of the fall." The student thought it over for a second and said "Well, it would be easy enough to store some choice variable about units. But what about the other parts?" The professor went to the board and wrote out several formulas in almost legible handwriting. He, of course, quickly erased them, but our intrepid student captured them! After all, he knows that you have to be quick on the draw to capture professorial notes! 1 2 d = --- gt 2 ________ | 2d | ---- t = \| g v = gt Also, he noted something about g being different in imperial units than it is in SI units. Unfortunately, the professor was too quick with the eraser for him to capture that one. Oh well, that's why google was invented! Procedure --------- We are going to modify your barometer program from lab 2. If you haven't finished it yet, please take this opportunity to get caught up. I will still give you credit for it, so long as you get it done by the end of Tuesday's class. This will be the last such extension! 1. Modify the design of the program from last time to account for the change in requirements. Below is a sample run to illustrate how the changed program should behave: ---- begin sample run ---- Will you be working in: 1.) Metric 2.) Imperial Choice? What mode will you want? 1.) Height in terms of time. 2.) Time in terms of height Drop your barometer. How long was it until you heard a crashing sound (in seconds)? 2.5 Your building is 30.65 meters tall. The final velocity of the barometer was 24.5 m/s. Now, you do realize that barometers are filled with mercury, right? Call the EPA NOW! ---- end sample run ---- Note that the final velocity is always printed, and it should display the proper units. Submit your design by the specified due date. Be sure to include adequate test cases in both metric and imperial units for both modes of operation. 2. Modify your code to allow for these changes.