画表格--蓝桥杯

欢迎访问我的新博客: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);
	}
}

你可能感兴趣的:(蓝桥杯)