Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229370
  • 博文数量: 39
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 453
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-26 15:54
文章分类

全部博文(39)

文章存档

2012年(1)

2011年(31)

2010年(7)

分类: C/C++

2011-10-29 18:33:50

题目:5张卡片排成一列,上面依次写着ABCDE。把第1张插入第3和第4张之间,再把第2张插入第4和第5张之间,再把第5张插入第1和第2张之间。问此时卡片上的字母的顺序是什么样的?

用计算机解决问题,实际上可以看做对用笔、纸解决问题的一种抽象和模拟。代码则可以看做对解决方案和求解过程的描述和表示。

因而,用程序解决问题的前提是用笔在纸上能通过有限的步骤实施这种解决方案。在不清楚应该如何写代码的情况下,可以用笔在纸上实际地研究并实践一下问题的解决方法,并归纳出解决的方法和步骤。如果用笔在纸上都无法解决问题,就根本谈不上写代码。

首先,问题要求把5张的卡片排成一列,上面依次写着ABCDE

把第1张插入到第34张之间可以通过如下步骤完成:

 

1.  把第1张卡片移开到一个临时位置

2.  把第2张卡片移到位置1

3.  把第3张卡片移到位置2

4.  把临时位置的卡片移到位置3

在这个过程中,分别需要记录一共5+1个位置上的数据,这在代码中可以通过申请5+1块内存来模拟并实现,即定义5+1个变量来“记忆”各个位置上的数据及其变化情况。

题目中涉及到的数据有ABCDE一共5个,所以可以用任何一种能表示5种不同状态的数据类型来表示,比如说用1.1代表A2.2代表B3.3代表C4.4代表D5.5代表E。当然,也可以用除_Bool以外的任何一种整数类型来表示。

由于数据是ABCDE这5个字母,显然用char类型更为直观方便。

这样,移动过程中的5+1个位置可以用5+1个char类型的变量来模拟:

对应的代码为:

 

  1. char wz_1,wz_2,wz_3, wz_4,wz_5,
  2.      wz_ls;

卡片上的字母用字符常量表示:

对应的代码是:

 

  1. char wz_1 = 'A' , wz_2 = 'B' ,wz_3 = 'C' , wz_4 = 'D' ,wz_5 = 'E',
  2.      wz_ls ;

在计算机内部,这实际上是把ABCDE这几个字符的编码(编号)写在了几个变量所表示的内存块中。

移动的过程可以用赋值运算表示

1.  把第1张卡片移开到一个临时位置

 

  1. wz_ls = wz_1 ;

2.  把第2张卡片移到位置1

 

  1. wz_1 = wz_2 ;

后面依此类推

3.  把第3张卡片移到位置2

 

  1. wz_2 = wz_3 ;

4.  把临时位置的卡片移到位置3

 

  1. wz_3 = wz_ls ;

这样就完成了“把第1张插入到第34张之间”的模拟。

下面是完整的代码:

 

  1. /*
  2. 第三章 习题8
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>

  6. int main( void )
  7. {
  8.   char wz_1 = 'A' , wz_2 = 'B' ,
  9.        wz_3 = 'C' , wz_4 = 'D' ,
  10.        wz_5 = 'E' ;
  11.   
  12.   { //把第1张插入第3和第4张之间
  13.       char wz_ls ;
  14.       wz_ls = wz_1 ;
  15.       wz_1 = wz_2 ;
  16.       wz_2 = wz_3 ;
  17.       wz_3 = wz_ls ;
  18.   }
  19.   
  20.   { //把第2张插入第4和第5张之间
  21.       char wz_ls ;
  22.       wz_ls = wz_2 ;
  23.       wz_2 = wz_3 ;
  24.       wz_3 = wz_4 ;
  25.       wz_4 = wz_ls ;
  26.   }
  27.   
  28.   { //再把第5张插入第1和第2张之间
  29.       char wz_ls ;
  30.       wz_ls = wz_5 ;
  31.       wz_5 = wz_4 ;
  32.       wz_4 = wz_3 ;
  33.       wz_3 = wz_2 ;
  34.       wz_2 = wz_ls ;
  35.   }
  36.   
  37.   printf("最后卡片上的字母的顺序为"
  38.          "%c%c%c%c%c\n",
  39.          wz_1, wz_2, wz_3, wz_4, wz_5
  40.         ) ;
  41.         
  42.   system("PAUSE");    
  43.   return 0;
  44. }
阅读(2705) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~