沈思録第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;
}