#洛谷题解:P5703(数组)

一、题目链接:【深基5.例10】显示屏 - 洛谷

学习要点:

                   1、数字的变量类型选择:如果是在0~9之间的数字,根据题目要求是开int 还是开char,并且后续要记住是int还是char的数字,不能只记得是个数字, 即搞清变量类型

                   2、数组:1⃣️、如果读入需要保存,就开数组,不需要保存就开一个变量,实时处理即可

                                    2⃣️、数组长度为n,存储从0~(n-1)

                                    3⃣️、对多维数组的处理

                   3、scanf:   如果用scanf读入非空白字符,一律写成scanf("  %c", &*), 避免空白字符读入

                   4、在现实中需要竖着写的,在程序中考虑用二重循环处理

                   5、弄清楚各个变量之间的关系,写在纸上

二、题目:

1. 题目描述:

液晶屏上,每个阿拉伯数字都是可以显示成 3×5的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过 100100)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。

2. 输入格式:

第一行输入一个正整数 n,表示数字的位数。

第二行输入一个长度为 n 的自然数。

3. 输出格式:

输出五行,表示显示屏上的数字。

4.输出样例:

输入:

10
0123456789

输出:

XXX...X.XXX.XXX.X.X.XXX.XXX.XXX.XXX.XXX
X.X...X...X...X.X.X.X...X.....X.X.X.X.X
X.X...X.XXX.XXX.XXX.XXX.XXX...X.XXX.XXX
X.X...X.X.....X...X...X.X.X...X.X.X...X
XXX...X.XXX.XXX...X.XXX.XXX...X.XXX.XXX

5.说明/提示:

数据保证:1 <= n <= 100

三、题目分析

首先,题目中n<=100, 所以开int类型即可

然后由样例可知从0~9依次对应一个图案,再加上输出是先输出一行再输出下一行,所以要二重循环(因为没办法完整打出一个图案再从第一行开始打第二个图案,这和九九乘法表是一样的),因此决定暴力打表

其次,从样例中分析出0~9的图案表示:


    {//0
        "XXX",
        "X.X",
        "X.X",
        "X.X",
        "XXX"
    },
    
    {//1
        "..X",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//2
        "XXX",
        "..X",
        "XXX",
        "X..",
        "XXX"
    },
    
    {//3
        "XXX",
        "..X",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//4
        "X.X",
        "X.X",
        "XXX",
        "..X",
        "..X"
    },
    
    {//5
        "XXX",
        "X..",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//6
        "XXX",
        "X..",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//7
        "XXX",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//8
        "XXX",
        "X.X",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//9
        "XXX",
        "X.X",
        "XXX",
        "..X",
        "XXX"
    }

四、错误记录:

(先浅浅记录一下,题主的错误):

#include <stdio.h>
//打表
char c[10][5][4] = {
    {//0
        "XXX",
        "X.X",
        "X.X",
        "X.X",
        "XXX"
    },
    
    {//1
        "..X",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//2
        "XXX",
        "..X",
        "XXX",
        "X..",
        "XXX"
    },
    
    {//3
        "XXX",
        "..X",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//4
        "X.X",
        "X.X",
        "XXX",
        "..X",
        "..X"
    },
    
    {//5
        "XXX",
        "X..",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//6
        "XXX",
        "X..",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//7
        "XXX",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//8
        "XXX",
        "X.X",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//9
        "XXX",
        "X.X",
        "XXX",
        "..X",
        "XXX"
    }

};


int main(int argc, const char * argv[]){
    int digit;
    char n;
    int num[101];
    scanf("%d", &digit);
    for( int i = 0; i <= digit; i++){
        scanf("%c", &n);  // 错误1:没有写成 %c,导致读入\n
        num[i] = n;
    }
    for(int i = 0; i<= 4; i++){
        for(int j = 0; j <= digit; j++){  // 错误2: digit是总共的位数,存储是在0~digit-1中
            printf("%s", c[j][i]);  // 错误3:没有弄清是将char数字存在了数组里,应该写成c[num[j]-'0'][i],而不是直接c[j][i]
            if(j < digit)
                printf(".");
        }
        printf("\n");
    }
    return 0;
}

五、代码实现

#include <stdio.h>
//打表
char c[10][5][4] = {
    {//0
        "XXX",
        "X.X",
        "X.X",
        "X.X",
        "XXX"
    },
    
    {//1
        "..X",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//2
        "XXX",
        "..X",
        "XXX",
        "X..",
        "XXX"
    },
    
    {//3
        "XXX",
        "..X",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//4
        "X.X",
        "X.X",
        "XXX",
        "..X",
        "..X"
    },
    
    {//5
        "XXX",
        "X..",
        "XXX",
        "..X",
        "XXX"
    },
    
    {//6
        "XXX",
        "X..",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//7
        "XXX",
        "..X",
        "..X",
        "..X",
        "..X"
    },
    
    {//8
        "XXX",
        "X.X",
        "XXX",
        "X.X",
        "XXX"
    },
    
    {//9
        "XXX",
        "X.X",
        "XXX",
        "..X",
        "XXX"
    }

};


int main(int argc, const char * argv[]){
    int digit;
    char n;
    char num[101];
    scanf("%d", &digit);
    for( int i = 0; i <= digit-1; i++){
        scanf(" %c", &n);
        num[i] = n;
    }
    for(int i = 0; i<= 4; i++){
        for(int j = 0; j <= digit-1; j++){
            printf("%s", c[num[j]-'0'][i]);
            if(j < digit-1)
                printf(".");
        }
        printf("\n");
    }
    return 0;
}

六、总结

题主的第一篇题解捏,请大家多多指教,希望能和大家共同进步,一起加油!!!

小建议:如果有对多维数组不熟悉的uu们,可以再去复习复习捏🤏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值