实例17 ASCII的打印

其实内容都很简单,只是想记录一下自己的学习经历和总结一些方法。

首先说一下解决问题的一些方法。自顶向下求解。也就是说从结果出发,倒推代码的书写过程,可能写短代码感觉不到逻辑的重要性,但是写的代码如果很长,那么肯定要先设计步骤,分解问题。

我给的是输出结果:要求我们安装图示的要求打印出字符表。其实这个问题很简单。

但是我认为强制的分析下过程,加深自己的理解。按照我开始写的,自顶向下求解。所以先是观察输出结果。根据高中锻炼的知识,大多数人都知道如何观察表格数据。一般来说,无非就是横向和纵向观察。

横向看一下:0,16,32.这个暗示还是很明显的啦。估计对数字敏感的人一下就知道是等差数列了,公差为16.基于计算机是横向打印的,你可以猜测出存在于类似i+=16(i=i+16)的式子。

纵向观察下:好巧,也是等差数列。但是有一点反常的就是。0,1,2竟然是纵向排列,常规不应该是横向的嘛。事出反常必有妖啊。

看完横向纵向,大致可以得出如下信息:有类似步长为16和1的东西。而且应该是两个循环。一个是控制横向打印(步长16)一个控制纵向打印(步长1)。而且循环是嵌套的,不然不相关的两个循环也没啥可说的。

基于常识可以知道一共128个字符,进一步推测循环的范围可能和128有关系,而且有16行,8列,循环范围可能和这两个数字有关系。

补充一个基本只是。char(i)函数可以打印出打印字符,但是非打印字符就打印不出了.怎么解决这个问题?另一个好东西来了。转义(\)。现在我们知道了要把非打印字符单独拿出来设置一下转义。

现在整理一下思路:要按格式打印字符表→用char函数→但是格式有要求→根据观察大致推测一下循环嵌套以及范围→控制下格式→准备打印。

但是一个难点就是如何设置非打印字符??

解决方案:因为字符表是有顺序的,我们可以在添加选择语句,让循环变量进行选择。也就是说循环变量累加到非打印字符时让它单独打印。

下面上代码,首先要明白,代码一般普通人是做不到一次性搞定的,好的代码是改出来的,所以有点思路就开始撸吧。

#include<iostream>
using namespace std;
int main(){
	int i=0;
	for (int j = 0; j < 16; j++){
		i = j;
		while (i < 128){
			switch (i)
			{
			case 7:
				cout << i << "=" << " \\a" << '\t';
				break;
			case 8:
				cout << i << "=" << "\\b" << '\t';
				break;
			case 9:
				cout << i << "=" << "\\t" << '\t';
				break;
			case 10:
				cout << i << "=" << "\\n" << '\t';
				break;
			case 11:
				cout << i << "=" << "\\v" << '\t';
				break;
			case 12:
				cout << i << "=" << "\\f" << '\t';
				break;
			case 13:
				cout << i << "=" << "\\r" << '\t';
				break;
			default:
				cout << i << "=" << char(i) <<'\t';
			}
			i = i + 16;
		}
		cout << endl;
	}
	return 0;
}
//这种问题重点在于观察输出的格式。还要要知道char(i)函数。计算机都是横向逐行打印。分校代码的打印结果,每行开头是0,16,32,间隔都是16,可以想到是打印char(0),然后是char(16)等等等。
//观察纵向,第一个是0,第二行第一个竟然是1,
//此代码用swithc语句很巧妙实现了非打印字符的输出。

这个我写的代码,大家大致参考下就行。自己回去想办法解决下非打印字符问题吧。方法不唯一,欢迎想到了来分享下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值