玉兔号控制程序-程序实现题目

背景介绍:

2013年12月14日21时11分,嫦娥三号在月球正面的虹湾以东地区着陆。

 

2013年12月15日凌晨,嫦娥三号搭载的“玉兔”号月球探测器成功与嫦娥三号进行器件分离。

 

题目:

假设我们是中国国家航天局人员,当玉兔号离开嫦娥三号之后,我们需要能够控制玉兔号在月球上开展探测工作。我们先假定虹湾区是一个很大的平原,我们在虹湾区建立一个坐标轴,如下图:

 

       玉兔号离开嫦娥三号后,根据自身安装的定位系统可以知道自己的初始位置,我们记为 X0 , Y0 ; 同时玉兔号也可以知道当前它的朝向,如东、西、南、北(暂时只考虑这四个方向)。

中国国家航天局会向玉兔号发送指令,我们先暂定为3种:

1.F : 当玉兔号接收到这条指令之后,会向前移动一个坐标单位的距离

2.L : 当玉兔号接受到这条指令之后,会原地向左旋转90度

3.R : 当玉兔号接收到这条指令之后,会原地向右旋转90度

要求:

一)设计一个玉兔号的主程序,能够接收中国国家航天局发送过来的指令序列(如FFLFRFLL),执行该指令序列之后,玉兔号能够走到正确的位置,并知道当前正确的位置。(如:玉兔号初始位置为 (0,0),方向朝东,执行指令 FFLFRFLL之后,位置为 (3,1) 方向朝西)      

二)主程序中,不允许出现switch case语句,也不允许出现else关键字,不允许使用三元表达式(? :),if关键字出现的次数要求在5次以下(0-4次)

 三)主程序可以用任何语言编写,如Java、C#、Ruby、Python等 

四)在所选语言允许的情况下,请编写相应的单元测试  

-----------------------------------------------解决方法-------------------------------------------------------------------------------------------------------------

package com.suryani.control;

import java.util.Scanner;

/**
 * @author yxianyao
 * 玉兔探测器简单控制程序.
 */
public class YUTUControl{

 
 public static void main(String args[]){
  System.out.println("请输入操作的指令(F,L,R输入的指令为EXIT退出.)");
  //读取输入的操作指令
  Scanner reader = new Scanner(System.in);
  //操作指令字符串
  String controlOrder = "";
   
  //判断是否输入命令
  while(reader.hasNext()&&!"EXIT".equals(controlOrder=reader.nextLine())){
   //把输入的字符串转化成字符数组.
   char[] controlOrderArr=controlOrder.toCharArray();
    //创建玉兔对象
   YUTU yutu = new YUTU();
   //根据输入的命令执行操作.
   yutu.Move(controlOrderArr);
   System.out.println("请输入操作的指令(F,L,R输入的指令为EXIT退出.)");
  }
 }
 
}

/**
 * @author yxy
 * 玉兔对象
 */
class YUTU{
 //玉兔的移动方向按照方向的顺时针设定方向数组。
 public  String[] direction={"东","南","西","北"};
 public int[] directiInt = {1,-1,-1,1};
 //玉兔的移动方向索引 ,默认初始是东。
 private int directionIndex = 0;
 //玉免所处的坐轴初始位置为(0,0);
 private int x=0,y=0;

 //设置索引
 public int getDirectionIndex() {
  return directionIndex;
 }
 //获取索引
 public void setDirectionIndex(int directionIndex) {
  this.directionIndex = directionIndex;
 }
 
 /**
  * @param orders 指令字符数组.
  * 根据输入的指令字符数组执行操作.
  */
 public void Move(char[] orders){
  for(char order: orders){
   
   if('F'==order){
    //F : 当玉兔号接收到这条指令之后,会向前移动一个坐标单位的距离
    System.out.format("当玉兔号接收到这条指令之后,向%s移动一个坐标单位的距离。\n",
      direction[directionIndex]);
    //判断索引,来判断是要进行加减.
    if(directionIndex%2==0){
     //索引是偶数,就是对x轴的操作,加减根据索引指向数组进行判断是加,是减.
     //执行完成跳出当前的循环.
     x=x+(directiInt[directionIndex]*1);
     continue;
    }
    //索引是奇数,就不用进入判断.直接执行对y轴的操作
    y=y+(directiInt[directionIndex]*1);
   }
   
   if('L'==order){
    //L : 当玉兔号接受到这条指令之后,会原地向左旋转90度
    directionIndex--;
   }
   
   if('R'==order){
    //R : 当玉兔号接收到这条指令之后,会原地向右旋转90度
    directionIndex++;
   } 
   //计算出符合要求的索引范围
    directionIndex=(directionIndex%4+4)%4;
    
   System.out.format("当玉兔号接收到这条指令旋转之后,现在的%s方向\n",
     direction[directionIndex]);
  }
  
  System.out.format("操作指令运行完成后的坐标是:(%d,%d)\n",x,y);
 }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值