返回信息流上回考了一次,没想到最近商务部又考了这道题:minCalc.
写一个微型的计算器,像ms的Calculator一样,每按一键,都显示在屏幕上.
键有+ -, 1234567890,=,F及CE.
f是一目运算符,即立刻求出 fib(n)
CE是复位
-就代表要减一个数
具体是填充函数:
void onKeyPress(char key, char display[4])
{
}
key是输入的一个键
display 是显的输出,第一位(display[0])可以是' ',表示结果为正,'E'表示溢出,'-'表示结果是负.连下来三位表示结果的百十个位.
这题难在分析吧....
这是一条镜像帖。来源:北邮人论坛 / soft-design / #34121同步于 2009/4/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[分享]MS机考题
Jarod
2009/4/30镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
本着think less, do more的原则,硬着头皮做一次。
结果,费了快两个小时。
用CalculateState类表示状态,状态下接受“数字”和“运算”两种输入,发生跳转。
注:代码脑残,慎看。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SimpleCalc
{
public partial class CalculatorForm : Form
{
class NumButton : Button
{
public int num;
}
class OpButton : Button
{
public OperatorFunc opFunc;
}
private delegate int OperatorFunc(int a, int b);
//states
private class CalculatorState
{
public virtual void onNumber(CalculatorForm form, int num) { }
public virtual void onOperation(CalculatorForm form, OperatorFunc opFunc) { }
}
private class Resulting : CalculatorState
{
public static Resulting instance = new Resulting();
public override void onNumber(CalculatorForm form, int num)
{
form._oldResult = form.result;
form.result = num;
form.state = Inputing.instance;
}
public override void onOperation(CalculatorForm form, OperatorFunc opFunc)
{
form.opFunc = opFunc;
}
}
private class Inputing : CalculatorState
{
public static Inputing instance = new Inputing();
public override void onNumber(CalculatorForm form, int num)
{
form.result = form.result*10 + num;
}
public override void onOperation(CalculatorForm form, OperatorFunc opFunc)
{
form.result = form.opFunc(form._oldResult, form.result);
form.opFunc = opFunc;
form.state = Resulting.instance;
}
}
private int _oldResult = 0;
private int _result = 0;
private CalculatorState state = (CalculatorState)Resulting.instance;
private int result
{
get
{
return _result;
}
set
{
_result = value;
tResult.Text = Convert.ToString(value);
}
}
// Operators
private static int add(int a, int b)
{
return a + b;
}
private static int sub(int a, int b)
{
return a - b;
}
private static int equals(int a, int b)
{
return b;
}
private static int fib(int a, int b)
{
int x=0,y=1;
for (int i = 0; i < b; i++)
{
int tmp=x; x=y; y = tmp + y;
}
return x;
}
private OperatorFunc opFunc = equals;
private NumButton[] numberButtons;
private OpButton[] opButtons;
public CalculatorForm()
{
InitializeComponent();
InitializeNumbers();
result = 0;
}
private void InitializeNumbers()
{
numberButtons = new NumButton[10];
for (int i = 0; i < 10; i++)
{
NumButton btn = new NumButton();
btn.Text = Convert.ToString(i);
btn.TabIndex = i;
btn.num = i;
btn.Click += new EventHandler(numButtonClicked);
numberButtons[i] = btn;
}
for (int i = 1; i <= 9; i++)
{
Button btn = numberButtons[i];
numberPanel.Controls.Add(btn);
}
numberPanel.Controls.Add(numberButtons[0]);
{
OpButton opBtn;
opBtn = new OpButton();
opBtn.Text = "+";
opBtn.opFunc = add;
opBtn.Click += new EventHandler(opButtonClicked);
operatorPanel.Controls.Add(opBtn);
opBtn = new OpButton();
opBtn.Text = "-";
opBtn.opFunc = sub;
opBtn.Click += new EventHandler(opButtonClicked);
operatorPanel.Controls.Add(opBtn);
opBtn = new OpButton();
opBtn.Text = "f";
opBtn.opFunc = fib;
opBtn.Click += new EventHandler(opButtonClicked);
operatorPanel.Controls.Add(opBtn);
opBtn = new OpButton();
opBtn.Text = "=";
opBtn.opFunc = equals;
opBtn.Click += new EventHandler(opButtonClicked);
operatorPanel.Controls.Add(opBtn);
}
}
private void numButtonClicked(Object sender, EventArgs e)
{
NumButton btn = (NumButton)sender;
state.onNumber(this, btn.num);
}
private void opButtonClicked(Object sender, EventArgs e)
{
OpButton btn = (OpButton)sender;
state.onOperation(this, btn.opFunc);
}
private void bCE_Click(object sender, EventArgs e)
{
result = 0;
}
}
}
【 在 Jarod 的大作中提到: 】
: 上回考了一次,没想到最近商务部又考了这道题:minCalc.
: 写一个微型的计算器,像ms的Calculator一样,每按一键,都显示在屏幕上.
: 键有+ -, 1234567890,=,F及CE.
: ...................
赞
【 在 wks (cloverprince) 的大作中提到: 】
: 本着think less, do more的原则,硬着头皮做一次。
: 结果,费了快两个小时。
: 用CalculateState类表示状态,状态下接受“数字”和“运算”两种输入,发生跳转。
: ...................
z@n~~~
机考时间也是2小时。。你通过了!
【 在 wks 的大作中提到: 】
: 本着think less, do more的原则,硬着头皮做一次。
: 结果,费了快两个小时。
: 用CalculateState类表示状态,状态下接受“数字”和“运算”两种输入,发生跳转。
: ...................
今天仔细看了看,原来状态机还可以用OO来做啊~~~pf
PS:状态机记录的状态少了, "1 + 2 = “ 这时显示3,再按"=",显示5...
"1+2 F" 与 "1+2=F" 以及"1+2FF" 这些没考虑到吧。。。
嗯。少了一个状态,不能实现1+2==显示5的这种操作。我的等号也按照普通的运算符来处理的。
【 在 Jarod 的大作中提到: 】
: 今天仔细看了看,原来状态机还可以用OO来做啊~~~pf
: PS:状态机记录的状态少了, "1 + 2 = “ 这时显示3,再按"=",显示5...
: "1+2 F" 与 "1+2=F" 以及"1+2FF" 这些没考虑到吧。。。