Search

5.x — Chapter 5 comprehensive quiz

Quick review

If statements allow us to execute a statement based on whether some condition is true. Else statements execute if the associated if statement is false. You can chain together multiple if and else statements.

Switch statements provide a cleaner and faster method for selecting between a number of discrete items. Switch statements pair great with enumerations.

Goto statements allow the program to jump to somewhere else in the code. Don’t use these.

While loops allow the program to loop as long as a given condition is true. The condition is evaluated before the loop executes.

Do while loops are the same as while loops, but the condition is evaluated after the loop execution. They’re great for menus or things that need to execute at least once.

For loops are the most used loop, and are perfect when you need to loop a specific number of times.

Break statements allow us to break out of a switch, while, do while, or for loop. Or a for each loop, which we haven’t covered yet.

Continue statements allow us to move immediately to the next loop iteration. Be careful when using these with while and do while loops, as your loop counter may not get incremented properly.

And finally, random numbers give us a way to make our programs behave different each time they are run. We’ll see an example of this in the quiz below!

Quiz time!

Warning: The quizzes start getting harder from this point forward, but you can do it. Let’s rock these quizzes!

1) In the chapter 2 comprehensive quiz, we wrote a program to simulate a ball falling off of a tower. Because we didn’t have loops yet, the ball could only fall for 5 seconds.

Take the program below and modify it so that the ball falls for as many seconds as needed until it reaches the ground.

In constants.h:

In your main code file:

Show Solution

2) Implement a game of hi-lo. First, your program should pick a random integer between 1 and 100. The user is given 7 tries to guess the number. If the user does not guess the correct number, the program should tell them whether they guessed too high or too low. If the user guesses the right number, the program should tell them they won. If they run out of guesses, the program should tell them they lost, and what the correct number is. At the end of the game, the user should be asked if they want to play again. If the user doesn’t enter ‘y’ or ‘n’, ask them again.

Here’s what your output should look like:

Let's play a game.  I'm thinking of a number.  You have 7 tries to guess what it is.
Guess #1: 64
Your guess is too high.
Guess #2: 32
Your guess is too low.
Guess #3: 54
Your guess is too high.
Guess #4: 51
Correct! You win!
Would you like to play again (y/n)? y
Let's play a game.  I'm thinking of a number.  You have 7 tries to guess what it is.
Guess #1: 64
Your guess is too high.
Guess #2: 32
Your guess is too low.
Guess #3: 54
Your guess is too high.
Guess #4: 51
Your guess is too high.
Guess #5: 36
Your guess is too low.
Guess #6: 45
Your guess is too low.
Guess #7: 48
Your guess is too low.
Sorry, you lose.  The correct number was 49.
Would you like to play again (y/n)? q
Would you like to play again (y/n)? f
Would you like to play again (y/n)? n
Thank you for playing.

Hints:
* Seed your random number generator with time(0).
* Visual Studio users: Due to a flaw in the Visual Studio implementation of rand(), call rand() once after seeding to discard the first result.
* Use the getRandomNumber() function from lesson 5.9 -- Random number generation to pick a random number.
* Write a function that allows the user to play a single game of hi-lo.
* Write a function that asks the user if they want to play again and handles the looping logic for an incorrect input.

Show Solution

6.1 -- Arrays (Part I)
Index
5.11 -- Introduction to testing your code

172 comments to 5.x — Chapter 5 comprehensive quiz

  • Felipe

    Is the use of

    in this example justified since I don’t think I can use a loop instead since I need to be able to use

    later on outside the block?

    • Alex

      As far as goto goes, it’s not a pretty good use. Personally, I would have just wrapped that code in a loop, but that’s part of what makes programming fun -- there’s a lot of different ways to solve the same problem.

  • One Manual

    Hi Alex. I ended making a very different code for point 2.  Is this method very bad compared to your solution? I made everything in loops like this:

    • Alex

      I have a few thoughts about this code:
      1) srand() should be called once at the top of main and that’s it
      2) function tooToo() is horribly named and doesn’t really do enough to justify its existence
      3) Your main() function has too many nested loops that would be better as separate functions.

  • One Manual

    I did this instead. Its okay?

  • For the first question, I instead wrote a new function and called it in main. Is this acceptable?

  • SadmanTariq

    Help! Why does this not work?

    main.cpp

    constants.h

  • Satwant

    solution to problem 2.Have fun playing the game!!!

  • Nate

    Hello all! I put some comments in my solution to #2 and I made sure to only call srand() one time. Here is my full improved program.

    What do you think? Thanks for the feedback!

  • nikos-13

    Hello Alex, here’s my solution for #2, what do you think?

  • Nate

    First, I would like to compliment this C++ tutorial. It is the best C++ tutorial I have found so far and it does a good job of covering a whole lot. Nice job! I really would just like to share my solution to problem number two and get any way I can improve it. I realize I am calling srand() every time the playGame() function is called but besides that, how can I improve? Here is my solution to #2.

    This is probably the fifth time I read this tutorial because I want to read the parts that are updated and this is as good as I could get it so far.

    Thanks for the feedback!

  • Avijit Pandey

    I dont know why but my program never prints the reached on the gorund line

    it prints each line but never prints the final line
    i dont understand why this is happening .

    can you please tell me what is wrong ?

  • Souam Guha

    First off. Excellent tutorials! I am from Economics background and I’ve had very little trouble understanding these tutorials so far. Thank you so much for this website.

    Okay so for the Hi-Lo game, I wrote a completely different code. Although I am getting the desired output, could you please tell me how do I make my code better and what to avoid? Thanks In advance!

    My code:

    P.S: Apologies if I didn't use the syntax highlighter correctly.

  • saeid

    i used exite() in playGame function accord below:
    is it standard coding or not ?

    • Alex

      It’s not common to exit programs from non-main functions unless an error occurs. So no, not standard.

      You’d be better off using a return statement instead, so the caller can do any necessary cleanup.

  • Mohammad

    hi, i just wanted to share my code for question 2, any feedback is appreciated
    I also want to say that i really liked this quiz, thanks a lot.

  • I encountered some problems on qn2 in getRandomNumber function while using Mersenne Twister to generate random number. After spending much time got the function working but will this produce any issues??

    NOTE I used UINT_MAX instead of RAND_MAX any other better solution for this?

  • john

    Hi Alex. I have two questions after implementing the game of hi-lo. First, would you say it’s better to use while instead of do while in the case of infinite loop (easier to read, since we spot it right away)? My second question is about the function playAgain(). How would you compare my implementation of the function (below) to yours? Is there any reason you would prefer one over the other?

    • Alex

      Yes, if the loop condition is a constant (like yours is) then a while is better than a do-while because you can understand that it’s an infinite loop right away.

      For functions as straightforward as playAgain() is, I think it’s mostly a matter of style how you implement it. The only part of yours I think could use improving is that there’s a little bit of cognitive friction to determine what gets returned in the ‘y’ or ‘n’ cases. Because you only have two options here, I think it would be better to just be explicit about the return values:

      That’s easier to understand because it makes the return value simpler (no comparison needed).

  • Dan

    Hi Alex,
    I did question 1 a bit differently than you by putting a for loop into the calculateAndPrintHeight function. Would the way that I did it lead to any issues?

  • reznov

    So I tried to validate the input of the guess variable in quiz 2.
    Problems start occuring when the user enters values like 0,213 or 5,091.

    This input results into a 0 being read in (which is valid) the next time cin is called it will go into failure mode. This makes it very hard to check for valid input since I don’t want to call an extra cin to flush the digits up to the "," (would be really annoying for the users that do enter valid input). Yet I do need to flush those digits to let my cin go into failmode, or it will not recognize the failmode with cin.fail() until the next time I try to read a value. This is in the next iteration of my loops so I can’t use that behaviour. It will print:

    guess #1: 5,002
    That number is too low!
    guess #2:guess#2:

    As shown it only goes into failmode in the second iteration, then recognizes and fixes the problem. While the expected output should be:

    guess#1: 5,002
    guess#1:

    I can’t figure a way to properly test my code at something that is presumably an evil mixture of error cases 2 (extraneous input) and 3 (extraction fails) from 5.10.
    Am I missing something really easy here?

    • Alex

      There are two possibilities here:
      1) Read in your input as a string, validating the string, and the converting to a numeric value if the string validates.
      2) Do your read, ignore any line breaks, then check if there’s anything left in the iostream buffer. If there is, the user must have entered something invalid, otherwise it would have extracted. Something like this:

  • keikari

    Is this bad way to make this game?

  • Kılıçarslan

    Thanks for the great tutorials! Do you think this solution is any good or any bad?

  • Gapo

    What do you guys say about my code here ?

    • Alex

      Your program is called srand() every time you play again. You should only call it once at the top of main().
      Your randomNumGenerator() function has a lot of magic numbers, what are they doing?

  • bily salazar

    after two days of struggling with this assignment and almost giving up, i poured through all of the lessons again and looked up different ways of doing things.  here is what i came up with.  about 40 more lines than yours but i just finished it and haven’t done a second pass to clean it up.

    thank you so much for these tutorials!

  • Hugh Mungus

    Alex, can you take a look at my solution for the second question?

  • Ignacio

    This is my solution for the game, but Alex’s solution is cleaner

  • Jeppe

    Been following this tutorial for a while and just wanted to say thanks Alex, it is very awesome!

    My version of Quiz 1, less funtions but i think it does the job:

  • Adrian

    This is my solution to the second quiz, is there anything to be improved? I have used the Mersenne Twister to generate the random number.

  • Ryo

    Hello, this is my solution to question nr.2

    I made this after taking a break for 1 month from learning, so I hope it atleast follows the proper conventions of C++ that we have been taught so far.

  • Preston

    Hey Alex, what do you think of my solution to question 2? Unfortunately, using what I’ve covered so far I couldn’t find a way to reject decimal inputs, e.g. 18.5. I tried adding an extra std::cin after I import a value to x to see if there is more data waiting in the buffer - such as a period - but that only works if the user actually entered a decimal value. If the user entered an integer, then computer asks the user to input more data, defeating the purpose. My compromise was to have std::cin truncated decimals and then use cin.ignore to clear the rest of the buffer. Any ideas?

    • Alex

      Seems fine to me -- let std::cin extract to the integer, and then discard any extraneous input with std::cin.ignore().

      • Preston

        That’s what I’m currently doing. My question was, can you think of a way to have the program spit out an error if someone types in a decimal

        • Alex

          One way would be to have the user enter a string, then validate that the string is the proper format before converting it into an integer. I cover a little bit about input validation in lesson 13.5.

          There may be a better way to do this using cin directly -- but C++ I/O isn’t my strong point.

  • Raquib

    Hi Alex,

    I have done the quiz 2. It is working fine, and I don’t see a problem so far. So I would love if you make some comments on how I can improve it, whether I have followed the norms of good programming in your opinion, etc.

    //function.h

    //main.cpp

    Thanks. I am thoroughly enjoying how stuffs are building up slowly 🙂 Can’t wait to do object oriented programming and exception chapters.

    • Raquib

      ************************UPDATE*******************************************

      I have found some bugs here so I am updating the code a little bit---

      //in functions.cpp

      //And in functions.cpp

      Thanks.

  • Logan

    Hey Alex. Is this okay for the ball drop? I modified it a little so it can handle initial velocity.

    • Alex

      Yes, this is great. The only thing I would change is that I’d move the definition of dropSpeed below the loop, since the loop doesn’t use it. Declare your variables as close to their first use as possible. Well done.

  • Damien

    Hi Alex,

    If you have time, would you please be able to give some critique on my solution for question 2. I didn’t see the hints before i did it so my answer is a bit different. My main concern is that my program is hard to follow, with functions being inside the loops and it causing the path to jump around a bit. Still, this exercise was fun.

    Thanks again!

    io.h

    io.cpp

    main.cpp

    • Alex

      Your program actually looks pretty good, except for one thing. playGame() calls anotherGame(), which calls playGame(), which calls anotherGame()… If a user were to play this game enough times, the program would eventually run out of stack space and crash.

      It would be better to add a while loop into main() to continually call playGame() until anotherGame() returns false. That way, anotherGame() doesn’t explicitly have to call playGame().

  • hussein

    actually that was my question, the code compiles and i don’t know why it doesn’t give me error!

    • Alex

      Did you declare a variable named t somewhere in constants.h? If you did, then it would be getting copied into your main file since you #include constants.h.

      That’s the only thing I can think of.

  • hussein

    Hey Alex, can you look at this code and tell me what you think

    #include "stdafx.h"
    #include <iostream>
    #include "constants.h"

    [using namespace std;
    using namespace constants;
    double distanceFallen(double initialHeight, int t)
    {

        return initialHeight - (gravity*t*t) / 2;
    }
    int main()
    {

        cout << " Enter initial height of the ball: ";
        double initialHeight;
        cin >> initialHeight;
        int count = 0;
        for (t = 0; distanceFallen(initialHeight, t) >= 0; t++)
            cout << " At " << t << " seconds the ball is at height " << distanceFallen(initialHeight, t) << endl;
        cout << " …And finally the all hits the ground in " << t << " seconds " << endl;

    }]

  • Bw793

    Hi Alex! I just want to thank you for your great work with the lessons, which are clear and well based. Thanks also for your dedication to clarify doubts!

  • Arkadiusz Kupracz

    How can my code be improved?

    • Alex

      You could use a do-while loop instead of a while loop to remove the redundant call to playGame(). You could use demorgan’s law to distribute the ! sign inside playAgain(). srand() should only be called once at the start of the program, not every time a random number is picked.

  • Nicolas

    Hey, after first creating a very complex but functional program for question 1, I came up with this final solution. I was just wondering what you thought about it, and if you would have change anything (I know i should have put the constant in a header file but I didn’t for simplicity)

    • Alex

      My suggestions for improvement:
      1) Give your variables better names
      2) A few comments explaining what your functions are doing would go a long way
      3) You have redundant calls to calculateHeight(). This isn’t necessarily a problem, but is inefficient.

  • Vlad

    Hello again

    …and sorry for the persistence. So far, I have read your tutorial page by page, never going forward until the current lesson has sunked in. There may be some vague feelings but I suspect they’ll be gone with enough practise.

    For every page that had a quiz, I made sure I solved it without looking back in the lessons (one or two exceptions where the compiler complained about my syntax…), or in the q&a, or cheat by peeking under the hood. Again, I didn’t move forward until I have solved the problem.

    But these were fairly simple, the only reward was getting to the next chapter. This quiz, however, proved more challenging, because there already is quite a bit of knowledge to juggle with -- this coming from someone who only knew a few miligrams of programming, and not even those well enough. But I kept to my stubborn way and, well, I did it. I admit it took me a day (on-off, as time allowed), and towards the later part there was more hammering than logic, but I did it.

    Why am I saying this? Because, at this point, while I am comparing myself with the official result and others from the q&a, I am left wondering about how well I actually did. So, Alex, if I post the code, could you please be [extra-]critic about my results? I could really use some form of feedback, good or bad.

    Quiz 1 (additional printing of time@touchdown):

    constants.h

    main.cpp

    ---------
    Quiz 2 (additional choice after executing the program and some exceptions):

    main.cpp

    I apologize if this turns out to be a very lengthy post.

    • Alex

      Without commenting on specific items, I’ll say that for where you are in the tutorials, I think you’re doing a reasonably good job. I like that you’ve clearly labeled your “hacks” or things that you’re uncertain about. I don’t see anything egregious here, just a lot of room for optimization.

      • Vlad

        Thank you, I have noone to turn to for answers here so even a "no" would have meant a feedback. Fortunately, it’s more than that. 🙂 I know I am far from having the current chapter level, but, maybe with enough practise…

        I wanted to try a Newton-Raphson solver, but I don’t know yet how to parse a string and extract the terms into an array or some sort. I don’t see a 20th order equation entyered, term by term, with enter after each one, only to realize you made a mistake at term 19. Stackexchange has solutions, but they go over my head now, and I took a peak at the index only to reveal that I probably won’t be having any solver until chapter 13. Ah well, I have patience.

        Thank you for making this *understandable*.