这道C语言题怎么做啊,我做的哪里错了,为什么会有这两种显示啊,求助

如题所述

第1个回答  2015-11-21

  让我来慢慢给你解释这道题


  首先解释为什么AB之后C跑到上一行最后了。我不知道你的数组和指针学的怎么样,我就按照你有基础来解释了。

  你是10*10数组a[10][10],B的坐标是(1,0),也就是a[1][0]='B'。二维数组的存储方式对计算机来说其实和一维数组没差。按照二维数组转换成指针算法:a[x][y] = *(a+10*x+y),那么a[1][0]= *(a+10*1+0) = *(a+10)。然后产生随机数找'C'的存放位置,如果产生的随机数是让你左移,那么你'C'的存放位置就是a[1][-1],但是坐标有负数,我们来转换一下 a[1][-1]= *(a+10*1-1) = *(a+9),我们可以等效成*(a+9)=*(a+10*0+9) = a[0][9]。所以'C'的真正存放位置是a[0][9],从'B'的(1,0)跳到了'C'的(0,9)这就是为什么会从最左边跳转至上一行的最右边。

  解决办法就是加上边界判断,不是通过判断落点是不是'.',而是通过坐标。如果你是a[0][y],你就要加规则不能左移,如果你是a[x][0]你就不能上移,如果你是a[9][y]就不能下移,如果你是a[x][9]你就不能右移。


  然后再来解释为什么'Z'后面会多出一个'[',因为你的代码先判断了“while(ch <= 'Z')”然后又“ch=ch+1;a[H][L]=ch;”。当ch为'Y'的时候,数组这是得到的赋值是'Z',而当ch为'Z'的时候依然可以进入循环,这时数组得到的赋值是'Z'+1,按照asicII码,也就是'['。

  解决办法就是赋值前再判断。


  最后还有一个没有输出的问题,当你出现题目中的状况,四个方向都堵住了,那么在这里

if(a[H][L]=='.'){
    ch=ch+1;
    a[H][L]=ch;
}else{
    H=h;
    L=l;
    continue;
}

就会陷入一直continue的死循环,然后后面的输出就运行不到那里去了。

解决办法,else里面continue之前还要加上是不是四面堵死的判断,如果四面都堵死就直接break,没有四面堵死再continue。

第2个回答  2015-11-21
把完整代码复制粘贴出来啊,不然怎么看代码
第3个回答  2015-11-21
楼主题目来自《C程序设计现代方法》?追问

是的

相似回答