关于一道笔试题,对逻辑运算符的分析

  微笑  第一次发表博客,不喜勿喷,如有不足或错误,欢迎指出。

下面是这道笔试题:

 

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

 

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

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

 

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

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

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

要求:

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

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

 

下面是我的解决方案:

 

import java.util.Scanner;

public class Template {

	public static Scanner in = new Scanner(System.in);

	// 0:X轴,1:Y轴
	public int $xy = 0;
	// 0:正方向,1:负方向
	public int $JJ = 0;
	// $x:x坐标,$y:y坐标
	public int $x = 0, $y = 0;
	// 方向
	public String orientation = "东";

	public boolean X_jia() {
		$x += 1;
		return true;
	}

	public boolean X_jian() {
		$x -= 1;
		return true;
	}

	public boolean Y_jia() {
		$y += 1;
		return true;
	}

	public boolean Y_jian() {
		$y -= 1;
		return true;
	}

	public boolean setToX_jia() {
		$xy = 0;
		$JJ = 0;
		orientation = "东";
		return true;
	}

	public boolean setToX_jian() {
		$xy = 0;
		$JJ = 1;
		orientation = "西";
		return true;
	}

	public boolean setToY_jia() {
		$xy = 1;
		$JJ = 0;
		orientation = "北";
		return true;
	}

	public boolean setToY_jian() {
		$xy = 1;
		$JJ = 1;
		orientation = "南";
		return true;
	}

	public void execute() {
		System.out.println("请输入指令(F/L/R):");
		String cmd = in.nextLine();
		char[] cmds = cmd.toCharArray();
		for (char c : cmds) {
			if (   (c == 'F' && $xy == 0 && $JJ == 0 && X_jia() )
				|| (c == 'F' && $xy == 1 && $JJ == 0 && Y_jia() )
				|| (c == 'F' && $xy == 0 && $JJ == 1 && X_jian())
				|| (c == 'F' && $xy == 1 && $JJ == 1 && Y_jian()) 
				|| (c == 'R' && $xy == 0 && $JJ == 0 && setToY_jian())
				|| (c == 'R' && $xy == 1 && $JJ == 0 && setToX_jia() )
				|| (c == 'R' && $xy == 0 && $JJ == 1 && setToY_jia() )
				|| (c == 'R' && $xy == 1 && $JJ == 1 && setToX_jian()) 
				|| (c == 'L' && $xy == 0 && $JJ == 0 && setToY_jia() )
				|| (c == 'L' && $xy == 1 && $JJ == 0 && setToX_jian())
				|| (c == 'L' && $xy == 0 && $JJ == 1 && setToY_jian())
				|| (c == 'L' && $xy == 1 && $JJ == 1 && setToX_jia())) {
			}
		}
		System.out.println("坐标:(" + $x + "," + $y + ")");
		System.out.println("方向:" + orientation);
	}

	public static void main(String[] args) {
		new Template().execute();
	}
}

     有的人看到if的条件里面这么多逻辑运算符可能就眼花了,其实这里是利用boolean类型和逻辑运算符来实现运算和判断的,这里外层的逻辑或‘||’是衔接每种可能出现的情况,因为逻辑运算符都有短路的情况,逻辑或‘||’是条件一旦符合了就不再继续判断同层的条件,可以理解为一个括号内的条件,所以内层用的是逻辑与‘&&’运算符,每一种情况必须满足括号内的所有条件才能使得这种情况成立,然后整个判断将是返回true。这样运算完全满足题意,当然也会有点难读懂。这段代码也有很多地方没处理,主要是写了这个逻辑过程,请不要在意这些细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值