沉思录第9章笔记

额,今天没什么效率啊,光顾着在网上瞎逛了

#include<iostream>
using namespace std;

class Picture{
	friend ostream& operator<<(ostream&,const Picture &);
	friend Picture frame(const Picture&);
	//纵向连接
	friend Picture operator&(const Picture&,const Picture&);
	//横向连接
	friend Picture operator|(const Picture&,const Picture&);
public:
	Picture();
	Picture(const char * const*,int);
	Picture(const Picture&);
	~Picture();
	Picture& operator=(const Picture&);

private:
	int height,width;
	char *data;
	void copyblock(int,int,const Picture&);
	char& position(int,int);
	char position(int,int)const;
	void clear(int,int,int,int);
	void init(int,int);
	static int max(int,int);

};
Picture::Picture():height(0),width(0),data(0){}
Picture::Picture(const Picture&p):height(p.height),width(p.width),
	data(new char[p.height*p.width])
{

	copyblock(0,0,p);
}
Picture::~Picture()
{

	delete []data;
}
Picture::Picture(const char * const* array,int n)
{

	int w=0;
	int i;
	for(i=0;i<n;i++)
		w=Picture::max(w,strlen(array[i]));
	init(n,w);
	for(i=0;i<n;i++){
		const char *src=array[i];
		int len=strlen(src);
		int j=0;
		while(j<len){
			position(i,j)=src[j];
			j++;
		}
		while(j<width){
			position(i,j)=' ';
			j++;
		}
	}
}

Picture& Picture::operator=(const Picture&p)
{

	if(this!=&p){
		delete[]data;
		init(p.height,p.width);
		copyblock(0,0,p);
	}
	return *this;
}
void Picture::copyblock(int row,int col,const Picture& p)
{

	for(int i=0;i<p.height;i++){
		for(int j=0;j<p.width;j++){
			position(row+i,col+j)=p.position(i,j);
		}
	}

}
void Picture::init(int  h,int w)
{
	height=h;
	width=w;
	data=new char[height*width];
}
int Picture::max(int m,int n)
{
	return m>n?m:n;

}
ostream& operator<<(ostream& o,const Picture &p)
{
	for(int i=0;i<p.height;i++){
		for(int j=0;j<p.width;j++)
			o<<p.position(i,j);
		o<<endl;
	}
	return o;
}
char&  Picture::position(int row,int col)
{
	return data[row*width+col];
}
char Picture::position(int row,int col)const
{
	return data[row*width+col];
}
Picture frame(const Picture&p)
{

	Picture r;
	r.init(p.height+2,p.width+2);
	r.copyblock(1,1,p);
	for(int i=1;i<r.height-1;i++){
		r.position(i,0)='|';
		r.position(i,r.width-1)='|';
	}
	for(int j=1;j<r.width-1;j++){
		r.position(0,j)='-';
		r.position(r.height-1,j)='-';

	}
	r.position(0,0)='+';
	r.position(0,r.width-1)='+';
	r.position(r.height-1,0)='+';
	r.position(r.height-1,r.width-1)='+';

	return r;

}

Picture operator&(const Picture&p,const Picture&q)
{
	Picture r;
	r.init(p.height+q.height,Picture::max(p.width,q.width));
	r.clear(0,p.width,p.height,r.width);
	r.clear(p.height,q.width,r.height,r.width);
	r.copyblock(0,0,p);
	r.copyblock(p.height,0,q);
	return r;

}
Picture operator|(const Picture&p,const Picture&q)
{
	Picture r;
	r.init(Picture::max(p.height,q.height),p.width+q.width);
	r.clear(p.height,0,r.height,p.width);
	r.clear(q.height,p.width,r.height,r.width);

	r.copyblock(0,0,p);
	r.copyblock(0,p.width,q);
	return r;

}
//设置对应坐标的内容为空
//比如连接操作后有部分内容需要设为空的
void Picture::clear(int r1,int c1,int r2,int c2)
{

	for(int r=r1;r<r2;r++)
		for(int c=c1;c<c2;c++)
			position(r,c)=' ';
}

int main(){

	char *init[]={"Paris","in the","spring"};
	Picture p(init,3);
	Picture f=frame(p);
	cout<<p<<endl;
	cout<<f<<endl;
	cout<<(p|f)<<endl;
	cout<<(p&f)<<endl;
	int i;
	cin>>i;
	return 0;


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值