画表格--蓝桥杯

来源:互联网 发布:mysql 自定义排序 编辑:程序博客网 时间:2024/05/16 19:30

欢迎访问我的新博客: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 1761上   =  ┬ 169 2082右上 =  ┐ 169 1803左   =  ├ 169 1924中心 =  ┼ 169 2245右   =  ┤ 169 2006左下 =  └ 169 1847下   =  ┴ 169 2168右下 =  ┘ 169 1889垂直 =  │ 169 16610水平 =  ─ 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) {//zuoshangputchar(169);putchar(176);//shuipingputchar(169);putchar(164);for(j = 3; j < 2 * n + 1; j += 2) {//zhongshangputchar(169);putchar(208);//shuipingputchar(169);putchar(164);}//youshangputchar(169);putchar(180);} else if(i == 2 * m + 1) {//zuoxiaputchar(169);putchar(184);//shuipingputchar(169);putchar(164);for(j = 3; j < 2 * n + 1; j += 2) {//zhongxiaputchar(169);putchar(216);//shuipingputchar(169);putchar(164);}//youxiaputchar(169);putchar(188);} else if(i % 2 == 0) {//chuizhiputchar(169);putchar(166);//kongputchar(32);putchar(32);for(j = 3; j < 2 * n + 1; j += 2) {//chuizhiputchar(169);putchar(166);//kongputchar(32);putchar(32);}//chuizhiputchar(169);putchar(166);} else if(i % 2 == 1) {//zhongzuoputchar(169);putchar(192);//shuipingputchar(169);putchar(164);for(j = 3; j < 2 * n + 1; j += 2) {//zhongxinputchar(169);putchar(224);//shuipingputchar(169);putchar(164);}//youputchar(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) {//zuoshangprintf("┌");//shuipingprintf("─");for(j = 3; j < 2 * n + 1; j += 2) {//zhongshangprintf("┬");//shuipingprintf("─");}//youshangprintf("┐");} else if(i == 2 * m + 1) {//zuoxiaprintf("└");//shuipingprintf("─");for(j = 3; j < 2 * n + 1; j += 2) {//zhongxiaprintf("┴");//shuipingprintf("─");}//youxiaprintf("┘");} else if(i % 2 == 0) {//chuizhiprintf("│");//kongprintf("  ");for(j = 3; j < 2 * n + 1; j += 2) {//chuizhiprintf("│");//kongprintf("  ");}//chuizhiprintf("│");} else if(i % 2 == 1) {//zhongzuoprintf("├");//shuipingprintf("─");for(j = 3; j < 2 * n + 1; j += 2) {//zhongxinprintf("┼");//shuipingprintf("─");}//youprintf("┤");}putchar(10);}}
原创粉丝点击