一、题目链接:【深基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们,可以再去复习复习捏🤏