两道c++面试题

哥终于考完啦!完啦!!啦!!!从此以后,请叫我XX狗!!!太激动了呜呜呜……话说csdn blog的排版各种蛋疼——我还是太年轻了……


废话不多说,原帖http://bbs.csdn.net/topics/390812884,简述如下。

  1. 1

    222
    212
    222

    33333
    32223
    32123
    32223
    33333

    4444444
    4333334
    4322234
    4321234
    4322234
    4333334
    4444444



  2. 用“*”显示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不能交叉引用么)。

至此,框架已完全搭好。值得一提的几个细节:

  1. vector的初始化可以这样写:vector a=vector<int>(3,0);//表示vec a长度为3,每个元素为0(我用的是resize,这里跟赋初值是一个意思)。
  2. 无穷范数可以用STL里的max()和abs()实现,接口就不谈了。
  3. sq(int mm): m( mm-1 ), n( 2*mm-1 )表示mm是类sq的形参,成员sq::m用(mm-1)初始化,成员sq::n用(2*mm-1)初始化。
代码就不贴了。

第二题我见过类似的,只不过是竖排显示,题目要求是横排显示,但是cmd打印的次序却是逐行显示,因此类似的我用一个矩阵存储需要打印的字符。总体上这题想法很自然,不值得深究。如果用qt的话再简单不过了(虽然还不会TT)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值