2020-12-30 液晶显示

简单的来说,就是将一串数字转换成LC显示风格输出,考的就是对输出的控制,当有了一定的逻辑结构之后,其实输出就变的十分简单了。

首先我们要了解lc格式是怎样子,因为输出样例里已经有了,所以这里不作解释。

说到输出数字串,首先要想到循环,这句话看似无用,实际上,这道题的难点就在于怎么控制循环。我们首先会自然而然地想到,直接一个一个地将数字输出不就得了,但是,输出一个lc风格的数字,是要占多行的,如果以数字为单位输出,其中必须经过换行,那么就不可能输出一串数字了,这个方法首先就应该放弃。

我们来考虑一下,日常生活中lc风格的的数字是怎样的,七根小灯管垂直排布,没跟灯管根据接受的的信号不同,选择自己的状态是亮还是灭(这里扯一句闲话,老师是因为将二进制才牵扯到这道题的,虽然本身和二进制关系不大,但是有相似性,所以读到这里可以联想一下二进制,0代表关,1代表开,灯管接受到0就灭,接收到1就打开,可以这么理解,这种方法可以放在题目的解法里面,这个我们稍后再说),最终展示出我们想要的数字。

------1

|2     |3

------4

|5     |6

-------7

从上至下,依次给灯管排号,第一行输出1号灯管,第2~s+1行输出2号和3号灯管,第s+2行输出4号灯管,第s+3到2s+2行输出5号和6号灯管,第2s+3行输出第7跟灯管。这种按照灯管的方法输出,可以一行输出多个数字了。经典的分组输出。

那么,上代码吧,但是一百多行的代码,十分臃肿不好看的,那我把它拆开吧。

输入和储存

scanf("%d%d",&s,&n);
        if(s==0&&n==0)
            break;
        int re=n;//设置一个储存器储存这一串数字,以便于后来重置

第一行(输出1)

        int i,m,a;
        for(a=1;n/a>10;a*=10);
        for(i=1;a>0;a/=10)
        {
            m=n/a;
            if(i==1)
            {
                putchar(' ');
                i++;
            }
            else if(i!=1)
            {
                putchar(' ');
                putchar(' ');
            }
            for(int j=1;j<=s;j++)
            {
                if(m==2||m==3||m==5||m==6||m==7||m==8||m==9||m==0)
                    putchar('-');
                else
                    putchar(' ');
            }
            putchar(' ');
            n=n%a;
        }
        printf("\n");

 第2~s+1行(输出2)

n=re;//重置变量

        for(int j=1;j<=s;j++)
        {
            n=re;
            for(a=1;n/a>10;a*=10);
            for(i=1;a>0;a/=10)
            {
                m=n/a;
                if(i==1)
                    i++;
                else if(i!=1)
                    putchar(' ');
                if(m==4||m==5||m==6||m==8||m==9||m==0)
                    putchar('|');
                else
                    putchar(' ');
                for(int l=1;l<=s;l++)
                    putchar(' ');
                if(m==1||m==2||m==3||m==4||m==7||m==8||m==9||m==0)
                    putchar('|');
                else
-                   putchar(' ');
                n%=a;
            }
            printf("\n");
        }

这里没有用到数组和其他知识的原因是班里的学习进度就只能用for,while,if-else语句。

这里有一些需要注意的地方

1.因为输入的是一个数,要把他单独拆开,这就是变量a存在的意义。

2.因为每一个数字之间有一列空格分开,所以要判断是不是第一个输出的数字,这就是变量i存在的意义。

3.第4和第7根灯管和输出1的方法相同,第5,6根和输出2相同,只不过改一下输出条件而已。

这里就要说一下之前提到的二进制,然后就是解题方法。这里可以用一个二维数组和一个字符串数组,这样也可以实现输出,判断输出也没有这么麻烦,比如说,1只需要输出第3和6根灯管,那么对应的数字就是{0,0,1,0,0,1,0},8需要点亮所有的灯管,所以对应的数字就是{1,1,1,1,1,1,1},然后根据strlen函数判断输入的字符串的长度判断循环次数,将字符对应的ASCII码减去30得到对应数字,根据接收到的是0或1来决定是否点亮灯管,也是可以得到想要的结果的,这里因为思路大致相同就没有写出对应的代码,读到这里的人可以自己去尝试一下。

但是,无论方法是如何,没有一个完整清晰的思路一定是没用的,所以,在做题之前,一定要有一条清晰完整的思路,让先算法后编程成为一种习惯,当然,对于繁琐的代码,耐心也是很有必要的,贵在坚持。

最后,看一下代码的全貌吧

#include<stdio.h>
int main()
{
    int s,n;
    while(1)
    {
        scanf("%d%d",&s,&n);
        if(s==0&&n==0)
            break;
        int re=n;//设置一个储存器储存这一串数字,以便于后来重置
        int i,m,a;
        for(a=1;n/a>10;a*=10);
        for(i=1;a>0;a/=10)
        {
            m=n/a;
            if(i==1)
            {
                putchar(' ');
                i++;
            }
            else if(i!=1)
            {
                putchar(' ');
                putchar(' ');
            }
            for(int j=1;j<=s;j++)
            {
                if(m==2||m==3||m==5||m==6||m==7||m==8||m==9||m==0)
                    putchar('-');
                else
                    putchar(' ');
            }
            putchar(' ');
            n=n%a;
        }
        printf("\n");

        n=re;//重置变量

        for(int j=1;j<=s;j++)
        {
            n=re;
            for(a=1;n/a>10;a*=10);
            for(i=1;a>0;a/=10)
            {
                m=n/a;
                if(i==1)
                    i++;
                else if(i!=1)
                    putchar(' ');
                if(m==4||m==5||m==6||m==8||m==9||m==0)
                    putchar('|');
                else
                    putchar(' ');
                for(int l=1;l<=s;l++)
                    putchar(' ');
                if(m==1||m==2||m==3||m==4||m==7||m==8||m==9||m==0)
                    putchar('|');
                else
-                   putchar(' ');
                n%=a;
            }
            printf("\n");
        }

        n=re;

        for(a=1;n/a>10;a*=10);
        for(i=1;a>0;a/=10)
        {
            m=n/a;
            if(i==1)
            {
                putchar(' ');
                i++;
            }
            else if(i!=1)
            {
                putchar(' ');
                putchar(' ');
            }
            for(int j=1;j<=s;j++)
            {
                if(m==2||m==3||m==4||m==5||m==6||m==8||m==9)
                    putchar('-');
                else
                    putchar(' ');
            }
            putchar(' ');
            n=n%a;
        }
        printf("\n");

        n=re;

        for(int j=1;j<=s;j++)
        {
            n=re;
            for(a=1;n/a>10;a*=10);
            for(i=1;a>0;a/=10)
            {
                m=n/a;
                if(i==1)
                    i++;
                else if(i!=1)
                    putchar(' ');
                if(m==2||m==6||m==8||m==0)
                    putchar('|');
                else
                    putchar(' ');
                for(int l=1;l<=s;l++)
                    putchar(' ');
                if(m==1||m==3||m==4||m==5||m==6||m==7||m==8||m==9||m==0)
                    putchar('|');
                else
-                   putchar(' ');
                n%=a;
            }
            printf("\n");
        }

        n=re;

        for(a=1;n/a>10;a*=10);
        for(i=1;a>0;a/=10)
        {
            m=n/a;
            if(i==1)
            {
                putchar(' ');
                i++;
            }
            else if(i!=1)
            {
                putchar(' ');
                putchar(' ');
            }
            for(int j=1;j<=s;j++)
            {
                if(m==2||m==3||m==5||m==6||m==8||m==9||m==0)
                    putchar('-');
                else
                    putchar(' ');
            }
            putchar(' ');
            n=n%a;
        }
        printf("\n");

        printf("\n");

    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值