------------------------------------------------------------------------------
MC logo
Change Adder
[^] CSc 220 Home
------------------------------------------------------------------------------
[Introduction] [Boolean and Control] [Functions] [Arrays and Pointers] [Dynamic Arrays] [Array Errors] [Command Array] [Standard Containers] [Structs and Classes] [Automatic Pointer] [Multi-File Programs] [Copying Objects] [Templates] [Inheritance] [Plain C I/O] [Type Odds And Ends] [Plain C Strings] [File I/O]
[Counted Average Example] [For Loop Average] [For Loops] [Read-To-End Average] [Reading In the While Test] [Counting Example 1] [Counting Example 2] [Counting Example 3] [Counting Example 4] [Counting Example 5] [Watch Out For This] [Switch] [Switch Using Break] [Break and Continue] [Change Adder]
changer.cpp
/*
 * Adds up the coins.  Enter each one as an optional integer followed by a
 * a letter giving the type of coin: p, n, d, q, h.  Enter s (for stop) to end.
 */

#include <iostream>

using namespace std;

main()
{
        int total = 0;          // Total value of the coins.

        // Go until we stop with a break.
        while(true) {
                // Read in the count.  If there is no count, this will fail.
                // If it fails at the end-of-file (not more input), then stop.
                // Otherwise, assume the count was just omitted and set it to 1
                // and clear the error so we can continue to use the input 
                // stream.
                int count;
                cin >> count;
                if(cin.eof()) 
                        break;
                else if(!cin.good()) {
                        count = 1;
                        cin.clear();
                }

                // Read the character for the coin type.
                char coin_type;
                cin >> coin_type;

                // If we got a 's', or if the read failed, enough of this.
                if(!cin.good() || coin_type == 's') break;

                // If the count is less than one, the user needs to try
                // again.
                if(count < 1) {
                        cout << "Count is non-positive.  Try again." << endl;
                        continue;
                }

                // Convert the coin type to its value.
                int value;
                switch(coin_type)
                {
                case 'p':
                        value = 1;
                        break;
                case 'n':
                        value = 5;
                        break;
                case 'd':
                        value = 10;
                        break;
                case 'q':
                        value = 25;
                        break;
                case 'h':
                        value = 50;
                        break;
                default:
                        cout << "Unknown coin type " << coin_type << endl;
                        continue;
                }

                // Add to the total.
                total += count*value;
        }

        // Divide the total into dollars and cents.
        int dollars = total / 100;
        int cents = total % 100;

        // Print the total as dollars and cents, trying to make a human-like
        // message.
        cout << "You have ";
        if(total == 0)
                cout << "nothing.  Sorry about that";
        else {
                if(dollars > 0) {
                        cout << dollars << " dollar";
                        if(dollars > 1) cout << "s";
                        if(cents == 0) 
                                cout << " even";
                        else
                                cout << " and ";
                }
                if(cents > 0) {
                        cout << cents << " cent";
                        if(cents > 1) cout << "s";
                }
        }
        cout << "." << endl;
}

Things to notice: