分类: C/C++
2011-10-29 18:33:50
题目:5张卡片排成一列,上面依次写着A,B,C,D,E。把第1张插入第3和第4张之间,再把第2张插入第4和第5张之间,再把第5张插入第1和第2张之间。问此时卡片上的字母的顺序是什么样的?
用计算机解决问题,实际上可以看做对用笔、纸解决问题的一种抽象和模拟。代码则可以看做对解决方案和求解过程的描述和表示。
因而,用程序解决问题的前提是用笔在纸上能通过有限的步骤实施这种解决方案。在不清楚应该如何写代码的情况下,可以用笔在纸上实际地研究并实践一下问题的解决方法,并归纳出解决的方法和步骤。如果用笔在纸上都无法解决问题,就根本谈不上写代码。
首先,问题要求把5张的卡片排成一列,上面依次写着A、B、C、D、E:
1. 把第1张卡片移开到一个临时位置
2. 把第2张卡片移到位置1
3. 把第3张卡片移到位置2
4. 把临时位置的卡片移到位置3
在这个过程中,分别需要记录一共5+1个位置上的数据,这在代码中可以通过申请5+1块内存来模拟并实现,即定义5+1个变量来“记忆”各个位置上的数据及其变化情况。
题目中涉及到的数据有A、B、C、D、E一共5个,所以可以用任何一种能表示5种不同状态的数据类型来表示,比如说用1.1代表A,2.2代表B,3.3代表C,4.4代表D,5.5代表E。当然,也可以用除_Bool以外的任何一种整数类型来表示。
由于数据是A、B、C、D、E这5个字母,显然用char类型更为直观方便。
这样,移动过程中的5+1个位置可以用5+1个char类型的变量来模拟:
对应的代码为:
卡片上的字母用字符常量表示:
对应的代码是:
在计算机内部,这实际上是把A、B、C、D、E这几个字符的编码(编号)写在了几个变量所表示的内存块中。
移动的过程可以用赋值运算表示
1. 把第1张卡片移开到一个临时位置
2. 把第2张卡片移到位置1
后面依此类推
3. 把第3张卡片移到位置2
4. 把临时位置的卡片移到位置3
这样就完成了“把第1张插入到第3、4张之间”的模拟。
下面是完整的代码: