字符串的显示器输出附加各坑点

题目描述
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。
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;
		...
	}

如上就欧克了,很多时候就是会忽略输出/清零应该放在循环外还是内,一定要小心哦!
这个代码我改了很久,思路理清之后的编程问题比较多…上面几个问题是比较典型的,同时也是我主要犯的错(真的就逐行调试了三四编)用极大的耐心来逐行逐行调试也算个方法吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值