ACM 液晶显示屏

6 篇文章 0 订阅
【问题描述】
你的一个朋友买了一台电脑。 他以前只用过计算器, 因为电脑的显示器上显示的数字的样子和计算器是不一样, 所以当他使用电脑的时候会比较郁闷。 为了帮助他, 你决定写一个程序把在电脑上的数字显示得像计算器上一样。
【输入数据】
输入包括若干行,每行表示一个要显示的数。每行有两个整数 s 和 n (1 <= s <= 10, 0<=n<= 99999999) ,这里 n 是要显示的数, s 是要显示的数的尺寸。如果某行输入包括两个0,表示输入结束。这行不需要处理。
【输出要求】
显示的方式是: 用 s 个'-'表示一个水平线段, 用 s 个 '|'表示一个垂直线段。 这种情况下,每一个数字需要占用 s+2 列和 2s+3 行。另外,在两个数字之间要输出一个空白的列。 在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
【输入样例】
2 12345
3 67890
0 0

【输出样例】


【思路】:

坦率地讲,一点儿思路也没有,于是上网搜之,这时候你才觉得不管解什么题,思路最重要,有的报告一上来就是代码甚至通篇是代码,过几年估计自己看也未必看懂,所以一定一定一定要写清楚思路,再不济把关键步骤的注释标上。

1 输入数据的表示

 1.1 题中要求输入两个数,其中数字序列n介于0到999 999 999之间,对n处理时需要拆解出序列的单个数字,而单个数字的范围是 0~9,因而选用字符数组比整型数,整型数组无论时间还是空间复杂度都来得低。

 1.2 单个数字digit与每划一笔构成的LCD型数字之间有映射关系,每划一笔构成的LCD型数字与每划s笔构成的LCD数字之间也有一定的映射关系。

   1.2.1 第一个映射关系,把数字0~9的LCD显示列出,发现每个LCD显示的数字笔画如图所示,只不过,有的笔画是空,有的笔画是 | 或者 - 把lcd每划一笔的数字按划按行列出。


   1.2.2 每第二个映射关系,每划一笔与每划s笔之间存在s倍的关系。如图所示,注意,绿色部分也有倍数关系,红色部分无论s是几始终是一个.

另外注意,单个数字之间有一列隔开。每个数字序列输出结束,空行隔开。

代码:

 因为最后有 \0所以第二维长11
char stoke1[]={"- -- -----"};// ±Ê»­ 1 ±»Êý×Ö 0,2,3,5,6,7,8,9 ¸²¸Ç
char stoke2[]={"|   ||| ||"};  // ±Ê»­ 2 ±»Êý×Ö 0,4,5,6,8,9 ¸²¸Ç
char stoke3[]={"|||||  |||"}; // ±Ê»­ 3 ±»Êý×Ö 0,1,2,3,4,7,8,9 ¸²¸Ç
char stoke4[]={"  ----- --"}; // ±Ê»­ 4 ±»Êý×Ö 2,3,4,5,6,8,9 ¸²¸Ç
char stoke5[]={"| |   | | "};  // ±Ê»­ 5 ±»Êý×Ö 0,2,6,8 ¸²¸Ç
char stoke6[]={"|| |||||||"};// ±Ê»­ 6 ±»Êý×Ö 0,1,3,4,6,7,8,9 ¸²¸Ç
char stoke7[]={"- -- -- --"};// ±Ê»­ 7 ±»Êý×Ö 0,2,3,5,6,8,9 ¸²¸Ç
 有10个数,每个数5行,每行3列

/**
 -  笔画1   空格 字符 空格
| | 笔画2,3 字符(笔画2) 空格 字符(笔画3)
 -  笔画4   空格 字符 空格
| | 笔画5,6 笔画5 空格 笔画6
 -  笔画7 空格 字符(笔画7) 空格
*/
/**单个数字之间的空格*/
int lcd()
{
    //s 单笔画长度
    int s;
    //n 数字序列
    char n[10];
    // 当前的单个数字
    int digit=0;
    //数字序列的长度
    int numLength, i=0 , j=0 ,k=0;
    while(scanf("%d%s",&s,n))
    {
        /**归零*/
        i=0,j=0,k=0;
        numLength=0;
        memset(n,'\0',numLength);

        if (s == 0)
            break;
        while(n[i++]!='\0')
        {
            ++numLength;
        }
        for (i = 0 ; i < numLength ; i++)
        {
            //注意digit(n1的下标和i(n的下标)没有直接关系)
            //char ->int
            digit = n[i] - '0';
            printf(" ");
            for (j = 0 ; j < s ; j++)
                printf("%c",stoke1[digit]);
            printf(" ");

            printf(" ");
        }
        //下一行
        printf("\n");
         // 输出所有数字的笔画 2 和笔画 3
        for (i = 0 ; i < s ; i++)
        {
            for (j = 0 ; j < numLength ; j++)
            {
                digit = n[j] - '0';
                printf("%c", stoke2[digit]);
                // 笔画 2 和笔画 3 之间的空格
                for (k = 0 ; k < s ; k++)
                    printf(" ");
                printf("%c",stoke3[digit]);
                printf(" ");
            }
            printf("\n");
        }
        //输出所有数字的笔画 4
        for (i = 0 ; i < numLength ; i++)
        {
            digit = n[i] - '0';
            printf(" ");
            for (j = 0 ; j < s ; j++)
                printf("%c", stoke4[digit]);
            printf(" ");

            printf(" ");
        }
        printf("\n");
        for (i = 0 ; i < s ; i++)
        { //输出所有数字的笔画 5 和笔画 6
            for (j = 0 ; j < numLength ; j++)
            {
                digit = n[j] - '0';
                printf("%c", stoke5[digit]);
                // 笔画 5 和笔画 6 之间的空格
                for (k = 0 ; k < s ; k++)
                    printf(" ");
                printf("%c", stoke6[digit]);
                printf(" ");
            }
            printf("\n");
        }
        // 输出所有数字的笔画 7
        for (i = 0 ; i < numLength ; i++)
        {
            printf(" ");
            digit = n[i] - '0';
            for (j = 0 ; j < s ; j++)
                printf("%c", stoke7[digit]);
            printf(" ");

            printf(" ");
        }
        printf("\n");
        printf("\n");
    }
    return 0;
}


输出结果示例


代码编写注意点:

当循环体内改变了下一个循环需要的数据初始值时,在本次循环即将结束或者下一次循环开始之初,都要对这些变量重新赋予初值。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值