公司糟了灾,年底了还要去找工作,真是流年不利啊。面试题啥的,向来是很反感的,有啥意义呢?哎~~,世道如此,只好把面经啥的又捧起来看了,烦啊。
题目很简单了,就是打印下面这种样式的字符,主要的逻辑很简单,可是面经上的解答实在不给力啊,直接就main里一个for就打印出来,这不是骗小孩么,也不知道那时候买这个干嘛,不过那会刚毕业,也差不多是个小屁孩了。往简单了想,变化点有三个,一个是打印的行数,一个是打印到什么位置,一个是打印的花纹,OO啥的不折腾了,就用C风格写下算了。
打印的风格函数用回调函数来隔离变化,比如上面的图里第一行是有星号,没点号的。需求变化的话,可以变成从第一行开始就有点号,第二行有两个点这样依次。关于打印的位置,这里就用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; }
最后在屏幕上打印出:
在文件里打印出:
*.
*..*..
*...*...*...
*....*....*....*....
*.....*.....*.....*.....*.....
*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......