您的位置:首页 > 编程语言 > C语言/C++

chapter5test4

2015-07-01 22:48 513 查看
累死我了,整个晚上都在写这一个程序,总算是出来了,thank Godness

ssale.h

#ifndef SALE_

#define SALE_

#include<stdexcept>

#include<string>

class sale

{

public:
enum{month=12};

private:
double gross[month];
int year;

public:
class bad_index :public std::logic_error
{
private:
int bin;
public:
explicit bad_index(int ix, const std::string &s= "Index error in sales objects.");
int bin_val() const{ return bin; }
virtual ~bad_index() throw(){}
};
explicit sale(int yy = 0);
sale(int yy, const double *gr, int n);
virtual ~sale(){}
int Year()const{ return year; }
virtual double &operator[](int i);
virtual double operator[](int i)const;

};

class label :public sale

{

private:
std::string lable;

public:
class nbad_index:public sale::bad_index
{
private:
std::string lbin;
public:
nbad_index(const std::string &lb,int ix, const std::string &s = "Index error in lable objects.");
const std::string &lable_val()const { return lbin; }
virtual ~nbad_index()throw(){}
};
explicit label(const std::string &lb = "none", int yy = 0);
label(const std::string &lb, int yy, const double *gr, int n);
virtual ~label(){}
const std::string &lable_val() const{ return lable; }
virtual double &operator[](int i);
virtual double operator[](int i)const;

};

#endif

sale.cpp

#include<iostream>

#include"sale.h"

using std::string;

sale::bad_index::bad_index(int ix, const std::string &s) :std::logic_error(s), bin(ix)

{

}

sale::sale(int yy)

{
year = yy;
gross[month] = { 0 };

}

sale::sale(int yy, const double *gr, int n)

{
year = yy;
int lim = (n < month) ? n : month;
int i;
for (i = 0; i < lim; i++)
gross[i] = gr[i];

}

double &sale::operator[](int i)

{
if (i<0 || i>month - 1)
throw (new bad_index(i));
return gross[i];

}

double sale::operator[](int i)const

{
if (i<0 || i>month - 1)
throw bad_index(i);
return gross[i];

}

label::nbad_index::nbad_index(const std::string &lb, int ix, const std::string &s) :sale::bad_index(ix,s)

{
lbin=lb;

}

label::label(const std::string &lb, int yy) : sale(yy)

{
lable = lb;

}

label::label(const std::string &lb, int yy, const double *gr, int n) : sale(yy, gr, n)

{
lable = lb;

}

double &label::operator[](int i)

{
if (i<0 || i>month - 1)
throw (new nbad_index(lable_val(),i));
return sale::operator[](i);

}

double label::operator[](int i)const

{
if (i<0 || i>month - 1)
throw nbad_index(lable_val(), i);
return sale::operator[](i);

}

user.cpp

#include<iostream>

#include<cstdlib>

#include"sale.h"

int main()

{
using namespace std;
double arr1[12] = { 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2019, 2010, 2011 };
double arr2[12] = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
sale s1(2011, arr1, 12);
label s2("Blogstar", 2012, arr2, 12);
sale::bad_index *p1;
label::nbad_index *p2;
cout << "First try block :\n";
try{
int i;
cout << "Year =" << s1.Year() << endl;
for (i = 0; i < 12; ++i)
{
cout << s1[i] << ' ';
if (i % 6 == 5)
cout << endl;
}
cout << "Year= " << s2.Year() << endl;
cout << "Lable= " << s2.lable_val() << endl;
for (i = 0; i < 13; ++i)
{
cout << s2[i] << ' ';
if (i % 6 == 5)
cout << endl;
}
cout << "End of our try.\n";
}

catch (sale::bad_index *b)
{
label::nbad_index *p;
if (p = dynamic_cast<label::nbad_index *>(b))
{
cout<<p->what();
cout << "Company :" << p->lable_val() << endl;
cout << "Bad_index :" << p->bin_val() << endl;
}
else
{
cout << b->what();
cout << "Bad_index :" << b->bin_val() << endl;
}
}

cout << "Try next block :\n";
try{
s2[2] = 37.5;
s1[28] = 3008;
cout << "End of block 2 .\n";
}
catch (sale::bad_index *b)
{
label::nbad_index *p;
if (p = dynamic_cast<label::nbad_index *>(b))
{
cout<<p->what();
cout << "Company :" << p->lable_val() << endl;
cout << "Bad_index :" << p->bin_val() << endl;
}
else
{
cout << b->what();
cout << "Bad_index :" << b->bin_val() << endl;
}
}
cout << "Done !\n";
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++