黑马程序员技术交流社区

标题: 自己写的机器人行走问题,报越界异常,求修改。 [打印本页]

作者: 许智敏    时间: 2013-5-15 09:52
标题: 自己写的机器人行走问题,报越界异常,求修改。
本帖最后由 许智敏 于 2013-5-19 14:27 编辑
  1. /*
  2. * 请帮忙修改一下~谢谢~
  3. *
  4. *
  5. * 机器人行走。
  6. * 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。
  7. * 小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
  8.     例如,我们可以对小车输入如下的指令
  9.     15L10R5LRR10R20
  10.     则,小车先直行15厘米,左转,再走10厘米,再右转,...
  11.     不难看出,对于此指令串,小车又回到了出发地。
  12.     你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。
  13. 【输入、输出格式要求】
  14.     用户先输入一个整数n(n<100),表示接下来将有n条指令。
  15.     接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)
  16.     每条指令的长度不超过256个字符。
  17.     程序则输出n行结果。
  18.     每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
  19.     例如:用户输入:
  20. 5
  21. L100R50R10
  22. 3LLL5RR4L12
  23. LL
  24. 100R
  25. 5L5L5L5
  26.     则程序输出:
  27. 102.96
  28. 9.06
  29. 0.00
  30. 100.00
  31. 0.00
  32. */
  33. package part2;
  34. import java.text.DecimalFormat;
  35. import java.util.ArrayList;
  36. import java.util.Scanner;

  37. public class Test14 {
  38.         public static void main(String[] args){
  39.                 Scanner scan = new Scanner(System.in);
  40.                 System.out.println("输入要输入的指令数:");
  41.                 int n = scan.nextInt();
  42.                 scan.nextLine();
  43.                 String[] ss = new String[n];
  44.                 System.out.println("请输入要输入的"+n+"条指令:");
  45.                 for(int i=0;i<n;i++)
  46.                         ss[i] = scan.nextLine();
  47.                 for(int i=0;i<n;i++){
  48.                         int x,y;//定义x,y,记录机器人的坐标,
  49.                         x=y=0;
  50.                         double dis = 0.0;//最终机器人到原点的距离
  51.                         ArrayList<Character> al = new ArrayList<Character>();
  52.                         al.add('S');//用集合模拟东西南北,二维坐标系。
  53.                         al.add('W');
  54.                         al.add('N');
  55.                         al.add('E');
  56.                         for(int j=0;j<ss[i].length();j++){//L100R50R10
  57.                                 if(ss[i].charAt(j)=='L'){//向左转,
  58.                                         al.add(al.remove(0));
  59.                                         continue;
  60.                                 }
  61.                                 if(ss[i].charAt(j)=='R'){//向右转
  62.                                         al.add(0,al.remove(3));
  63.                                         continue;
  64.                                 }
  65.                                 int a = 0;
  66.                                 String s = "";
  67.                                 System.out.println(s);
  68.                                 while(ss[i].charAt(j+a)>='0'&&ss[i].charAt(j+a)<='9'&&j+a<ss[i].length()){//取出数字部分。
  69.                                         s+=ss[i].charAt(j+a);
  70.                                         a++;
  71.                                 }
  72.                                 j = j+a-1;//改变增量j
  73.                                 int b = Integer.parseInt(s);//把本次走的路程变成int型
  74.                                 if((char)al.get(0)=='S')//横纵坐标的加减
  75.                                         y += b;
  76.                                 else if((char)al.get(0)=='W')
  77.                                         x -= b;
  78.                                 else if((char)al.get(0)=='N')
  79.                                         y -= b;
  80.                                 else if((char)al.get(0)=='E')
  81.                                         x += b;
  82.                         }
  83.                         DecimalFormat formater = new DecimalFormat("#0.##");
  84.                         dis = Math.sqrt(Math.pow(Math.abs(x),2)+Math.pow(Math.abs(y),2));
  85.                         dis = Double.parseDouble(formater.format(dis));
  86.                         System.out.println(dis);
  87.                 }
  88.         }
  89. }
复制代码

作者: 何俊森    时间: 2013-5-19 12:06
其实就是那个你要先判断是否越界j+a<ss[i].length()。可以这么写 while(j+a<ss[i].length() && ss[i].charAt(j+a)>='0'&&ss[i].charAt(j+a)<='9'){}
作者: 许智敏    时间: 2013-5-19 14:26
何俊森 发表于 2013-5-19 12:06
其实就是那个你要先判断是否越界j+a

对的对的~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2