/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 自顶向下的编程风格: 所谓自顶向下的编程风格,我感觉和我们平时所见过的分治与递归的思想较为类似, 为什么这样说呢,是因为这种编程风格也是将一个大问题转换为许多小问题来进行解决 比如,就在这道画格子的题目中,我们发现,对于一个图来说,我们最朴素的想法肯定是 先画所有的竖线,然后再画所有的横线,或者说是先画所有的横线,再画所有的竖线。 画横线的方法: 1.写出一专门用来画横线的函数,该函数包括以下参数(数组名,开始的行号,开始的列标,结束的列标) 2.画竖线的函数与画横线的函数思路类似,只是对于函数的参数要发生一定的变化 (数组名,开始的列号,开始的行号,结束的行号) 该题目一开始是将这些字符全部存入到一个叫做 cache的缓冲区中,因为我们知道如果直接在 控制台上写入这些字符,从第一行写到第五行的时候,如果再对第一行的字符进行操作那将会 是一件很困难的事情,所以我们先将他写入缓冲区中,然后对于缓冲区中的字符进行相对应的 操作,将最终希望得到的结果显示出来就可以了。 */ # include<cstdio> # include<iostream> # include<cstring> # include<cmath> # include<algorithm> using namespace std; void print( char a[20][50]) { for ( int i = 0;i < 20;i++ ) { for ( int j = 0;j < 50;j++ ) { if ( a[i][j] == 0 ) printf(" "); else printf("%c",a[i][j]); } printf("\n"); } } void line_h( char a[20][50],int row ,int col1,int col2 ) { for ( int i = col1;i <= col2;i++ ) a[row][i] = '$'; } void line_v( char a[20][50],int col,int row1,int row2 ) { for ( int i = row1;i <= row2;i++ ) a[i][col] = '$'; } int main(void) { char cache[20][50]; memset(cache,0,sizeof(cache)); for ( int i = 0;i < 4;i++ )line_h( cache,i*3,0,32 ); for ( int i = 0;i < 9;i++ )line_v( cache,i*4,0,9 ); print(cache); return 0; }