简述
这是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);
}
}