C++沉思录笔记 —— 第九章:一个课堂练习的分析(上)

目标:编写一系列用以操纵“字符图像”的类与函数。所谓的“字符图像”,就是一个可打印的矩形字符阵列。

9.6之前的代码:

Picture.h

#include <iostream>

#include <cstring>

using namespace std;

class Picture{

    friend ostream& operator<<(ostream&, const Picture&);

public:

    Picture(): height(0), width(0), data(0) {}

    int max(int m, int n) { return m > n ? m : n; }

    void init(int h, int w){

        height = h;

        width = w;

        data = new char[height * width];

    }   

    Picture(const char* const* array, int n){

        int w = 0;

        int i;

        for(i=0; i<n; i++)

            w = 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(const Picture& p): height(p.height), width(p.width), data(new char[p.height * p.width]){ copyblock(0, 0, p); }

    ~Picture() { delete[] data; }

    

    Picture& operator=(const Picture& p);

private:

    int height, width;

    char *data;

    

    char& position(int row, int col){

        return data[row * width + col];

    }

    

    char position(int row, int col) const{

        return data[row * width + col];

    }

    void 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(i+row, j+col) = p.position(i, j);

        }

    }       

};

ostream& operator<<(ostream&, const Picture&);

Picture frame(const Picture& p);

Picture operator&(const Picture&, const Picture&);

Picture operator|(const Picture&, const Picture&);

picturecontrol.cpp:

#include <iostream>

#include "Picture.h"

using namespace std;

const char* init[] = {"Paris", "in the", "Spring"};

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;    

}

Picture frame(const Picture& p)

{}

Picture operator&(const Picture&, const Picture&)

{}

Picture operator|(const Picture&, const Picture&)

{}

 int main(int argc, char const *argv[])

 {

    Picture p(init, 3);

    cout << p << endl;

    

    Picture q = p;

    cout << q << endl;

    

    //Picture r = p | q;

    //cout << r << endl;

    

    //Picture s = q & r;

    //cout << s << endl;

    

    //cout << frame(s) << endl;

    

    return 0;

 }

 全部整理好的代码如下:
Picture.h

#include <iostream>

#include <cstring>

using namespace std;

class Picture{

    friend ostream& operator<<(ostream&, const Picture&);

    friend Picture frame(const Picture& p);

    friend Picture operator&(const Picture&, const Picture&);

    friend Picture operator|(const Picture&, const Picture&);

public:

    Picture(): height(0), width(0), data(0) {}

    Picture(const char* const* array, int n){

        int w = 0;

        int i;

        for(i=0; i<n; i++)

            w = 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(const Picture& p): height(p.height), width(p.width), data(new char[p.height * p.width]){ copyblock(0, 0, p); }

    ~Picture() { delete[] data; }

    

    Picture& operator=(const Picture& p);

private:

    int height, width;

    char *data;

    

    char& position(int row, int col){

        return data[row * width + col];

    }

    

    char position(int row, int col) const{

        return data[row * width + col];

    }

    void 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(i+row, j+col) = p.position(i, j);

        }

    }

    void 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) = ' ';

    }

    static int max(int m, int n) { return m > n ? m : n; }

    void init(int h, int w){

        height = h;

        width = w;

        data = new char[height * width];

    }           

};

ostream& operator<<(ostream&, const Picture&);

Picture frame(const Picture& p);

Picture operator&(const Picture&, const Picture&);

Picture operator|(const Picture&, const Picture&);

picturecontrol.cpp

#include <iostream>

#include "Picture.h"

using namespace std;

const char* init[] = {"Paris", "in the", "Spring"};

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;    

}

Picture frame(const Picture& p){

    Picture r;

    r.init(p.height + 2, p.width + 2);

    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) = '+';

    r.copyblock(1, 1, p);

    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;    

}

 int main(int argc, char const *argv[])

 {

    Picture p(init, 3);

    

    Picture q = frame(p);

    cout << frame(q & (p | q)) << endl;

    

    return 0;

 }

 
 

猜你喜欢

转载自www.cnblogs.com/vonyoven/p/11781416.html