上一篇《C算法编程题(二)正螺旋》
写东西前还是喜欢吐槽点东西,要不然写的真还没意思,一直的想法是在博客园把自己上学和工作时候整理的东西写出来和大家分享,就像前面写的《T-Sql学习系列》,当然这些只是适合初学者,之后还有很多系列,写这些东西的目的:一是真的可以帮到那些初学者;二是自己回过头去回忆那些曾经的记忆,毕竟工作了,也没那个时间了。
说到时间,真的还没时间,这段时间公司的项目要上线,都比较忙,真的好后悔前段时间没有去好好看看书,前两天买了两本书《CLR VIA C#》和《漫谈设计模式》,我的想法是现在学习设计模式的,说实话是真的想学,以后的路也是想走这一条。但是在博园看了一些设计模式相关的文章,发现设计模式有时候会涉及到底层的东西,大学时候只是学的C#这门语言,没怎么讲framework相关的东西,所以才买了那本书,希望可以恶补下,还有学习那个权限管理系统系列的计划,现在发现真的有很多事要做,不多说了,希望自己可以熬过这段时间。
发现自己现在还真是有点啰嗦,打住~~~。
今天说的这个题目和上一个差不多,也是通过一定的逻辑输出东西的。
程序描述:
在中文Windows环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来。
比如:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
└─┴─┘
其实,它是由如下的符号拼接的:
左上 = ┌
上 = ┬
右上 = ┐
左 = ├
中心 = ┼
右 = ┤
左下= └
下 = ┴
右下 = ┘
垂直 = │
水平 = ─
本题目要求编写一个程序,根据用户输入的行、列数画出相应的表格来。
例如用户输入:
3 2
则程序输出:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
├─┼─┤
│ │ │
└─┴─┘
用户输入:
2 3
则程序输出:
┌─┬─┬─┐
│ │ │ │
├─┼─┼─┤
│ │ │ │
└─┴─┴─┘
看到这个题目,我们可能首先想到的是,这些符号用数组存储,我也是这样考虑的,就像上个正螺旋有四个方向一样,这个题目我们可以这样考虑,这个表格可以分为四个区域,上、中、下和中间空白区域,那我们可以用数组这样表示:
1 char *on[4] = { "┌", "─", "┬", "┐" }; 2 char *center[4] = { "├", "─", "┼", "┤" }; 3 char *down[4] = { "└", "─", "┴", "┘" }; 4 char *space[2] = { "│", " " };
符号我们表示好了,这样我们就可以通过表格把区域分掉,来发现其中的规律。
就会发现,其实输出的时候我们也可以分区域输出:顶部区域、中部区域和底部区域。顶部和底部区域是比较好输出的,我先贴下这两个区域的输出代码:
1 //输出顶部字符 2 for (i = 0; i < 2 * lines + 1; i++) 3 { 4 if (i == 0) 5 printf("%s",on[0]); 6 else if (i == 2 * lines) 7 printf("%s",on[3]); 8 else 9 { 10 if (i % 2 == 0) 11 printf("%s",on[2]); 12 else 13 printf("%s",on[1]); 14 } 15 } 16 printf("\n"); 17 //输出底部字符 18 for (i = 0; i < 2 * lines + 1; i++) 19 { 20 if (i == 0) 21 printf("%s",down[0]); 22 else if (i == 2 * lines) 23 printf("%s",down[3]); 24 else 25 { 26 if (i % 2 == 0) 27 printf("%s",down[2]); 28 else 29 printf("%s",down[1]); 30 } 31 } 32 printf("\n");
rows和lines分别表示的是输出表格的行数和列数,顶部和底部区域输出的代码我就不多说了,大家结合表和代码就可以理解了,这里我说下中部区域。
其实中部和上下区域差不多,只不过是中部和空白交替的,比如行数是3,那中部区域就是:空、中、空、中、空;如果行数是2,中部区域为:空、中、空;
发现这个规律我们代码可以这样写;
1 //输出中间字符 2 for (i = 0; i < 2 * rows - 1; i++) 3 { 4 if ((i + 1) % 2 == 0) 5 { 6 for (j = 0; j < 2 * lines + 1; j++) 7 { 8 if (j == 0) 9 printf("%s",center[0]); 10 else if (j == 2 * lines) 11 printf("%s",center[3]); 12 else 13 { 14 if (j % 2 == 0) 15 printf("%s",center[2]); 16 else 17 printf("%s",center[1]); 18 } 19 } 20 } 21 else 22 { 23 for (k = 0; k < 2 * lines + 1; k++) 24 { 25 if ((k + 1) % 2 == 0) 26 printf("%s",space[1]); 27 else 28 printf("%s",space[0]); 29 } 30 } 31 printf("\n"); 32 }
中和空的输出逻辑和顶部和底部的输出逻辑是差不多的。
这个题目如果你思路清晰的话,是很简单的。如果大家也有更好的实现方法,欢迎交流。。。
完成程序代码:
1 #include "stdio.h" 2 #include "string.h" 3 4 void main() 5 { 6 char *on[4] = { "┌", "─", "┬", "┐" }; 7 char *center[4] = { "├", "─", "┼", "┤" }; 8 char *down[4] = { "└", "─", "┴", "┘" }; 9 char *space[2] = { "│", " " }; 10 int rows, lines; 11 int i, j, k; 12 //printf("%c",on[0]); 13 scanf("%d",&rows); 14 scanf("%d",&lines); 15 16 //输出顶部字符 17 for (i = 0; i < 2 * lines + 1; i++) 18 { 19 if (i == 0) 20 printf("%s",on[0]); 21 else if (i == 2 * lines) 22 printf("%s",on[3]); 23 else 24 { 25 if (i % 2 == 0) 26 printf("%s",on[2]); 27 else 28 printf("%s",on[1]); 29 } 30 } 31 printf("\n"); 32 33 //输出中间字符 34 for (i = 0; i < 2 * rows - 1; i++) 35 { 36 if ((i + 1) % 2 == 0) 37 { 38 for (j = 0; j < 2 * lines + 1; j++) 39 { 40 if (j == 0) 41 printf("%s",center[0]); 42 else if (j == 2 * lines) 43 printf("%s",center[3]); 44 else 45 { 46 if (j % 2 == 0) 47 printf("%s",center[2]); 48 else 49 printf("%s",center[1]); 50 } 51 } 52 } 53 else 54 { 55 for (k = 0; k < 2 * lines + 1; k++) 56 { 57 if ((k + 1) % 2 == 0) 58 printf("%s",space[1]); 59 else 60 printf("%s",space[0]); 61 } 62 } 63 printf("\n"); 64 } 65 66 //输出底部字符 67 for (i = 0; i < 2 * lines + 1; i++) 68 { 69 if (i == 0) 70 printf("%s",down[0]); 71 else if (i == 2 * lines) 72 printf("%s",down[3]); 73 else 74 { 75 if (i % 2 == 0) 76 printf("%s",down[2]); 77 else 78 printf("%s",down[1]); 79 } 80 } 81 printf("\n"); 82 }
运行结果: