⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame_step08.txt

📁 用什么语言能编制出好的程序
💻 TXT
字号:
//*****************************************************
//		Step 8   
//		
//  Desc: 1) 添加Frame,HCat,VCat等静态函数或全局函数。
//        2) 为将Node* 自动转换成Picture对象,添加Picture的私有构造函数
//		Picture(Node *p):pt(p) {}
//	  3) 添加main函数 
//*****************************************************

/----------------------- ProgramMain---------------------------
#include "Pictures.h"

char * array[]={"123","456","789"};

int main()
{
	Picture a(array,3,3);
	cout<<"a="<<endl;
	a.Display();

	Picture b=Picture::Frame(a);
	cout<<"b="<<endl;
	b.Display();

	Picture c=Picture::HCat(b,a);
	cout<<"c="<<endl;
	c.Display();

	Picture d=Picture::Frame(Picture::VCat(c,b));
	cout<<"d="<<endl;
	d.Display();
	return 0;
}

//------------------  Pictures.cpp  ---------------------
#include "Pictures.h"

Picture Picture::Frame(const Picture& org)
{
	return Picture(new FramePic(org));
}
Picture Picture::HCat(const Picture& one,const Picture& two)
{
	return Picture(new HCatPic(one,two));
}
Picture Picture::VCat(const Picture& one,const Picture& two)
{
	return Picture(new VCatPic(one,two));
}


Picture::Picture(char ** array,int wd, int ht)
:pt(new DataPic(array,wd,ht)) 
{
}

Picture::~Picture()		
{
	ReleaseRef();
}
Picture::Picture(const Picture& rhs)
{
	pt=rhs.pt;
	AddRef();
}
Picture& Picture::operator=(const Picture& rhs)
{
	if (this==&rhs) return (*this);
	ReleaseRef();
	pt=rhs.pt;
	AddRef();
	return (*this);
}

int	 Picture::Width() const
{ 
	return pt->Width(); 
} 
int  Picture::Height() const
{
	return pt->Height();
}

void Picture::AddRef()
{
	++pt->use;
}
void Picture::ReleaseRef()
{
	if (--pt->use==0)
		delete pt;
}

// new added
//-------------------------------------------------------
void Picture::Display() const
{
	int ht=Height();
	int wd=Width();
	for (int row=0;row<ht;row++) 
	{
		DisplayLine(row,wd);
		cout<<endl;
	}
}
void Picture::DisplayLine(int lineno,int wd) const
{
	pt->DisplayLine(lineno,wd); 
}

void Node::Pad(int from,int to)
{
	for (int i=from;i<to;i++)
		cout<<" ";
}

void DataPic::DisplayLine(int lineno,int wd) const
{
	if(lineno>=0 && lineno<Height()) {
		int len=Width();
		for(int i=0;i<len;i++)
			cout<<data[lineno*len+i];
		Pad(len,wd);
	}else {
		Pad(0,wd);
	}
	
}
void FramePic::DisplayLine(int lineno,int wd) const
{
	if (lineno>=0 && lineno<Height()) {
		if ((lineno==0) ||(lineno==Height()-1)) { //顶或底
			cout<<"+";
			int len=kernel.Width();
			for (int i=0;i<len;i++) cout<<"-";
			cout<<"+";
		}else { //内部
			cout<<"|";
			int len=kernel.Width();
			kernel.DisplayLine(lineno-1,len);
			cout<<"|";
		}
		Pad(Width(),wd);
	}else { //越界
		Pad(0,wd);
	}
}
void HCatPic::DisplayLine(int lineno,int wd) const
{
	left.DisplayLine(lineno,left.Width());
	right.DisplayLine(lineno,right.Width());
	Pad(Width(),wd);
}
void VCatPic::DisplayLine(int lineno,int wd) const
{
	if ((lineno>=0) && (lineno<top.Height()))
		top.DisplayLine(lineno,wd);
	else if (lineno<top.Height()+bottom.Height())
		bottom.DisplayLine(lineno-top.Height(),wd);
	else
		Pad(0,wd);
}





//------------------  Pictures.h  ---------------------
#ifndef PICTURESH
#define PICTURESH

#include <iostream.h>
class Node;

class Picture
{
public:
	static Picture Frame(const Picture& org);
	static Picture HCat(const Picture& one,const Picture& two);
	static Picture VCat(const Picture& one,const Picture& two);
public:
	Picture(char ** array,int wd, int ht);
	~Picture();
	Picture(const Picture& rhs);
	Picture& operator=(const Picture& rhs);	
public:
	void Display() const;
	void DisplayLine(int row,int wd) const;
	int  Width() const;
	int  Height() const;
private:
	Picture(Node * p):pt(p) {}
	void AddRef();
	void ReleaseRef();	
private:
	Node *  pt;
};
//-------------------------------------------------------
class Node
{
	friend class Picture;
public:
	Node():use(1)   {}		
	virtual ~Node()	{}
	virtual void DisplayLine(int row,int wd) const=0;
	virtual  int  Width()  const=0;
	virtual  int  Height() const=0;
protected:	
	static int max(int a,int b) {return a>b?a:b;}
	static void Pad(int from,int to);
private:
	int  use;
};
//------------------------------------------------------
class DataPic:public Node
{
public:
	DataPic(char ** array,int wd, int ht):w(wd),h(ht)
	{	
		data=new char[w*h];
		for (int i=0;i<h;i++)
			for (int j=0;j<w;j++)
				data[i*w+j]=array[i][j];

	}
	~DataPic()	{delete[] data;}
protected:
	void 		DisplayLine(int row,int wd) const;
	int		Width() const	{return w;}
	int		Height() const	{return h;}
private:
	DataPic(const DataPic& rhs);		//no define
	DataPic& operator=(const DataPic& rhs);	//no define
private:
	int		w;
	int		h;
	char *	data;
};
//------------------------------------------------------
class FramePic:public Node
{
public:
	FramePic(const Picture& rhs):kernel(rhs) {}  
	~FramePic() {}
protected:
	void DisplayLine(int row,int wd) const;
	int Width() const	{return kernel.Width()+2;}
	int Height() const	{return kernel.Height()+2;}
private:
	Picture	kernel;
};
//------------------------------------------------------
class HCatPic:public Node
{
public:
	HCatPic(const Picture& lpic,const Picture& rpic)
		:left(lpic),right(rpic) {}	
	~HCatPic() {}
protected:
	void DisplayLine(int row,int wd) const;
	int Width() const    {return left.Width()+right.Width();}
	int Height() const   {return max(left.Height(),right.Height());}
private:
	Picture		left;
	Picture		right;
};
//------------------------------------------------------
class VCatPic:public Node
{
public:
	VCatPic(const Picture& tpic,const Picture& bpic)
		:top(tpic),bottom(bpic) {}	
	~VCatPic() {}
protected:
	void DisplayLine(int row,int wd) const;
	int Width() const  {return max(top.Width(),bottom.Width());}
	int Height() const {return top.Height()+bottom.Height();}
private:
	Picture		top;
	Picture		bottom;
};
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -