123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- //error5.cpp -- unwinding the stack
- #include <iostream>
- #include <cmath> // or math.h, unix users may need -lm flag
- #include <string>
- #include "exc_mean.h"
- class demo
- {
- private:
- std::string word;
- public:
- demo (const std::string & str)
- {
-
- word = str;
- std::cout << "demo " << word << " created\n";
- }
- ~demo()
- {
- std::cout << "demo " << word << " destroyed\n";
- }
- void show() const
- {
- std::cout << "demo " << word << " lives!\n";
- }
- };
- // function prototypes
- double hmean(double a, double b);
- double gmean(double a, double b);
- double means(double a, double b);
- int main()
- {
- using std::cout;
- using std::cin;
- using std::endl;
-
- double x, y, z;
- {
- demo d1("found in block in main()");
- cout << "Enter two numbers: ";
- while (cin >> x >> y)
- {
- try { // start of try block
- z = means(x,y);
- cout << "The mean mean of " << x << " and " << y
- << " is " << z << endl;
- cout << "Enter next pair: ";
- } // end of try block
- catch (bad_hmean & bg) // start of catch block
- {
- bg.mesg();
- cout << "Try again.\n";
- continue;
- }
- catch (bad_gmean & hg)
- {
- cout << hg.mesg();
- cout << "Values used: " << hg.v1 << ", "
- << hg.v2 << endl;
- cout << "Sorry, you don't get to play any more.\n";
- break;
- } // end of catch block
- }
- d1.show();
- }
- cout << "Bye!\n";
- // cin.get();
- // cin.get();
- return 0;
- }
- double hmean(double a, double b)
- {
- if (a == -b)
- throw bad_hmean(a,b);
- return 2.0 * a * b / (a + b);
- }
- double gmean(double a, double b)
- {
- if (a < 0 || b < 0)
- throw bad_gmean(a,b);
- return std::sqrt(a * b);
- }
- double means(double a, double b)
- {
- double am, hm, gm;
- demo d2("found in means()");
- am = (a + b) / 2.0; // arithmetic mean
- try
- {
- hm = hmean(a,b);
- gm = gmean(a,b);
- }
- catch (bad_hmean & bg) // start of catch block
- {
- bg.mesg();
- std::cout << "Caught in means()\n";
- throw; // rethrows the exception
- }
- d2.show();
- return (am + hm + gm) / 3.0;
- }
|