简单计算器的开发.docx
- 文档编号:6306954
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:14
- 大小:99.21KB
简单计算器的开发.docx
《简单计算器的开发.docx》由会员分享,可在线阅读,更多相关《简单计算器的开发.docx(14页珍藏版)》请在冰豆网上搜索。
简单计算器的开发
简单计算器的开发
假设有这么一个问题:
请用C++、Java、C#任意一种面向对象程序设计语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
你会怎么写?
下面以C#为例说明。
一、看下面一个程序:
classProgram
{
staticvoidMain(string[]args)
{
Console.Write("请输入数字A:
");
stringA=Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):
");
stringB=Console.ReadLine();
Console.Write("请输入数字B:
");
stringC=Console.ReadLine();
stringD="";
if(B=="+")
D=Convert.ToString(Convert.ToDouble(A)+Convert.ToDouble(C));
if(B=="-")
D=Convert.ToString(Convert.ToDouble(A)-Convert.ToDouble(C));
if(B=="*")
D=Convert.ToString(Convert.ToDouble(A)*Convert.ToDouble(C));
if(O=="/")
D=Convert.ToString(Convert.ToDouble(A)/Convert.ToDouble(C));
Console.WriteLine("结果是:
"+D);
}
}
二、代码是否规范、重构
classProgram
{
staticvoidMain(string[]args)
{
try
{
Console.Write("请输入数字A:
");
stringstrNumberA=Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):
");
stringstrOperate=Console.ReadLine();
Console.Write("请输入数字B:
");
stringstrNumberB=Console.ReadLine();
stringstrResult="";
switch(strOperate)
{
case"+":
strResult=Convert.ToString
(Convert.ToDouble(strNumberA)+Convert.ToDouble(strNumberB));
break;
case"-":
strResult=Convert.ToString
(Convert.ToDouble(strNumberA)-Convert.ToDouble(strNumberB));
break;
case"*":
strResult=Convert.ToString
(Convert.ToDouble(strNumberA)*Convert.ToDouble(strNumberB));
break;
case"/":
if(strNumberB!
="0")
strResult=Convert.ToString
(Convert.ToDouble(strNumberA)/Convert.ToDouble(strNumberB));
else
strResult="除数不能为0";
break;
}
三、复制、重用
现在要求你再写一个windows的计算器,你现在的代码能不能复用?
应该考虑:
这段代码,有哪些是和控制台无关的,而只是和计算器有关的?
”
四、封装
classProgram
{
staticvoidMain(string[]args)
{
try
{
Console.Write("请输入数字A:
");
stringstrNumberA=Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):
");
stringstrOperate=Console.ReadLine();
Console.Write("请输入数字B:
");
stringstrNumberB=Console.ReadLine();
stringstrResult="";
strResult=Convert.ToString(
Operation.GetResult(Convert.ToDouble(strNumberA),
Convert.ToDouble(strNumberB),strOperate));
Console.WriteLine("结果是:
"+strResult);
Console.ReadLine();
}
catch(Exceptionex)
{
Console.WriteLine("您的输入有错:
"+ex.Message);
}
}
}
publicclassOperation
{
publicstaticdoubleGetResult(doublenumberA,doublenumberB,stringoperate)
{
doubleresult=0d;
switch(operate)
{
case"+":
result=numberA+numberB;
break;
case"-":
result=numberA-numberB;
break;
case"*":
result=numberA*numberB;
break;
case"/":
result=numberA/numberB;
break;
}
returnresult;
}
}
五、体现面向对象思想的完整程序
classOperation
{
privatedouble_numberA=0;
privatedouble_numberB=0;
///
///数字A
///
publicdoubleNumberA
{
get{return_numberA;}
set{_numberA=value;}
}
///
///数字B
///
publicdoubleNumberB
{
get{return_numberB;}
set{_numberB=value;}
}
///
///得到运算结果
///
///
publicvirtualdoubleGetResult()
{
doubleresult=0;
returnresult;
}
}
///
///加法类
///
classOperationAdd:
Operation
{
publicoverridedoubleGetResult()
{
doubleresult=0;
result=NumberA+NumberB;
returnresult;
}
}
///
///减法类
///
classOperationSub:
Operation
{
publicoverridedoubleGetResult()
{
doubleresult=0;
result=NumberA-NumberB;
returnresult;
}
}
///
///乘法类
///
classOperationMul:
Operation
{
publicoverridedoubleGetResult()
{
doubleresult=0;
result=NumberA*NumberB;
returnresult;
}
}
///
///除法类
///
classOperationDiv:
Operation
{
publicoverridedoubleGetResult()
{
doubleresult=0;
if(NumberB==0)
thrownewException("除数不能为0。
");
result=NumberA/NumberB;
returnresult;
}
}
classOperationFactory
{
publicstaticOperationcreateOperate(stringoperate)
{
Operationoper=null;
switch(operate)
{
case"+":
{
oper=newOperationAdd();
break;
}
case"-":
{
oper=newOperationSub();
break;
}
case"*":
{
oper=newOperationMul();
break;
}
case"/":
{
oper=newOperationDiv();
break;
}
}
returnoper;
}
}
依据前面内容写出JAVA计算器
由uml图可以看出Client依赖OprationFactory类,而OprationFactory类调用的是Opration接口,
当我们想给计算器增加功能时,修改客户端,增加相应的子类和在OprationFactory类的switch语句中增加相应的case语句即可,
不会影响其他的子类。
使用设计模式主要是提高代码的复用率,通过解耦合,使OprationFactory和Opration类能以后复用。
客户端界面(Java代码 )
package simpleFactory.operation002;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
*
* @author haiyusimon 通过继承和多态来实现各种运算的松耦合, 实现通过简单工厂来产生实例
*
*/
public class Client extends Frame {
private static final long serialVersionUID = -4397773431585170565L;
TextField var_a = new TextField(10);
TextField var_b = new TextField(10);
TextField var_r = new TextField(20);
Button jia = new Button("加");
Button jian = new Button("减");
Button cheng = new Button("乘");
Button chu = new Button("除");
public static void main(String args[]) {
new Client().launchFrame("计算器");
}
/**
* @param s
*/
public void launchFrame(String s) {
setTitle(s);
setBounds(10, 10, 200, 300);
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
add(new Label("第一个数:
"));
add(var_a);
add(new Label("第二个数:
"));
add(var_b);
add(new Label("运算?
"));
add(jia);
add(jian);
add(cheng);
add(chu);
add(new Label("结果:
"));
add(var_r);
pack();
setVisible(true);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
jia.addActionListener(new ClientMonitor('+'));
jian.addActionListener(new ClientMonitor('-'));
cheng.addActionListener(new ClientMonitor('*'));
chu.addActionListener(new ClientMonitor('/'));
}
private class ClientMonitor implements ActionListener {
char coperator = '+'; // 用来判断是哪个按钮
public ClientMonitor(char operator) {
this.coperator = operator;
}
public void actionPerformed(ActionEvent e) {
double var_aa = Double.parseDouble(var_a.getText());
double var_ab = Double.parseDouble(var_b.getText());
double r = OperationFactory.createOperation(coperator, var_aa, var_ab);
var_r.setText("" + r);
}
}
}
工厂类:
package simpleFactory;
/**
*
* @author haiyusimon
*将由工厂类产生相应的运算类实例
*/
public class OperationFactory {
public static double createOperation(char operator,double var_aa,double var_ab) {
double r = 0.0;
Operation operation = new OprationAdd(); //使用接口,把类隐藏在接口下
switch (operator) {
case '+':
operation = new OprationAdd();
break; //最后必需有break;语句,不然将逐一运行各种情况
case '-':
operation = new OprationSub();
break;
case '*':
operation = new OprationMul();
break;
case '/':
operation = new OprationDiv();
break;
}
r = operation.getResult(var_aa, var_ab);
return r;
}
}
运算接口:
package simpleFactory;
public interface Operation {
public double getResult(double a,double b);
}
加法运算(继承运算接口):
package simpleFactory;
public class OprationAdd implements Operation {
@Override
public double getResult(double a, double b) {
return a + b;
}
}
减法运算):
package simpleFactory;
public class OprationSub implements Operation {
@Override
public double getResult(double a, double b) {
return a - b;
}
}
乘法运算(继承运算接口):
package simpleFactory;
public class OprationMul implements Operation {
@Override
public double getResult(double a, double b) {
return a * b;
}
}
除法运算:
package simpleFactory;
public class OprationDiv implements Operation {
@Override
public double getResult(double a, double b) {
return a / b;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 计算器 开发