一个软件工程师的题目http://www.2cto.com/kf/201403/283305.htm

题目如下:

题目:

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

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

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

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

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

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

要求:

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

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

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

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

思路:一般有多条件的,我们会选择使用if/else、switch /case ,但题目明确规定 不能使用,if也限定次数,很自然就想到委托(c++里面的函数指针),还有怎么实现根据输入自动选择哪种操作,这就想到了字典(键/值).

//窗口程序代码实现====================

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace YutuControl

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

public  class Move

{

delegate void DelegateFront();

//字典实现

private Dictionary<string, DelegateFront> Dictionary = new Dictionary<string, DelegateFront>();

private int direction;

private const int MaxDirection = 4;//常量表示当前有4个方向

public int x,y;

public void move(int x, int y, int direction)

{

//Turn_Direction = 0; //北

//Turn_Direction = 1; //东

//Turn_Direction = 2; //南

//Turn_Direction = 3; //西

this.x = x;

this.y = y;

direction = direction;

//使用委托+字典实现

Dictionary["0"] = new DelegateFront(NorthAdd);

Dictionary["1"] = new DelegateFront(EastAdd);

Dictionary["2"] = new DelegateFront(SouthAdd);

Dictionary["3"] = new DelegateFront(WestAdd);

}

/// <summary>

/// 逆时针

/// </summary>

public void DealLeft()

{

direction = (direction - 1 + MaxDirection) % MaxDirection;

}

/// <summary>

/// 顺时针

/// </summary>

public void DealRight()

{

direction = (direction + 1) % MaxDirection;

}

public void DealFront()

{

//没有使用委托实现

//if (direction == (int)Diretion.North) { ++y; return; }

//if (direction == (int)Diretion.South) { --y; return; }

//if (direction == (int)Diretion.West) { --x; return; }

//++x;

//使用委托+字典实现

if (Dictionary.ContainsKey(direction.ToString()))

{

//调用委托

Dictionary[direction.ToString()]();

}

}

private void NorthAdd()

{

++y;

}

private void SouthAdd()

{

--y;

}

private void WestAdd()

{

--x;

}

private void EastAdd()

{

++x;

}

public string Print()

{

return "x:" + x + ",y:" + y;

// Console.WriteLine("x:" + x + ",y:" + y);

// Console.WriteLine("Direction:" + (Diretion)direction);

//  Console.ReadKey();

}

//  Singleton模式:

private  static Move instance;

private Move() { }

public static Move Instance

{

get

{

if (instance == null)

{

instance = new Move();

}

return instance;

}

}

}

class Direction

{

int north;

int south;

int west;

int east;

public int North

{

get{return north;}

set{ north  =   3;}

}

public int East

{

get { return east; }

set { east = 2; }

}

public int South

{

get { return south; }

set { south = 1; }

}

public int West

{

get { return west; }

set { west = 0; }

}

}

public delegate void OperatorDelegate();

public  int X , Y ;

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

//字典实现

Direction direction = new Direction();

var Key = new System.Collections.Generic.Dictionary<string, OperatorDelegate>();

// Move YuTu3 = new Move(0, 0, direction.North);

//    Move YuTu3 = new Move();

Move.Instance.move(X, Y, direction.North);

Key["F"] = new OperatorDelegate(Move.Instance.DealFront);

Key["L"] = new OperatorDelegate(Move.Instance.DealLeft);

Key["R"] = new OperatorDelegate(Move.Instance.DealRight);

string key = e.KeyValue.ToString();

if (key=="70")

{

string instruct = "F";

if (Key.ContainsKey(instruct))

{

Key[instruct]();

}

Y = Move.Instance.y;

X = Move.Instance.x;

label1.Text = string.Format("x: {0}"+"y: {1}:",X,Y);//Y.ToString();

}

}

}

}

时间: 2024-10-07 05:22:49

一个软件工程师的题目http://www.2cto.com/kf/201403/283305.htm的相关文章

作为一个软件工程师,在接下来的 5-10 年内应该掌握的技术

这是一个发布在Quora上的问题,提问者问到:“作为一个软件工程师,想要生存下去,在未来的 5-10 年内有哪些必须掌握的技能呢?例如人工智能?高等数学?” 下面是一位曾经在 Facebook 和 Google 工作过,目前在 Uber 就职的程序员 Pedram Keyani 的分享,目前已获得 3500+ 的赞: 如果你的目标是成为一名通用软件工程师,那么未来 5-10 年需要掌握的技能与过去 5-10 年并没有什么太多的差别. 通用技能: 深刻理解计算机科学的基本原理 数据库 网络技术 编

如何评价一个软件工程师的计算机网络知识水平与网络编程技能水平?

网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.网络工程师能够从事计算机信息系统的设计.建设.运行和维护工作.网络工程师是指基于硬.软件两方面的工程师,根据硬件和软件的不同.认证的不同,将网络工程师划分成很多种类.网络工程师分硬件网络工程师和软件网络工程师两大类,硬件网络工程师以负责网络硬件等物理设备的维护和通信:软件网络工程师负责系统软件,应用软件等的维护和应用. 本张试卷主要就是结合了历年408真题里面的经典题目,具体如下: 一.选择 1. HDLC 协议对 01

如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?

本张试卷习题全部来自于2012年考研408计算机网络部分真题,答案解析部分参考了网上的答案并进行了完善. 一.选择题 1. 在 TCP/IP 体系结构中,直接为 ICMP 提供服务的协议是 . A. PPP B. IP C. UDP D. TCP 2.在物理层接口特性中,用于描述完成每种功能的事件发生顺序的是 . A. 机械特性 B. 功能特性 C. 过程特性 D. 电气特性 3. 以太网的 MAC 协议提供的是 . A. 无连接不可靠服务 B. 无连接可靠服务 C. 有连接不可靠服务 D. 有

如何评测一个软件工程师的计算机水平网络知识水平与网络编程技能水平?

1.OSI参考模型的第5层(自下而上)完成的主要功能是 A. 差错控制 B. 路由选择 C. 会话管理 D. 数据表示转换 2.100BaseT快速以太网使用的导向传输介质是 A. 双绞线 B. 单模光纤 C. 多模光纤 D. 同轴电缆 3. 对于滑动窗口协议,如果分组序号采用3比特编号,发送窗口大小为5,则接收窗口最大是 A. 2 B. 3 C. 4 D. 5 4. 假设一个采用CSMA/CD协议的100Mbps局域网,最小帧长是128 B,则在一个冲突域内两个站点之间的单向传播延时最多是 A

读构建之法 第三章:软件工程师的成长

本章理论和知识点:评价软件工程师水平的主要方法 软件工程把相关的技术和过程统一到一个体系中,叫"软件开发流程",软件开发流程的目的是为了提高软件开发.运营.维护的效率,以及提升用户满意度.软件的可靠性和可维护性. 软件开发流程不光指团队的流程,还包括个人开发流程,因为软件团队是由个人组成的.个人在团队中也有独立的流程.把每个人的工作有序地组织起来,就是团队的流程."有序",并不是"无争论".在大部分成功的软件团队模型中,各个角色有不同意见的冲突在

作为软件工程师,你必须知道的20个常识

1.针对面向对象的设计与分析:为了让软件有更好的可维护性,重用性以及快速开发, 简短的 OOAD 与它的 SOLID 原则对于每一个软件工程师来说都是该牢记的. 2.软件品质因素:软件工程的好坏与软件的品质因素是绝对关联的.请在开发过程中深刻的理解这一点. 3.数据结构与算法:深刻理解像数组,列表,栈,树,图,集合等这样的基本数据结构 ,并在软件开发过程的关键部分使用好的算法.这样整个软件逻辑就会很清晰了. 4.Big-O符号来标记算法复杂度:在开发过程中,请务必使用 Big-O 符号来比较两个

CEO应向软件工程师学习的7个技能

软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学习呢? 1.懒惰 优秀的工程师(不只是软件工程师)是懒惰的:他们喜欢自动化重复性的工作,不愿意做任何不必要的工作.会议和文书工作通常都属于这一类.通过避免不必要的工作,软件工程师可以更高效,并且有更多的时间去做更多有用的工作.CEO也应该力求高效率的偷懒.删除不必要的活动,把精力和时间放到提升价值的

转载:CEO应向软件工程师学习的7个技能

软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学习呢? 懒惰 优秀的工程师(不只是软件工程师)是懒惰的:他们喜欢自动化重复性的工作,不愿意做任何不必要的工作.会议和文书工作通常都属于这一类.通过避免不必要的工作,软件工程师可以更高效,并且有更多的时间去做更多有用的工作. CEO也应该力求高效率的偷懒.删除不必要的活动,把精力和时间放到提升价值的任

软件工程师的成长

软件工程师不仅仅是坐在电脑前打打代码的职业,更多的是理解和协调一个大软件工程的工作. 软件工程包括了考法.运营.维护软件的过程中的很多技术.做法.习惯和思想.软件开发流程不光值团队的流程,还包括个人开发流程,因为软件团队是由个人组成的.首先,一个软件工程师怎样.通过什么方法来衡量自己的能力和价值呢?对于初级软件工程师,这本书中介绍了几种成长:1.积累软件开发相关的知识,提升技术技能:2.积累问题领域的知识和经验:3.对通用的软件设计思想和软件工程思想的理解:4.提升职业技能:5.实际成果.从这5