画表格--蓝桥杯
欢迎访问我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1366355580.html
简述
这是2013年蓝桥杯全国软件大赛模拟题的第4题,问题是画表格。
题目描述
标题:画表格
在中文Windows环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来。
比如:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
└─┴─┘
其实,它是由如下的符号拼接的:
左上 = ┌ 169 176
上 = ┬ 169 208
右上 = ┐ 169 180
左 = ├ 169 192
中心 = ┼ 169 224
右 = ┤ 169 200
左下= └ 169 184
下 = ┴ 169 216
右下 = ┘ 169 188
垂直 = │ 169 166
水平 = ─169 164
本题目要求编写一个程序,根据用户输入的行、列数画出相应的表格来。
例如用户输入:
3 2
则程序输出:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
├─┼─┤
│ │ │
└─┴─┘
用户输入:
2 3
则程序输出:
┌─┬─┬─┐
│ │ │ │
├─┼─┼─┤
│ │ │ │
└─┴─┴─┘
对于编程题目,要求选手给出的解答完全符合ANSI C++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意选择自己使用的编译环境。
分析
这是2013年蓝桥杯全国软件大赛模拟题的第三题。首先通过如下小程序获得每个符号对应的char值:
# include <stdio.h> int main(void) { int text[100]; int c; int i; i = 0; while((c = getchar()) != EOF) { text[i++] = c; } text[i] = EOF; i = -1; while(text[i++] != EOF) { printf("%4d", text[i]); if(text[i] == 10) { putchar('\n'); } } }
cmd运行界面:
字符对应关系如下:
0 左上 = ┌ 169 176 1 上 = ┬ 169 208 2 右上 = ┐ 169 180 3 左 = ├ 169 192 4 中心 = ┼ 169 224 5 右 = ┤ 169 200 6 左下 = └ 169 184 7 下 = ┴ 169 216 8 右下 = ┘ 169 188 9 垂直 = │ 169 166 10 水平 = ─ 169 164
两个char表示一个特殊字符。然后通过数学计算,画出图形。代码虽然看上去比较松散,但是没有涉及复杂算法。
源代码
# include <stdio.h> int main(void) { int m, n; int i, j; scanf("%d%d", &m, &n); for(i = 1; i <= 2 * m + 1; i++) { putchar(9); if(i == 1) { //zuoshang putchar(169); putchar(176); //shuiping putchar(169); putchar(164); for(j = 3; j < 2 * n + 1; j += 2) { //zhongshang putchar(169); putchar(208); //shuiping putchar(169); putchar(164); } //youshang putchar(169); putchar(180); } else if(i == 2 * m + 1) { //zuoxia putchar(169); putchar(184); //shuiping putchar(169); putchar(164); for(j = 3; j < 2 * n + 1; j += 2) { //zhongxia putchar(169); putchar(216); //shuiping putchar(169); putchar(164); } //youxia putchar(169); putchar(188); } else if(i % 2 == 0) { //chuizhi putchar(169); putchar(166); //kong putchar(32); putchar(32); for(j = 3; j < 2 * n + 1; j += 2) { //chuizhi putchar(169); putchar(166); //kong putchar(32); putchar(32); } //chuizhi putchar(169); putchar(166); } else if(i % 2 == 1) { //zhongzuo putchar(169); putchar(192); //shuiping putchar(169); putchar(164); for(j = 3; j < 2 * n + 1; j += 2) { //zhongxin putchar(169); putchar(224); //shuiping putchar(169); putchar(164); } //you putchar(169); putchar(200); } putchar(10); } }
更新
20130501
在做这个题的时候,考虑的有点复杂,其实不用获得特殊字符对应的char,而是直接引用。
# include <stdio.h> int main(void) { int m, n; int i, j; scanf("%d%d", &m, &n); for(i = 1; i <= 2 * m + 1; i++) { putchar(9); if(i == 1) { //zuoshang printf("┌"); //shuiping printf("─"); for(j = 3; j < 2 * n + 1; j += 2) { //zhongshang printf("┬"); //shuiping printf("─"); } //youshang printf("┐"); } else if(i == 2 * m + 1) { //zuoxia printf("└"); //shuiping printf("─"); for(j = 3; j < 2 * n + 1; j += 2) { //zhongxia printf("┴"); //shuiping printf("─"); } //youxia printf("┘"); } else if(i % 2 == 0) { //chuizhi printf("│"); //kong printf(" "); for(j = 3; j < 2 * n + 1; j += 2) { //chuizhi printf("│"); //kong printf(" "); } //chuizhi printf("│"); } else if(i % 2 == 1) { //zhongzuo printf("├"); //shuiping printf("─"); for(j = 3; j < 2 * n + 1; j += 2) { //zhongxin printf("┼"); //shuiping printf("─"); } //you printf("┤"); } putchar(10); } }