哥终于考完啦!完啦!!啦!!!从此以后,请叫我XX狗!!!太激动了呜呜呜……话说csdn blog的排版各种蛋疼——我还是太年轻了……
废话不多说,原帖http://bbs.csdn.net/topics/390812884,简述如下。
- 1
222
212
222
33333
32223
32123
32223
33333
4444444
4333334
4322234
4321234
4322234
4333334
4444444
- 用“*”显示0度~360度的余弦曲线cos(x).
显示范围在正好一屏幕。
既然是c++,那么我们暂且不考虑效率极佳的“填表式”c风格代码,也就是4重循环(我猜测一个逆序串需要俩循环);我们考虑的是事先把数字块存起来。
如果要是你用手来书写,怎么写?要我的话就先写一个1,在写一圈2,依此类推;这便是总体思路。假设一个字块是一个类,不妨成之为sq。首先,这个类需要一个整形参数(其实应该是unsigned int)来表示块中的最大数m,需要一个矩阵a来储存字符,需要一个操作print来打印矩阵,另外矩阵的规模实际上是2m-1,简单起见我们把他记作n,最后还需要一个操作cal来填这个矩阵。于是头文件应该这样写
<span style="font-size:14px;">class sq
{
private:
int m;
int n;
std::vector<std::vector<int> > a;
void cal();
public:
sq(int mm);
void print();
};</span>
需要强调的是STL里没有矩阵类的定义,我比较偏爱的做法是用vec<vec>的形式。
问题的核心在于填表操作。首先用m来初始化整个a;然后遍历a。实际上a(i,j)=1+d,d=norm_inf( (i,j)-O ),其中O表示表的中心。这句公式的意思是,第i行第j列元素,减去所在位置距离中心的无穷范数,等于一个常数,这个常数是1。(不要问我为什么;也不要问我为什么我要用“无穷范数”而不是“最大值”)换句话说,前边那句话就是再往前“总体思路”的抽象概括(尼玛blog不能交叉引用么)。
至此,框架已完全搭好。值得一提的几个细节:
- vector的初始化可以这样写:vector a=vector<int>(3,0);//表示vec a长度为3,每个元素为0(我用的是resize,这里跟赋初值是一个意思)。
- 无穷范数可以用STL里的max()和abs()实现,接口就不谈了。
sq(
int
mm): m( mm-1 ), n( 2*mm-1 )
表示mm是类sq的形参,成员sq::m用(mm-1)初始化,成员sq::n用(2*mm-1)初始化。
第二题我见过类似的,只不过是竖排显示,题目要求是横排显示,但是cmd打印的次序却是逐行显示,因此类似的我用一个矩阵存储需要打印的字符。总体上这题想法很自然,不值得深究。如果用qt的话再简单不过了(虽然还不会TT)。