您的位置:首页 > 编程语言 > C语言/C++

两道c++面试题

2014-06-18 18:44 190 查看
哥终于考完啦!完啦!!啦!!!从此以后,请叫我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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: