题目描述
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。
Standard Input
输入包括若干行,每行表示一个要显示的数。每行有两个整数s 和n (1 <= s <= 10, 0 <=n<= 99999999),这里n 是要显示的数,s 是要显示的数的尺寸。如果某行输入包括两个0,表示输入结束。这行不需要处理。
Standard Output
显示的方式是:用s 个’-‘表示一个水平线段,用s 个’|'表示一个垂直线段。这种情况下,每一个数字需要占用s+2 列和2s+3 行。另外,在两个数字之间要输出一个空白的列。在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
Samples
题解
1、用字符串的形式来存储我们的数字串(用字符-'0’计算对应数值)
2、需要知道的是打印顺序一定是从左往右,从上到下!逐行扫描…
3、将一个显示出的内容分成七个部分!如下:
1 --
2| |3
| |
4 --
5| |6
| |
7 --
4、用七个字符数组存储’-‘和’|‘每个下标位置对应的该数字输出空格" "还是实在的字符
5、输出’-‘时数量是s个(横向),而输出’|'时是s行(纵向),这一点决定了循环的内外嵌套结构
6、既然是逐行扫描输出,那么1、4、7部分可以单独输出,而(2 3)和(5 6)部分应该绑定在一起(注意输出正确数量的空格)
实现代码如下:
#include<bits/stdc++.h>
#define N 11
using namespace std;
char n1[N]={"- -- -----"};
char n2[N]={"| ||| ||"};
char n3[N]={"||||| |||"};
char n4[N]={" ----- --"};
char n5[N]={"| | | | "};
char n6[N]={"|| |||||||"};
char n7[N]={"- -- -- --"};
int main(){
int s,i,x,k,j,len;
char a[10];
while(1){
scanf("%d %s",&s,a);//输入数和s笔
if(s==0) break;
len=strlen(a);
//输出第一笔画
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<" ";
for(k=0;k<s;k++){
cout<<n1[x];
}
cout<<" ";
}
printf("\n");
//输出第二三笔画
for(k=0;k<s;k++){//因为是竖着排列
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<n2[x];
for(j=0;j<s;j++){
cout<<" ";
}
cout<<n3[x];
}
printf("\n");
}
//输出第四笔画
for(i=0;i<len;i++){
cout<<" ";
x=a[i]-'0';
for(k=0;k<s;k++){
cout<<n4[x];
}
cout<<" ";
}
printf("\n");
//输出第五六笔画
for(k=0;k<s;k++){
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<n5[x];
for(j=0;j<s;j++){
cout<<" ";
}
cout<<n6[x];
}
printf("\n");
}
//输出第七笔画
for(i=0;i<len;i++){
cout<<" ";
x=a[i]-'0';
for(k=0;k<s;k++){
cout<<n7[x];
}
cout<<" ";
}
printf("\n");
}
cout<<endl;
return 0;
}
输出:
陷阱牌 说完了思路,说几个编程的坑点:
1、这个s输出个数/空格该咋用?
下面是错误代码:
//输出第一笔画
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<" ";
while(s--){//敲黑板了!
cout<<n1[x];
}
cout<<" ";
}
printf("\n");
不是说while(s–)这样写错了,而是说如果不使用一个变量来存储s使其固定,那么后面的s只会一路向北,离开有你的季节 一直减减到生生世世了
正确如下:
//输出第一笔画
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<" ";
for(k=0;k<s;k++){//都用k从0开始就没毛病了
cout<<n1[x];
}
cout<<" ";
}
printf("\n");
2、多重循环中的变量的使用问题
重复!重复!重复!一个变量在嵌套循环中多次使用,所以发现结果不尽人意
错误代码如下:
//输出第二三笔画
for(k=0;k<s;k++){//因为是竖着排列
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<n2[x];
for(k=0;k<s;k++){//敲黑板!两次用k了,相关联了!应该使其独立循环
cout<<" ";
}
cout<<n3[x];
}
printf("\n");
}
3、c++代码的不正确使用
简单来说就是在代码的中间部分希望输出一个换行符,但是我用了cout<<endl;这让我的代码中途卡死…无后续…
//输出第二三笔画
for(k=0;k<s;k++){//因为是竖着排列
for(i=0;i<len;i++){
x=a[i]-'0';
cout<<n2[x];
for(j=0;j<s;j++){
cout<<" ";
}
cout<<n3[x];
}
cout<<endl;//???在干嘛???
}
这里使用printf("\n"); 就友好了哦
4、无限循环的终止条件
看看原来错误的代码:
scanf("%d %s",&s,a);//输入数和s笔
while(1){
if(s==0) break;
...
}
这个后果就是你要输出5,那么就一直输出5,前有古人后有来者 ,满屏55555 ㄒoㄒ
while(1){
scanf("%d %s",&s,a);//输入数和s笔
if(s==0) break;
...
}
如上就欧克了,很多时候就是会忽略输出/清零应该放在循环外还是内,一定要小心哦!
这个代码我改了很久,思路理清之后的编程问题比较多…上面几个问题是比较典型的,同时也是我主要犯的错(真的就逐行调试了三四编)用极大的耐心来逐行逐行调试也算个方法吧。