《Ruminations on C++》一书中有一例子,要求显示“character strings“为“framed pictures”。
一、题目
给定一个字符串数组,编写程序,依次支持以下功能:
1. 显示“字符图像”:
按每行显示一个字符串的方式,打印出矩形字符阵列。矩形高为字符串数组的大小,宽为最长的字符串长度。
2. 对“字符图像”加框:上下左右各加一行;
3. 对两副“字符图像”横向拼接,顶边对齐;
4. 对两幅“字符图像”纵向拼接,左边对齐。
示例:
#include <iostream>
#include "Picture.h"
char *init[] = {"Paris", "in the", "Spring"};
int main(int argc, char* argv[])
{
Picture p(init, 3);
cout<<p<<endl;
return 0;
}
输出结果:
加框后输出:
对以上两幅图像横向拼接后输出:
对以上两幅图像纵向拼接后输出:
二、程序设计
#ifndef PICTURE_H
#define PICTURE_H
#include <iostream>
class P_Node;
class Picture
{
//友元的声明默认为extern,实现可以在类外定义,但必须在类内部声明.
friend class String_Pic;
friend class Frame_Pic;
friend class HCat_Pic;
friend class VCat_Pic;
//友元函数是定义在类外的普通函数,它不属于任何类.
friend std::ostream& operator<<(std::ostream&, const Picture&);
friend Picture frame(const Picture&);
friend Picture reframe(const Picture&, char, char, char);
friend Picture operator&(const Picture&, const Picture&);
friend Picture operator|(const Picture&, const Picture&);
public:
Picture(const char* const*, int);
Picture(const Picture&);
~Picture();
Picture& operator=(const Picture&);
P_Node* getNode() {return p;}
private:
//供frame(),operator|(),operator&()函数使用, 用于隐式类型转换.
Picture(P_Node*);
//供P_Node的派生类获取字符图像的宽高, 因此将String_Pic,Frame_Pic,
//VCat_Pic,HCat_Pic声明为friend类.
int width() const;
int height() const;
//供operator<<()函数用于输出使用, 因此将operator<<()函数声明为friend函数.
void display(std::ostream&, int, int) const;
private:
P_Node* p;
};
class P_Node
{
friend class Picture;
friend Picture reframe(const Picture&, char, char, char);
protected:
P_Node();
virtual ~P_Node();
virtual int height() const = 0;
virtual int width() const = 0;
virtual void display(std::ostream&, int, int) const = 0;
virtual Picture reframe(char, char, char) = 0;
int max(int, int) const;
private:
//int use;
protected:
//原来为private,由于派生类String_Pic的reframe成员函数需要修改use,所以更改访问权限.
int use;
};
class String_Pic : public P_Node
{
friend class Picture;
String_Pic(const char* const*, int);
~String_Pic();
int height() const;
int width() const;
void display(std::ostream&, int, int) const;
Picture reframe(char, char, char);
char** data;
int size;
};
class Frame_Pic : public P_Node
{
friend Picture frame(const Picture&);
Frame_Pic(const Picture&, char = '+', char = '|', char = '-');
int height() const;
int width() const;
void display(std::ostream&, int, int) const;
Picture reframe(char, char, char);
Picture p;
char corner;
char sideborder;
char topborder;
};
class VCat_Pic : public P_Node
{
friend Picture operator&(const Picture&, const Picture&);
VCat_Pic(const Picture&, const Picture&);
int height() const;
int width() const;
void display(std::ostream&, int, int) const;
Picture reframe(char, char, char);
Picture top;
Picture bottom;
};
class HCat_Pic : public P_Node
{
friend Picture operator|(const Picture&, const Picture&);
HCat_Pic(const Picture&, const Picture&);
int height() const;
int width() const;
void display(std::ostream&, int, int) const;
Picture reframe(char, char, char);
Picture left;
Picture right;
};
#endif//PICTURE_H
例子见附件:
http://download.youkuaiyun.com/download/xifens/9915050
本文介绍了一种使用C++处理字符图像的方法,包括创建字符图像、对其进行加框、横向拼接及纵向拼接等操作。文章通过具体示例展示了如何构建和操作字符图像。
4万+

被折叠的 条评论
为什么被折叠?



