计算器的方式有多少种?

今天一个同事问了我个问题,问我要实现一个计算器的方式有多少种?突然感到有种想笑的冲动,何故问这样的问题呢?他说C#是种非常美妙的语言,设计的又非常完美,我想知道这样的语言那把这个简单的问题如何的实现!我大致想了想也确实如此。在此想和大家分享一下计算器的实现心得!

要实现这样一个功能实在是太容易了,就看你怎样的想去实现它了,本人分析了以下八种供大家参考:

001.计算器的面向过程版本?

002.计算器的面向对象版本?

003.计算器的工厂模式版本?

004.计算器的多态抽象方法版本?

005.计算器的多态实现版本?

006.计算器的接口工厂模式版本?

007.计算器的抽象工厂模式版本?

008.计算器的多态接口版本?

首先看在什么样的情况下,再根据不同的方法去实现!

001.计算器的面向过程版本!

static string opter;

static void Main(string[] args)

{

double num1 = InputHelper();

double num2 = InputHelper();

double res = Results(num1, num2);

Console.WriteLine("运算结果:{0}{1}{2}={3}",num1,opter,num2,res);

Console.ReadKey();

}

//操作数的输入方法

public static double InputHelper()

{

double result = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (double.TryParse(numStr, out result))

{

break;

}

else

{

Console.Write("输入有误:");

}

}

return result;

}

//运算符的输入

public static double Results(double n1,double n2)

{

bool flag = true;

double res = 0;

while (flag)

{

Console.WriteLine("请输入运算符:");

opter = Console.ReadLine();

switch (opter)

{

case "+": res = n1 + n2; flag = false; break;

case "-": res = n1 - n2; flag = false; break;

case "*": res = n1 * n2; flag = false; break;

case "/": res = n1 / n2; flag = false; break;

default: Console.Write("操作符输入错误!");

break;

}

}

return res;

}

002.计算器的面向对象版本!

class Program

{

static void Main(string[] args)

{

double num1;

double num2;

//找对象

Calculator c = new Calculator();

//调用方法输入

num1 = c.Inputer();

num2 = c.Inputer();

//调用计算方法,得到结果

double res = c.Results(num1, num2);

//输出

Console.WriteLine("{0}{1}{2}={3}",num1,c.opter,num2,res);

Console.ReadKey();

}

}

//创建对象

class Calculator

{

public string opter;

//输入操作数方法

public double Inputer()

{

double n1 = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (double.TryParse(numStr, out n1))

{

break;

}

else

{

Console.Write("输入有误:");

}

}

return n1;

}

//根据操作符做计算

public double Results(double n1,double n2)

{

double res = 0;

bool flag = true;

while (flag)

{

Console.WriteLine("请输入操作符:");

opter = Console.ReadLine();

switch (opter)

{

case "+": res = n1 + n2; flag = false; break;

case "-": res = n1 - n2; flag = false; break;

case "*": res = n1 * n2; flag = false; break;

case "/": res = n1 / n2; flag = false; break;

default: Console.Write("输入操作符有误!");

break;

}

}

return res;

}

}

003.计算器的工厂模式版本!

class Program

{

static void Main(string[] args)

{

//数据的初始化

double num1 = InputNums();

double num2 = InputNums();

Console.WriteLine("请输入操作符!");

string opter = Console.ReadLine();

//调用工厂模式

Calculator c = Factory.GetOperational(opter,num1,num2);

double res = c.CalculationResult();

Console.WriteLine(res);

Console.ReadKey();

}

//输入数据方法

public static double InputNums()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数");

string numStr = Console.ReadLine();

if (double.TryParse(numStr, out nums))

{

break;

}

else

{

Console.Write("输入有误!");

}

}

return nums;

}

}

//工厂模式

class Factory

{

public static Calculator GetOperational(string operational,double n1,double n2)

{

switch (operational)

{

case "+": return new Addition(n1,n2);

case "-": return new Subtraction(n1, n2);

case "*": return new Multiplication(n1, n2);

case "/": return new Division(n1, n2);

default: return new Calculator(n1, n2);

}

}

}

//父类

class Calculator

{

double num1;

public double Num1

{

get { return num1; }

set { num1 = value; }

}

double num2;

public double Num2

{

get { return num2; }

set { num2 = value; }

}

public Calculator(double num1, double num2)

{

this.num1 = num1;

this.num2 = num2;

}

public virtual double CalculationResult()

{

return 0;

}

}

//子类的加(Addition)、减(Subtraction)、乘(Multiplication)、除(Division)

class Addition:Calculator

{

public Addition(double n1, double n2)

: base(n1, n2)

{ }

public override double CalculationResult()

{

return Num1 + Num2;

}

}

class Subtraction:Calculator

{

public Subtraction(double n1, double n2)

: base(n1, n2)

{ }

public override double CalculationResult()

{

return Num1 - Num2;

}

}

class Multiplication:Calculator

{

public Multiplication(double n1, double n2)

: base(n1, n2)

{ }

public override double CalculationResult()

{

return Num1 * Num2;

}

}

class Division:Calculator

{

public Division(double n1, double n2):base(n1,n2)

{

}

public override double CalculationResult()

{

return Num1 / Num2;

}

}

004.计算器的多态抽象方法版本!

class Program

{

static void Main(string[] args)

{

try

{

//新建找对象

Calculator c = null;

//调用输入的方法

double num1 = Inputer();

double num2 = Inputer();

Console.WriteLine("请输入操作符:");

string oper = Console.ReadLine();

//判断操作符

switch (oper)

{

case "+": c = new Addition(); break;

case "-": c = new Subtraction(); break;

case "*": c = new Multiplication(); break;

case "/": c = new Division(); break;//为了避免输入操作符的错误采用try{}catch{}

}

if (c == null)

{

Console.WriteLine("操作符输入有误!");

}

else

{

Console.WriteLine(c.GetResults(num1, num2));

}

}

catch(Exception e)

{

Console.WriteLine(e.Message);

}

Console.ReadKey();

}

public static double Inputer()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (double.TryParse(numStr, out nums))

{

break;

}

else

{

Console.Write("输入的操作数有误:");

}

}

return nums;

}

}

//抽象方法

public abstract class Calculator

{

public abstract double GetResults(double n1,double n2);

}

//子类的实现

class Addition:Calculator

{

public override double GetResults(double n1, double n2)

{

return n1 + n2;

}

}

class Subtraction:Calculator

{

public override double GetResults(double n1, double n2)

{

return n1 - n2;

}

}

class Multiplication:Calculator

{

public override double GetResults(double n1, double n2)

{

return n1 * n2;

}

}

class Division:Calculator

{

public override double GetResults(double n1, double n2)

{

return n1 / n2;

}

}

005.计算器的多态实现版本!

class Program

{

static void Main(string[] args)

{

try

{

//多态的实现新建父类对象

Calculator c = null;

double num1 = Inputer();

double num2 = Inputer();

Console.WriteLine("请输入运算符:");

string oper = Console.ReadLine();

switch (oper)

{

case "+": c = new Addition(num1, num2); break;

case "-": c = new Subtraction(num1, num2); break;

case "*": c = new Multiplication(num1, num2); break;

case "/": c = new Division(num1, num2); break;

}

if (c != null)

{

double res = c.GetResults();

Console.WriteLine(res);

}

else

{

Console.WriteLine("操作符有误!");

}

}

catch

{

Console.WriteLine("操作符输入有误,请按任意键接受!");

}

Console.ReadKey();

}

public static double Inputer()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (double.TryParse(numStr, out nums))

{

break;

}

else

{

Console.Write("输入有误:");

}

}

return nums;

}

}

//创建父类对象

class Calculator

{

double num1;

public double Num1

{

get { return num1; }

set { num1 = value; }

}

double num2;

public double Num2

{

get { return num2; }

set { num2 = value; }

}

public Calculator(double n1, double n2)

{

this.num1 = n1;

this.num2 = n2;

}

public virtual double GetResults()

{

return 0;

}

}

//创建子类对象加(Addition)、减(Subtraction)、乘(Multiplication)、除(Division)

class Addition:Calculator

{

public Addition(double n1, double n2)

: base(n1, n2)

{ }

public override double GetResults()

{

return Num1 + Num2;

}

}

class Subtraction:Calculator

{

public Subtraction(double n1, double n2)

: base(n1, n2)

{ }

public override double GetResults()

{

return Num1 - Num2;

}

}

class Multiplication:Calculator

{

public Multiplication(double n1, double n2)

: base(n1, n2)

{ }

public override double GetResults()

{

return Num1 * Num2;

}

}

class Division:Calculator

{

public Division(double n1, double n2)

: base(n1, n2)

{ }

public override double GetResults()

{

return Num1 / Num2;

}

}

006.计算器的接口工厂模式版本!

class Program

{

static void Main(string[] args)

{

//计算器的接口工厂模式版本

//找对象

ICalculatorable c = null;

double num1 = Inputer();

double num2 = Inputer();

Console.WriteLine("请输入操作符:");

string oper = Console.ReadLine();

c = FactoryCalculator.InitialCalculatorResult(oper, num1, num2);

double result = c.ICalculating();

Console.WriteLine(result);

Console.ReadKey();

}

public static double Inputer()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (!double.TryParse(numStr, out nums))

{

Console.Write("输入有误!");

}

else

{

break;

}

}

return nums;

}

}

//接口版的工厂模式

class FactoryCalculator

{

public static Calculator InitialCalculatorResult(string oper, double n1, double n2)

{

switch (oper)

{

case "+": return new Addition(n1, n2);

case "-": return new Subtraction(n1, n2);

case "*": return new Multiplication(n1, n2);

case "/": return new Division(n1, n2);

default: throw new Exception("操作符输入有误!");

}

}

}

//接口

interface ICalculatorable

{

double ICalculating();

}

//抽象类

abstract class Calculator:ICalculatorable

{

double num1;

double num2;

public double Num2

{

get { return num2; }

set { num2 = value; }

}

public double Num1

{

get { return num1; }

set { num1 = value; }

}

public Calculator(double n1, double n2)

{

this.num1 = n1;

this.num2 = n2;

}

public abstract double ICalculating();

}

//子类的实现

class Addition:Calculator

{

public Addition(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 + Num2;

}

}

class Subtraction:Calculator

{

public Subtraction(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 - Num2;

}

}

class Multiplication:Calculator

{

public Multiplication(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 * Num2;

}

}

class Division:Calculator

{

public Division(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 / Num2;

}

}

007.计算器的抽象工厂模式版本!

class Program

{

static void Main(string[] args)

{

//计算器的抽象工厂模式版本

//找对象

Calculator c = null;

double num1 = Inputer();

double num2 = Inputer();

Console.WriteLine("请输入操作符:");

string oper = Console.ReadLine();

c = FactoryCalculator.InitialCalculator(oper, num1, num2);

double result = c.InitialCalculating();

Console.WriteLine(result);

Console.ReadKey();

}

public static double Inputer()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (!double.TryParse(numStr, out nums))

{

Console.Write("输入有误:");

}

else

{

break;

}

}

return nums;

}

}

//工厂

class FactoryCalculator

{

public static Calculator InitialCalculator(string oper,double n1,double n2)

{

switch (oper)

{

case "+": return new Addition(n1, n2);

case "-": return new Subtraction(n1, n2);

case "*": return new Multiplication(n1, n2);

case "/": return new Division(n1, n2);

default: throw new Exception("系统找不到指定运算符...");

}

}

}

//抽象类的工厂模式与多态工厂模式几乎一样

abstract class Calculator

{

double num1;

double num2;

public double Num2

{

get { return num2; }

set { num2 = value; }

}

public double Num1

{

get { return num1; }

set { num1 = value; }

}

public Calculator(double n1, double n2)

{

this.num1 = n1;

this.num2 = n2;

}

public abstract double InitialCalculating();

}

//子类的实现

class Addition:Calculator

{

public Addition(double n1, double n2)

: base(n1, n2)

{ }

public override double InitialCalculating()

{

return Num1 + Num2;

}

}

class Subtraction:Calculator

{

public Subtraction(double n1, double n2)

: base(n1, n2)

{ }

public override double InitialCalculating()

{

return Num1 - Num2;

}

}

class Multiplication:Calculator

{

public Multiplication(double n1, double n2)

: base(n1, n2)

{ }

public override double InitialCalculating()

{

return Num1 * Num2;

}

}

class Division:Calculator

{

public Division(double n1, double n2)

: base(n1, n2)

{ }

public override double InitialCalculating()

{

return Num1 / Num2;

}

}

008.计算器的多态接口版本!

class Program

{

static void Main(string[] args)

{

try

{

//创建对象

ICalculatorable c = null;

double num1 = Inputer();

double num2 = Inputer();

Console.WriteLine("请输入操作符:");

string oper = Console.ReadLine();

switch (oper)

{

case "+": c = new Addition(num1, num2); break;

case "-": c = new Subtraction(num1, num2); break;

case "*": c = new Multiplication(num1, num2); break;

case "/": c = new Division(num1, num2); break;

}

if (c != null)

{

double res = c.ICalculating();

Console.WriteLine(res);

}

else

{

Console.WriteLine("操作符输入有误!");

}

}

catch

{

Console.WriteLine("输入有误!");

}

Console.ReadKey();

}

public static double Inputer()

{

double nums = 0;

while (true)

{

Console.WriteLine("请输入操作数:");

string numStr = Console.ReadLine();

if (!double.TryParse(numStr, out nums))

{

Console.WriteLine("操作数输入有误!");

}

else

{

break;

}

}

return nums;

}

}

//接口的使用

interface ICalculatorable

{

double ICalculating();

}

//抽象类的使用

abstract class Calculator:ICalculatorable

{

double num1;

public double Num1

{

get { return num1; }

set { num1 = value; }

}

double num2;

public double Num2

{

get { return num2; }

set { num2 = value; }

}

public Calculator(double n1, double n2)

{

this.num1 = n1;

this.num2 = n2;

}

public abstract double ICalculating();

}

//子类的实现

class Addition:Calculator

{

public Addition(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 + Num2;

}

}

class Subtraction:Calculator

{

public Subtraction(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 - Num2;

}

}

class Multiplication:Calculator

{

public Multiplication(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 * Num2;

}

}

class Division:Calculator

{

public Division(double n1, double n2)

: base(n1, n2)

{ }

public override double ICalculating()

{

return Num1 / Num2;

}

}

希望能帮助到各位!

计算器的方式有多少种?,布布扣,bubuko.com

时间: 2024-08-01 22:45:42

计算器的方式有多少种?的相关文章

java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

此题参考与其他人思路, 2个解题方式. 1. 1 /** 2 * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 3 * 状态树方式解 4 * 用状态生成树的方式来做的,先把12个人按从低到高一次编号, 5 * 从(1 ; 2)出发,加入3和4的时候生成(1,3 ; 2,4)和(1,2 ; 3,4), 6 * 然后加入5和6,分别从前面的两个状态出发,可以生成5种状态,就是说6个人时有5种排列 7 * @author

C++12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

#include <iostream> #define DefaultSize 9 //问题描述: //12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? using namespace std; class Grial { public: Grial(int sz=DefaultSize) { visted = new bool [sz]; data = new int [sz]; size = sz; for(int i=1;i<

软件开发有多少种方式

软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想.软件开发是为了什么,是为了市场.赢得了市场,就是这个软件最大的成功.当然一个软件能够成功.就需要在工作中一视同仁,不能有高低贵贱之分.听取小组中每位成员的建议.并且每位程序员也能有很强的工作能力,所以我们必须要在平时的学习在加强对工作能力的训练.为未来的就业打好基础!

【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

46.搜狐(运算):四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) 跟12个人排高矮的题目差不多. 用 0 表示 “(”,用 1 表示“)” 则需要数字二进制最低8位有 4个1和 4个0,且从低位到高位对1 和 0 计数时,0 出现的次数不能超过 1 出现的次数. /* 46.搜狐(运算): 四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) */ #include <stdio.h> int c_bits(int n) { int re

递归计算战士打靶S次打了N环一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

Java逐行读取文件有多少种方法?

如果每个线程使用的变量都是其它线程不会读取或修改的,那么就不存在一致性问题.同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题.否则,将会出现不一致性问题.为了解决数据不一致问题,必须引入某些机制使线程间同步. 当变量修改时间多于一个存储器访问周期,同时读.写操作又相互交替时,潜在的不一致性就会出现.如下图所示: 此时,线程B读取到的数据是错误的.使用一把锁能够解决上述问题: 下面介绍线程的三种同步机制: 1.互斥量pthread_mutex_t 互斥量就是锁,对某段临界区进行加锁

R485集线器定协议有多少种能否抗干扰?

在各种现场中,485总线应用的非常的广泛,但是485总线比较容易出现故障,现在将485总线容易出现故障的情况并且可以排除这些故障的方法罗列如下: 1.由于485信号使用的是一对非平衡差分信号,意味485网络中的每一个设备都必须通过一个信号回路连接到地,以减少数据线上的噪音,所以数据线最好由双绞线组成,并且在外面加上屏蔽层作为地线,将485网络中485设备连接起来,并且在一个点可靠接地. 2.在工业现场当中,现场情况非常复杂,各个节点之间存在很高的共模电压,485接口使用的是差分传输方式,有抗共模

递归解决战士打靶N坏一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

聚合支付有多少种类别?

聚合支付实现商户主流支付方式一并接入.合并到账,真正适应市客户对支付的需求,在未来的支付市场上意义深刻.那么,聚合支付到底有多少种类别呢?小编根据企业的技术实现和资金处理方式,将其归纳为四大类.让我们看看是哪4类吧. 一."二清"类聚合支付 "二清"类平台主要有两种,一是套现,二是打擦边球赚取汇率差额.由于"二清"支付终端的申请.发放.审核环节一般不会按照监管要求认真执行相关管理规定,导致大量个人或小商户借助其进行信用卡套现业务.国内很多游戏.视