C++ DLUT上机作业(四)
啥都不说,直接来
1、intArray
设计整型数组类intArray,实现若干数据的相关操作,
包括构造函数以及重载以下运算符《、》、[]、++、=。
以此为基类派生一个整型集合类intSet,实现集合的如下操作:
1)增加某个整型元素时,保证集合中没有重复元素,
如果超过集合的容量,集合的大小自动扩充为原来的一倍。
2) 删除指定的元素,若该元素在集合中则从集合中删除该元素;
3)重载运算符+、*、- ,实现两个集合对象的合并、和交集和补集操作
#include<iostream>
using namespace std;
class intArray
{
protected:
int *p;
int size;
int number;
public:
intArray( int num=0);
void add( int data );
bool del( int data );
intArray operator [](int s);
intArray operator =(const intArray& s);
intArray operator ++();
friend ostream& operator << ( ostream& out , const intArray& s );
friend istream& operator >> (istream& out, const intArray& s);
~intArray(){}
};
intArray::intArray( int num )
{
size = num;
number = 0;
if (num)
p = new int[num];
else
p = NULL;
}
void intArray::add( int data )
{
int* q;
if (p == NULL)
{
p = new int[1];
p[0] = data;
number = size = 1;
}
else
{
if (number == size)
{
size*=2;
q = new int[size];
for (int i = 0; i <number; i++)
{
q[i] = p[i];
}
q[number++] = data;
delete [] p;
p = q;
}
else
p[number++] = data;
}
}
bool intArray::del( int data )
{
int i,j=0,flag=0;
for( i=0 ; i<number; i++ )
{
if( data!=p[i] )
{
p[j]=p[i];
j++;
}
else
{
flag=1;
}
}
if(flag)
{
number--;
return 1;
}
else return 0;
}
intArray intArray::operator [](int s)
{
size = s;
return *this;
}
intArray intArray::operator=(const intArray& s)
{
number = s.number;
size = s.size;
for (int i = 0; i < s.number; i++)
{
this->add(s.p[i]);
}
return *this;
}
intArray intArray::operator++()
{
for (int i = 0; i < number ; i++)
{
p[i] = p[i] + 1;
}
return *this;
}
ostream& operator << ( ostream& out , const intArray& s )
{
for (int i = 0; i < s.number; i++)
{
out << s.p[i] << " ";
}
out << endl;
return out;
}
istream& operator >> (istream& in, const intArray& s)
{
in >> s.p[s.number + 1];
return in;
}
class intSet :public intArray
{
public:
intSet(int n=0)
{
intArray s(n);
}
intSet operator + ( const intSet& s );
intSet operator * ( const intSet& s );
intSet operator - ( const intSet& s );
};
intSet intSet::operator + ( const intSet& s )
{
intSet temp;
int flag=1;
for(int i=0;i<number;i++)
{
for(int k=0;k<s.number;k++)
if(p[i]==s.p[k])
{
flag=0;
}
if(flag)
temp.add(p[i]);
}
for(int i=0;i<s.number;i++)
{
temp.add(s.p[i]);
}
for(int i=0;i<number;i++)
{
for(int j=0;j<s.number;j++)
{
}
}
return temp;
}
intSet intSet::operator * ( const intSet& s )
{
intSet temp;
int i,j,m=0;
for (i = 0; i <number; i++)
{
temp.add(p[i]);
}
for( i=0 ; i<s.number; i++ )
{
for( j=0 ; j<temp.number; j++ )
{
if( s.p[i]==temp.p[j] )
{
temp.p[m]=temp.p[j];
m++;
}
}
}
temp.number=m;
return temp;
}
intSet intSet::operator-(const intSet& s)
{
intSet temp;
for(int i=0;i<s.number;i++)
{
temp.add(s.p[i]);
}
for(int i=0;i<number;i++)
{
temp.del(p[i]);
}
return temp;
}
int main()
{
intSet s1(6);
s1.add(4);
s1.add(5);
s1.add(8);
s1.add(2);
cout<<"s1:"<<endl;
cout<<s1;
intSet s2(2);
s2.add(2);
s2.add(8);
s2.add(9);
s2.add(6);
intSet s3;
intSet s4(7);
s4.add(2);
s4.add(4);
s4.add(5);
s4.add(6);
s4.add(8);
s4.add(0);
cout<<"s2:"<<endl;
cout<<s2;
s3=s1;
cout<<"s3=s1赋值后:"<<endl;
cout<<s3;
++s3;
cout<<"s3自增后:"<<endl;
cout<<s3;
cout<<"s4:"<<endl;
cout<<s4;
cout<<"s1与s2交集:"<<endl;
cout<<s1*s2;
cout<<"s1与s2并集:"<<endl;
cout<<s1+s2;
cout<<"s1与s4补集:"<<endl;
cout<<s1-s4;
return 0;
}
2、Goods
已知如下商品类Goods的声明,利用该类Goods设计商品记录类Record。
请给出这两个类的完整定义,使之能够满足相关的功能,并通过main()函数中测试。
class Goods
{
char id[6]; //商品编号
char* name; //商品名称
double price; //商品价格
public:
Goods(const char* id=”00001”, char* pname=”Goods”, double d=0);
~Goods();
void setPrice(double);
double getPrice()const;
const char* getID();
void show() const; //输出商品所有的信息,格式: [商品编号] 商品名称: 价格
…… //其他成员函数
};
class Record // 商品记录类
{
Goods goods; //商品
double cost; //消费金额=商品价格*统一折扣率
static double discount; //统一折扣率,默认值为0.8
public:
…… //添加参数构造函数、默认构造以及重载元算符号函数
};
#include<iostream>
#include<cstring>
using namespace std;
class Goods{
private:
char id[6]; //商品编号
char* name; //商品名称
double price; //商品价格
public:
Goods();
Goods(const char* n,const char* pname,double d);
~Goods(){
delete [] name;
}
void setPrice(double);
double getPrice()const;
const char* getID();
void show() const; //输出商品所有的信息,格式: [商品编号] 商品名称: 价格
friend istream& operator>>(istream& in,Goods& g);
};
class Record // 商品记录类
{
private:
Goods goods; //商品
double cost; //消费金额=商品价格*统一折扣率
static double discount; //统一折扣率,默认值为0.8
public://添加参数构造函数、默认构造以及重载元算符号函数
Record()
{
Goods g;
goods=g;
}
~Record(){}
Record(Goods& g)
{
goods=g;
cost=g.getPrice()*discount;
}
static double getdiscount();
friend ostream& operator<<(ostream& out,Record& r);
};
Goods::Goods()
{
strcpy(id,"00001");
name = new char[6];
strcpy(name,"Goods");
price=0;
}
Goods::Goods(const char* n,const char* pname,double d)
{
strcpy(id,n);
name = new char[strlen(pname) + 1];
strcpy(name,pname);
price=d;
}
void Goods::setPrice(double d)
{
price=d;
}
double Goods::getPrice()const
{
return price;
}
const char* Goods::getID()
{
return id;
}
void Goods::show()const
{
cout<<"["<<id<<"] "<<name<<": "<<price<<endl;
}
istream& operator>>(istream& in,Goods& g)
{
in>>g.id;
in>>g.name;
in>>g.price;
return in;
}
ostream& operator<<(ostream& out,Record& r)
{
r.goods.show();
if(r.goods.getPrice()==0)
r.cost=0;
out<<"消费金额: "<<r.cost<<"RMB"<<endl;
return out;
}
double Record::discount=0.8;
double Record::getdiscount()
{
return discount;
}
int main()
{
Goods food("200103","桃李面包",2.5), dress;
cin >> dress; // 例如, 输入("100415","T-shirt",129);
food.show(); //输出 [200103] 桃李面包: 2.5RMB
cout << "折扣率:" << Record::getdiscount()<< endl;
Record r1(food);
Record r2(dress);
Record r3;
cout <<r1<<r2<<r3;
return 0;
}
3、Cpoint
利用一个平面点类CPoint设计矩形类CRectangle类(边均与坐标轴平行),要求:
请给出相关成员函数的定义,使之能够满足相关的功能。
例如,判断矩形的种类、 计算图形面积与边长以及输出相关的信息。
请给出这两个类的完整定义,使其通过main()函数中测试。注意不能声明友元类!
#include <iostream>
#include <cmath>
using namespace std;
class CPoint
{
double X, Y; //点的横纵坐标
public:
CPoint()
{
X=0;
Y=0;
}
CPoint(double x, double y)
{
X=x;
Y=y;
}
double getX()
{
return X;
}
double getY()
{
return Y;
}
double distance(const CPoint &a)
{
return abs((a.X-X)*(a.X-X)+(a.Y-Y)*(a.Y-Y));
}
void print()
{
cout<<" "<<" "<<endl;
}
void setX(double d) {
X=d;
}
void setY(double d) {
Y=d;
}
};
class CRectangle
{
private:
CPoint p1, p2; //矩形的左上顶点及右下角顶点
double length; //长边边长
double width; //短边边长
int type; //0:-非矩形,1-正方形,2,矩形
static int num; //所有矩形对象个数
public:
CRectangle(CPoint a,CPoint b)
{
p1.setX(a.getX());
p1.setY(a.getY());
p2.setX(b.getX());
p2.setY(b.getY());
if(a.getX()!=b.getX()&&a.getY()!=b.getY())
num++;
cmp();
}
void cmp()
{
if(p2.getX()-p1.getX()>p1.getY()-p2.getY())
{
length=abs(p2.getX()-p1.getX());
width=abs(p1.getY()-p2.getY());
}
else if(p2.getX()-p1.getX()<p1.getY()-p2.getY())
{
length=abs(p1.getY()-p2.getY());
width=abs(p2.getX()-p1.getX());
}
else
{
length=abs(p2.getX()-p1.getX());
width=abs(p1.getY()-p2.getY());
}
}
double getLength()
{
return length;
}
double getWidth()
{
return width;
}
double getArea()
{
return length*width;
}
int getType()
{
if(length==0||width==0)
{
return 0;
}
else if(length==width)
{
return 1;
}
return 2;
}
static int showCount()
{
return num;
}
};
int CRectangle::num = 0;
ostream& operator<<(ostream &obj,CRectangle &p)
{
if(p.getType()==0)
obj<<"不能构成矩形"<< endl;
if(p.getType()==1)
obj<<"长为"<<p.getLength()<<",宽为"<<p.getWidth()<<",矩形"<<",面积为"<<p.getArea()<<endl;
if(p.getType()==2)
obj<<"长为"<<p.getLength()<<",宽为"<<p.getWidth()<<",正方形"<<",面积为"<<p.getArea()<<endl;
return obj;
}
int main()
{
CPoint p1(1, 1), p2(4, 5);
CRectangle rec1(p1, p2);
cout << rec1;
// cout << "长为" << rec1.getLength() << "宽为" << rec1.getWidth() << endl; //计算边长
CPoint p3(2, 2), p4;
CRectangle rec2(p4, p3);
cout << rec2; //输出“ 长为2, 宽为2,正方形,面积为4”
CRectangle rec3(p3, p3);
if (rec3.getType() == 0)
cout <<"不能构成矩形"<< endl;
cout << "有效矩形数目:"<< CRectangle::showCount()<<endl; //输出2
return 0;
}
4、Account
编写一个银行账号类(Account),包括私有数据成员:
用户int id号,类型int type(1-储蓄卡,2-信用卡),
用户名char* name、密码char password[10]和资产金额double balance。
注册新的用户时id号由系统自动设置(第一个储蓄用户id为100001,第二个储蓄用户id为100002;
第一个信用用户id为200001,第二个信用用户id为200002;以此类推),
定义如下成员函数, 请给出这个类的完整定义,并在主函数中测试所有功能。
1)重载构造函数,根据id号和用户名构造一个新用户,并将密码初始化为000000;
2)定义一组常成员函数get(),返回id号和用户名的函数;
3) void setName (char* ),用于更改用户名;
4) bool setPass(), 实现更改密码的操作(要求输入旧密码和新密码),
只有输入的旧密码正确的情况下才能修改密码,并进行操作是否成功的提示。
5)取款函数bool pay( double money); //判断能否成功取款
存款函数void earn( double money); //计算存并返回资产总额
6)重载运算符<<, 显示用户信息(id, name和balance)
7) 重载运算符+=,实现存款功能
#include<iostream>
#include<cstring>
using namespace std;
class Account{
private:
int id;
int type;
char *name;
char password[10];
double balance;
public:
Account();
~Account()
{
delete [] name;
}
Account(const char *nam);
Account(const char *nam,int typ);
Account(const char *nam,int typ,double money);
void setname(char* p);
void settype();
int getid()const;
char* getname()const;
bool setPass();
bool withdraw(double money);
double earn(double money);
friend ostream& operator<<(ostream& out,Account &a);
Account &operator+=(double money);
};
int num1=1,num2=1;
Account::Account()
{
id=num1+100000;
num1++;
name=new char[8];
strcpy(name,"no name");
strcpy(password,"000000");
balance=100;
}
Account::Account(const char* nam)
{
id=num1+100000;
num1++;
name=new char[8];
strcpy(name,nam);
strcpy(password,"000000");
balance=100;
}
Account::Account(const char* nam,int typ)
{
if(typ==1)
{
id=num1+100000;
num1++;
}
if(typ==2)
{
id=num2+200000;
num2++;
}
name=new char[20];
strcpy(name,nam);
strcpy(password,"000000");
balance=100;
}
Account::Account(const char *nam,int typ,double money)
{
if(typ==1)
{
id=num1+100000;
num1++;
}
if(typ==2)
{
id=num2+200000;
num2++;
}
name=new char[20];
strcpy(name,nam);
strcpy(password,"000000");
balance=money;
}
void Account::setname(char *p)
{
if(name)
delete [] name;
name=new char[strlen(p)+1];
strcpy(name,p);
}
void Account::settype()
{
cout<<"输入种类(1-储蓄卡,2-信用卡):"<<endl;
cin>>type;
}
int Account::getid()const
{
return id;
}
char* Account::getname()const
{
return name;
}
bool Account::setPass()
{
char p[10];
cout<<"输入旧密码:"<<endl;
cin>>p;
if(strcmp(password,p)!=0)
{
return false;
}
cout<<"输入新密码:"<<endl;
cin>>p;
strcpy(password,p);
return true;
}
bool Account::withdraw(double money)
{
balance=balance-money;
if(balance>=0)
return 1;
return 0;
}
double Account::earn(double money)
{
balance=balance+money;
return balance;
}
ostream& operator<<(ostream& out,Account &a)
{
out<<"id:"<<a.id<<endl;
out<<"name:"<<a.name<<endl;
out<<"balance:"<<a.balance<<endl;
out<<"---------------------"<<endl;
return out;
}
Account &Account::operator+=(double money)
{
balance=balance+money;
return *this;
}
int main()
{
Account a1("test1"),a2("test2",1,250.00),a3("test3",2);
cout<<a1.getname()<<", id = "<< a1.getid()<<endl; //输出 “test1, id=10001”
if(a2.setPass())//设置密码
{
cout<<"重置密码成功"<<endl;
}
else
{
cout<<"重置密码失败"<<endl;
}
cout<<"输入money(默认balance为100):"<<endl;
double money ;
cin>>money; //例如输入200
a1.withdraw(money); //提款,无法成功提取
a2.withdraw(money); //提款,成功提取,资产金额减少
a3.withdraw(money); //透支,成功提取,资产金额减少
a1.earn(123.45); //存款
a3.earn(100); //还款
cout<<a1<<a3; //显示用户信息(id, name和balance)
cout<<(a2+=200); // 向a2存款200元,显示用户信息
return 0;
}
溜了溜了