山东科技大学OJ 液晶显示

Description
你的朋友刚买了一台新电脑,他以前用过的最强大的计算工具是一台袖珍计算器。现在,看着自己的新电脑,他有点失望,因为他更喜欢计算器上的LC显示器。所以,你决定写一个LC显示风格的程序帮他在电脑上显示数字。

Input
输入包括若干行,每一行有两个整数。输入为两个0表示结束,并且此行不被处理。

每行输入的两个整数s和n,满足1<=s<=10且0<=n<=99 999 999,其中n是要被现实的数字,s是n应该显示的大小(放大的倍数)。

Output
输出的数字是LC显示风格的:使用s个“-”表示水平线和s个“|”竖直线,每个数字刚好占据s+2列和2s+3行,所有没有“-”和“|”的空白处请用空格填满。并且每两个数字之间要有一列空格。

每一行输入数字对应上述一组LC显示风格输出。任意两组数字的输出之间用一个空行分割。

Sample Input
2 12345
3 67890
0 0
Sample Output

这道题目是青岛理工邀请赛的题,当时没做出来,现在就让我用补提的方法来弥补缺陷吧。
在这里插入图片描述
这道题目开始看上去会觉得很简单,只要把每个数字对应液晶显示就可以了,但是CB编译器输入方式不是一列一列的,而是一行一行,仔细一想就会很难办,但是只要掌握了每个数字对应的每一行的输入规则就可以了。
二话不说直接上代码:。。。

#include <stdio.h>
char a[11][6]= {"14041","03030","13121","13131","04130","12131","12141","13030","14141","14131"};
void prints(char c,int n)
{
    while(n--)putchar(c);
}
int main()
{
    int k=2;
    char s[20];
    int first=1;
    while(scanf("%d%s",&k,s)==2&&(k||s[0]!='0'))
    {
        if(!first)printf("\n");else first=0;
        for(int i=0; i<5; i++)
        {
            int t=1;
            for(int j=0; j<k; j++)
            {
                for(int n=0; s[n]!=0; n++)
                {
                    if(a[s[n]-'0'][i]=='1')
                    {
                        if(j)  t=0;
                        else
                        {
                            putchar(' ');
                            prints('-',k);
                            putchar(' ');
                                if(s[n+1]!=0)putchar(' ');
                        }
 
                    }
                    else if(a[s[n]-'0'][i]=='0')
                    {
                        if(j)  t=0;
                        else{
                            prints(' ',k+2);
                            if(s[n+1]!=0)putchar(' ');
                        }
                    }
                    else
                    {
                        if(a[s[n]-'0'][i]=='2')
                        {
                            putchar('|');
                            prints(' ',k+1);
                        }
                        else if(a[s[n]-'0'][i]=='3')
                        {
                            prints(' ',k+1);
                            putchar('|');
                        }
                        else if(a[s[n]-'0'][i]=='4')
                        {
                            putchar('|');
                            prints(' ',k);
                            putchar('|');
                        }
                        if(s[n+1]!=0)putchar(' ');
                    }
                }
                if(t)putchar('\n');
            }
        }
    }
    return 0;
}

开始设立了一个二维数组里面的是个元素分别对应从0到9的输出规律:
14041 :1代表第一行有“ - ”的输出;4代表有“| |”这样的输出 ;0代表这一行什么也没有;
03030 : 0代表这一行什么输出也没有 ;3代表这一行有“ |”这样的输出,空格数通过输入的数据来控制;
13121 : 1代表第一行有“ - ”的输出;2代表这一行有“| ”这样的输出;
以此类推 找出每个数字对应的液晶显示的规律;

下面就要开始实行真正的输出了,不要紧张听我娓娓道来:::::::

既然要输出图形不如写个函数来搞定一下能减少代码量

void prints(char c,int n)
{
    while(n--)putchar(c);
}

这个函数简单易懂,应该不需要解释吧;
下面开始写主函数:
千万不要被输入样例给迷惑了,题目说输入两个整数,整数要提取每个数字比字符串要繁琐,对于每个数都要/10 ,不如干脆就用字符串输入,又减少了代码量。
对字符串里面的元素取出来判断,字符转化为整型要 -‘0’
下面只需要对全局变量里面的数组和输入的数组元素进行一一查找OK了;;;
例如输入的是1 就要控制“-”的个数 前面有两个空格要单独输出;
还有要注意的一点是每个数字之间都有一个空白列但是在最后一行要输出换行,在格式控制的时候要尤为注意;

谢谢谢谢谢,这是我这个小白第一次写博客,希望大家多多包涵,我在这给你们跪下了,噗通~~~~~

猜你喜欢

转载自blog.csdn.net/weixin_43820496/article/details/85029034
今日推荐