一个无聊的面试题

公司糟了灾,年底了还要去找工作,真是流年不利啊。面试题啥的,向来是很反感的,有啥意义呢?哎~~,世道如此,只好把面经啥的又捧起来看了,烦啊。

 

题目很简单了,就是打印下面这种样式的字符,主要的逻辑很简单,可是面经上的解答实在不给力啊,直接就main里一个for就打印出来,这不是骗小孩么,也不知道那时候买这个干嘛,不过那会刚毕业,也差不多是个小屁孩了。往简单了想,变化点有三个,一个是打印的行数,一个是打印到什么位置,一个是打印的花纹,OO啥的不折腾了,就用C风格写下算了。

image 

打印的风格函数用回调函数来隔离变化,比如上面的图里第一行是有星号,没点号的。需求变化的话,可以变成从第一行开始就有点号,第二行有两个点这样依次。关于打印的位置,这里就用c++流里的基类函数ostream,ofstream因为是派生自它的,而<< 是虚函数。看代码:

    typedef void (*PrintUnit) (int rowNum, ostream* out); 

    void PrintUintWithStyle1(int rowNum, ostream* out) {
        //print star *
        (*out)<<'*';
        for (int i=0; i<rowNum; i++) {
            (*out)<<'.';
        }
    } 

    void PrintUintWithStyle2(int rowNum, ostream* out) {
        //print star *
        (*out)<<'*';
        for (int i=0; i<rowNum+1; i++) {
            (*out)<<'.';
        }
    } 

    void PrintRows(int rows, PrintUnit fp, ostream* out) {
        for(int i=0; i<10; i++) {
            for(int k=0; k<i+1; k++) {
                fp(i, out);
            }
            (*out)<<endl;
        }
    } 

    void Print10RowsWithStyle1ToStdout() {
        PrintRows(10, PrintUintWithStyle1, &cout);
    } 

    void Print10RowsWithStyle2ToFile() {
        ofstream fout("1.txt");
        PrintRows(10, PrintUintWithStyle2, &fout);
    } 

    int main(int argc, char* argv[]){
        Print10RowsWithStyle1ToStdout();
        Print10RowsWithStyle2ToFile(); 

        return 0;
    } 

最后在屏幕上打印出:

image

在文件里打印出:
*.
*..*..
*...*...*...
*....*....*....*....
*.....*.....*.....*.....*.....
*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......

posted @ 2011-01-04 13:22  hjtc  Views(597)  Comments(2Edit  收藏  举报