题目描述
X字母可以放大和缩小,变为n行X(n=1,3,5,7,9,...,21)。例如,3行x图案如下:
现假设一个n行(n>0,奇数)X图案,遥控器可以控制X图案的放大与缩小。遥控器有5个按键,1)show,显示当前X图案;2)show++, 显示当前X图案,再放大图案,n+2;3)++show,先放大图案,n+2,再显示图案;4)show--,显示当前X图案,再缩小图案,n-2;5)--show,先缩小图案,n-2,再显示图案。假设X图案的放大和缩小在1-21之间。n=1时,缩小不起作用,n=21时,放大不起作用。
用类CXGraph表示X图案及其放大、缩小、显示。主函数模拟遥控器,代码如下,不可修改。请补充CXGraph类的定义和实现。
输入
第一行n,大于0的奇数,X图案的初始大小。
第二行,操作次数
每个操作一行,为show、show++、show--、--show、++show之一,具体操作含义见题目。
输出
对每个操作,输出对应的X图案。
样例
输入:
3
5
show
show++
show++
++show
--show
输出:XXX
X
XXXXXX
X
XXXXXXXX
XXX
X
XXX
XXXXXXXXXXXXXX
XXXXXXX
XXXXX
XXX
X
XXX
XXXXX
XXXXXXX
XXXXXXXXXXXXXXXX
XXXXX
XXX
X
XXX
XXXXX
XXXXXXX
ps:(1)前加加和后加加、前减减和后减减是必须掌握的知识
(2) 漏斗形图形的输出分两部分进行,可多画几个图来找到字符与行列对应关系
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
class CXGraph {
int n;
public:
CXGraph(int x):n(x){}
CXGraph(CXGraph& c) {
n = c.n;
}
CXGraph& operator++()
{
if(n<=19){
n += 2;
return *this;
}
else return *this;
}
CXGraph operator++(int)
{
CXGraph c = *this;
if(n<=19)
n += 2;
return c;
}
CXGraph& operator--()
{
if(n>=3)
n -= 2;
return *this;
}
CXGraph operator--(int)
{
CXGraph c = *this;
if(n>=3)
n -= 2;
return c;
}
friend ostream& operator<<(ostream& out, const CXGraph& c);
};
ostream& operator<<(ostream& out, const CXGraph& c) {
int i, j, k;
for (i = 0; i < (c.n+1)/2; i++)
{
for (j = 0; j < i; j++)
{
cout << " ";
}
for (j = i; j < c.n - i; j++)
{
cout << "X";
}
cout << endl;
}
for (i = (c.n + 1) / 2; i < c.n; i++)
{
for (j = c.n - 1 - i; j > 0; j--)
{
cout << " ";
}
for (j = c.n - 1 - i; j <= i; j++)
{
cout << "X";
}
cout << endl;
}
return out;
}
int main()
{
int t, n;
string command;
cin >> n;
CXGraph xGraph(n);
cin >> t;
while (t--)
{
cin >> command;
if (command == "show++")
{
cout << xGraph++ << endl;
}
else if (command == "++show")
{
cout << ++xGraph << endl;
}
else if (command == "show--")
{
cout << xGraph-- << endl;
}
else if (command == "--show")
{
cout << --xGraph << endl;
}
else if (command == "show")
cout << xGraph << endl;
}
return 0;
}