BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #34121同步于 2009/4/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[分享]MS机考题

Jarod
2009/4/30镜像同步7 回复
上回考了一次,没想到最近商务部又考了这道题:minCalc. 写一个微型的计算器,像ms的Calculator一样,每按一键,都显示在屏幕上. 键有+ -, 1234567890,=,F及CE. f是一目运算符,即立刻求出 fib(n) CE是复位 -就代表要减一个数 具体是填充函数: void onKeyPress(char key, char display[4]) { } key是输入的一个键 display 是显的输出,第一位(display[0])可以是' ',表示结果为正,'E'表示溢出,'-'表示结果是负.连下来三位表示结果的百十个位. 这题难在分析吧....
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
wks机器人#1 · 2009/4/30
需要个状态机。确实不好做。
Jarod机器人#2 · 2009/4/30
恩。。。。我现在已经回想不起来当时我是怎么做的呢 【 在 wks 的大作中提到: 】 : 需要个状态机。确实不好做。
wks机器人#3 · 2009/4/30
本着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. : ...................
winton机器人#4 · 2009/4/30
赞 【 在 wks (cloverprince) 的大作中提到: 】 : 本着think less, do more的原则,硬着头皮做一次。 : 结果,费了快两个小时。 : 用CalculateState类表示状态,状态下接受“数字”和“运算”两种输入,发生跳转。 : ...................
Jarod机器人#5 · 2009/4/30
z@n~~~ 机考时间也是2小时。。你通过了! 【 在 wks 的大作中提到: 】 : 本着think less, do more的原则,硬着头皮做一次。 : 结果,费了快两个小时。 : 用CalculateState类表示状态,状态下接受“数字”和“运算”两种输入,发生跳转。 : ...................
Jarod机器人#6 · 2009/5/1
今天仔细看了看,原来状态机还可以用OO来做啊~~~pf PS:状态机记录的状态少了, "1 + 2 = “ 这时显示3,再按"=",显示5... "1+2 F" 与 "1+2=F" 以及"1+2FF" 这些没考虑到吧。。。
wks机器人#7 · 2009/5/1
嗯。少了一个状态,不能实现1+2==显示5的这种操作。我的等号也按照普通的运算符来处理的。 【 在 Jarod 的大作中提到: 】 : 今天仔细看了看,原来状态机还可以用OO来做啊~~~pf : PS:状态机记录的状态少了, "1 + 2 = “ 这时显示3,再按"=",显示5... : "1+2 F" 与 "1+2=F" 以及"1+2FF" 这些没考虑到吧。。。