C#编写简单计算器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#编写简单计算器相关的知识,希望对你有一定的参考价值。

简单计算器:完成简单的计算器,可以进行(+,-,*,/,^(乘方), sqrt(平方根))的算术运算。+,-,*,/,^(乘方)是二元运算(需要2个操作数),sqrt为一元运算。对于一元运算:输入数据后点击运算符sqrt即计算数的平方根。对于二元运算:通过点击数字按钮进行数字的输入,在输入一个数据后,点击操作符号按钮(如+,-,*,/)后,再输入一个数据将进行相应的运算

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Calc

    class Calc

    

        private string expression;

        public Calc()

        

            expression = "0";

        

        public Calc(string exp)

        

            expression = exp;

        

        public string Expression

        

            set

            

                Expression = value;

            

            get

            

                return (expression);

            

        

        /// <summary>

        /// 四则运算

        /// </summary>

        /// <returns>返回结果</returns>

        public double EvaluateExpression()

        

            try

            

                string myExp = expression + "=";             //表达式。。

                Stack<char> optr = new Stack<char>(myExp.Length);    //存放操作符栈。。

                Stack<double> opnd = new Stack<double>(myExp.Length);      //存放操作数栈。。

                optr.Push('=');

                int index = 0;                                //字符索引。。

                char c = myExp.ToCharArray()[index++];                   //读取每一个字符。。

                bool isFloat = false;                      //是否为小数。。

                bool isNum = false;                      //是否为数字。。

                int floatBit = 0;                             //小数数位。。

                double num1, num2;

                while ((c != '=') || (optr.Peek() != '='))

                

                    if ((c >= '0') && (c <= '9'))

                    

                        if (isNum)

                        

                            if (isFloat)

                            

                                floatBit++;

                                opnd.Push(opnd.Pop() + ((int)c - 48.0) / Math.Pow(10, floatBit));

                            

                            else

                            

                                opnd.Push(opnd.Pop() * 10 + (int)c - 48);

                            

                        

                        else

                        

                            opnd.Push((int)c - 48);

                            isNum = true;

                        

                        c = myExp.ToCharArray()[index++];

                    

                    else

                    

                        if ((c == '.') && (isNum))

                        

                            isFloat = true;

                            floatBit = 0;

                            c = myExp.ToCharArray()[index++];

                        

                        else

                        

                            isNum = false;

                            isFloat = false;

                            switch (Precede(optr.Peek(), c))

                            

                                case '<':

                                    optr.Push(c);

                                    c = myExp.ToCharArray()[index++];

                                    break;

                                case '=':

                                    optr.Pop();

                                    c = myExp.ToCharArray()[index++];

                                    break;

                                case '>':

                                    num2 = opnd.Pop();

                                    num1 = opnd.Pop();

                                    opnd.Push(Operate(num1, optr.Pop(), num2));

                                    break;

                                default:

                                    break;

                            

                        

                    

                

                return opnd.Pop();

            

            catch(Exception)

            

                throw new Exception("表达式不合法");

            

        

        //判断优先级。。

        private char Precede(char optr1, char optr2)

        

            //定义一个比较结果(用二维数组存下来)。。

            char[,] optrTable = 

            

                 '>', '>', '<', '<', '<', '>', '>' ,

                 '>', '>', '<', '<', '<', '>', '>' ,

                 '>', '>', '>', '>', '<', '>', '>' ,

                 '>', '>', '>', '>', '<', '>', '>' ,

                 '<', '<', '<', '<', '<', '=', '?' ,

                 '>', '>', '>', '>', '?', '>', '>' ,

                 '<', '<', '<', '<', '<', '?', '=' 

            ;

            int x = 0, y = 0;//申明存符号转化后的整数。。

            //定义一个符号数组。。

            char[] optrs =  '+', '-', '*', '/', '(', ')', '=' ;

            for (int i = 0; i < optrs.Length; ++i)

            

                if (optr1 == optrs[i])

                    x = i;

                if (optr2 == optrs[i])

                    y = i;

            

            if (optrTable[x, y] == '?')

            

                throw new Exception("表达式不合法");

            

            else

            

                return optrTable[x, y];

            

        

        //计算两值,得出相应结果。。

        private double Operate(double a, char optr, double b)

        

            double result = default(double);

            switch (optr)

            

                case '+':

                    result = a + b;

                    break;

                case '-':

                    result = a - b;

                    break;

                case '*':

                    result = a * b;

                    break;

                case '/':

                    if (b < Math.Pow(10, 0.000001))

                    

                        throw new Exception("除数为0");

                    

                    result = a / b;

                    break;

                default:

                    break;

            

            return result;

        

    

我写了一个Calc类。。能够进行包括括号在内的简单的四则运算,。。

成员变量expression为算术表达式,string类型。。

方法EvaluateExpression(),计算结果,用double返回。。

使用的时候可以这样。。

Calc myCalc = new Calc(“3+4*5”);

label1.Text = "计算结果为:" + myCalc.Expression;

给个范例:

        private void button1_Click(object sender, EventArgs e)

        

            Calc myCalc = new Calc(textBox1.Text);

            label1.Text = "= " + myCalc.Expression;

            try

            

                label1.Text = "= " + myCalc.EvaluateExpression();

            

            catch(Exception)

            

                label1.Text = "= " + "不合法";

            

        

运行结果如下。。

不知道是否符合您的要求。。

参考技术A using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace jisuan

/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()

//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//


/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )

if( disposing )

if (components != null)

components.Dispose();


base.Dispose( disposing );


#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()

this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.textBox3 = new System.Windows.Forms.TextBox();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(24, 72);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 21);
this.textBox1.TabIndex = 0;
this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(312, 72);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(100, 21);
this.textBox2.TabIndex = 1;
//
// textBox3
//
this.textBox3.Location = new System.Drawing.Point(448, 72);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(88, 21);
this.textBox3.TabIndex = 2;
//
// comboBox1
//
this.comboBox1.Items.AddRange(new object[]
"+",
"-",
"*",
"/");
this.comboBox1.Location = new System.Drawing.Point(152, 72);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(121, 20);
this.comboBox1.TabIndex = 3;
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
//
// button1
//
this.button1.Location = new System.Drawing.Point(64, 184);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(104, 32);
this.button1.TabIndex = 4;
this.button1.Text = "计算";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(216, 192);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 5;
this.button2.Text = "清除";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(376, 192);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(75, 23);
this.button3.TabIndex = 6;
this.button3.Text = "退出";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(656, 366);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.textBox3);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();


#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()

Application.Run(new Form1());

public double jia(double a,double b)

return a+b;

public double jian(double a,double b)

return a-b;

public double cheng(double a,double b)

return a*b;

public double chu(double a,double b)

return a/b;


private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)




private void textBox1_TextChanged(object sender, System.EventArgs e)




private void button1_Click(object sender, System.EventArgs e)

string i=this.comboBox1.SelectedItem.ToString();

switch(i)


case "+":this.textBox3.Text=this.jia(double.Parse(this.textBox1.Text),double.Parse(this.textBox2.Text)).ToString();

break;

case "-":this.textBox3.Text=this.jian(double.Parse(this.textBox1.Text),double.Parse(this.textBox2.Text)).ToString();
break;
case "*":this.textBox3.Text=this.cheng(double.Parse(this.textBox1.Text),double.Parse(this.textBox2.Text)).ToString();
break;
case"/" :this.textBox3.Text=this.chu(double.Parse(this.textBox1.Text),double.Parse(this.textBox2.Text)).ToString();
break;




private void button2_Click(object sender, System.EventArgs e)

this.textBox1.Text=null;
this.textBox2.Text=null;
this.textBox3.Text = null;


private void button3_Click(object sender, EventArgs e)


//this.Hide();
Application.Exit();
//this.Close();



本回答被提问者采纳
参考技术B 这个计算器只能计算加减乘除,很简单的!

namespace jisuanqi

public partial class Form1 : Form

public double num1;//声明变量一
public double num2;//声明变量二
public bool YS = true;//判断是否有运算(即是否按过等号)
public string fh;//声明符号变量
public double result = 0;//结果值赋值变量
public Form1()

InitializeComponent();


private void Form1_Load(object sender, EventArgs e)



//0到9的代码
private void button1_Click(object sender, EventArgs e)

if (YS)//如果有运算,即按过等号之后:textBox1清空!

textBox1.Text = "";
YS = false;


textBox1.Text += "1";


private void button2_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "2";


private void button3_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "3";


private void button4_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "4";


private void button5_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "5";


private void button6_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "6";


private void button7_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "7";


private void button8_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "8";


private void button9_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "9";


private void button11_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;

textBox1.Text += "0";


private void button10_Click(object sender, EventArgs e)


if (YS)

textBox1.Text = "";
YS = false;


textBox1.Text += ".";

//清零
private void button17_Click(object sender, EventArgs e)

textBox1.Text = "";

//符号的代码
private void button13_Click(object sender, EventArgs e)


fh = "+";

double num1 = double.Parse(textBox1.Text); //给变量一赋值
textBox1.Text = "";

//等号代码
private void button18_Click(object sender, EventArgs e)


double num2 = double.Parse(this.textBox1.Text); //给变量二赋值

//判断是何种运算
switch (fh)

case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if (num2 == 0)

MessageBox.Show("0不能做除数");
return;


result = num1 / num2;
break;
default:
break;

textBox1.Text = result.ToString();
YS = true; //按等号之后讲YS赋为true,则表明有运算!


private void button14_Click(object sender, EventArgs e)

fh = "-";

double num1 = double.Parse(textBox1.Text);
this.textBox1.Text = "";


private void button15_Click(object sender, EventArgs e)

fh = "*";
double num1 = double.Parse(textBox1.Text);
this.textBox1.Text = "";


private void button16_Click(object sender, EventArgs e)

fh = "/";
double num1 = double.Parse(textBox1.Text);
this.textBox1.Text = "";



C# 编写WCF简单的服务端与客户端

http://www.wxzzz.com/1860.html

 

Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。

今天带如何一步一步实现WCF服务端与客户端的开发及基础讲解。

 

一、在Visual Studio中创建WCF项目

首先打开Visual Studio(我这里使用的是VS2013),然后创建一个空的解决方案命名为WCFDemo

然后创建下面列出的4个项目并进行关系引用。

  • Contracts:它是一个类库项目,用于定义契约,在项目的引用中添加System.ServiceMode程序集;
  • Services:它是一个类库项目,用于实现契约,所以需要引用我们的Contracts项目;
  • Hosting:一个控制台应用,实现启动WCF服务,该项目须要同时引用我们的Contracts项目和Services项目,并且引用System.ServiceMode程序集;
  • Client:一个控制台应用,也需要引用System.ServiceMode程序集;

创建好后,如图所示:

技术分享

 

二、创建服务契约

首先我们需要在Contracts项目中创建契约(也就是interface接口),这里我的契约指定需要实现2个功能,分别是GetServerTime获取服务器当前时间,GetServerName获取服务器名称。

编写代码的时候需要注意,需要给interface加上ServiceContract标记属性(指示接口或类在WCF应用程序中定义服务协定),每个契约的方法需要加上OperationContract标记属性(指示方法定义一个操作,该操作是WCF应用程序中服务协定的一部分)。最终,如下代码所示:

[ServiceContract]
public interface IGetServerInfo
{
    [OperationContract]
    string GetServerTime();

    [OperationContract]
    string GetServerName();
}

 

三、实现服务契约

刚刚我们已经在Contracts项目中创建好了一个IGetServerInfo的契约,现在我们需要到Services项目中创建一个GetServerInfoService类实现,该类继承IGetServerInfo进行实现即可,我编写了如下代码进行演示,分别实现了获取服务器当前时间、获取服务器的名称(我这里为了演示直接返回"Server Name:wxzzz"字符串给客户端)。

public class GetServerInfoService:IGetServerInfo
{
    public string GetServerTime()
    {
        return DateTime.Now.ToString();
    }

    public string GetServerName()
    {
        return "Server Name:wxzzz";
    }
}

 

四、启动WCF服务

WCF服务可以自己创建程序监听服务,也可以寄宿于IIS提供服务。咱们这里先使用自己的程序进行WCF服务监听。

WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。

  • 地址(Address):地址决定了服务的位置;
  • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
  • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。

基于这些技术基础知识,下面是我在项目Hosting中编写的WCF服务代码块。

 static void Main(string[] args)
 {
     using (ServiceHost host = new ServiceHost(typeof(GetServerInfoService)))
     {
         host.AddServiceEndpoint(typeof(IGetServerInfo), new WSHttpBinding(), "http://127.0.0.1:9999/getserverinfoservice");
         if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
         {
             ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
             behavior.HttpGetEnabled = true;
             behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/getserverinfoservice/metadata");
             host.Description.Behaviors.Add(behavior);
         }
         host.Opened += delegate
         {
             Console.WriteLine("GetServerInfoService已经启动,按任意键终止服务!");
         };

         host.Open();
         Console.Read();
     }
 }

在上面提供的服务寄宿代码中,我们为创建的ServiceHost添加了ServiceMetadataBehavior,并采用了基于HTTP-GET的元数据获取方式,元数据的发布地址通过ServiceMetadataBehaviorHttpGetUrl指定。在调用ServiceHostOpen方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。在浏览器的地址栏上键入http://127.0.0.1:9999/getserverinfoservice/metadata,你将会得到以WSDL形式体现的服务元数据,如下图所示。

技术分享

权限问题:

如果无法启动该WCF服务,并提示错误:其他信息: HTTP 无法注册 URL http://+:9999/getserverinfoservice/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)

遇到这种问题时,将Visual Studio关闭,然后用管理员方式启动Visual Studio打开项目即可。

 

五、客户端调用WCF服务

我们编写的WCF服务成功运行后,这时我们就可以使用客户端来访问服务端了(前提是服务端一定是在运行状态)。那么在客户端如何调用我们编写的WCF服务呢,其实很简单,我们一步一步来操作。

1.在Client项目中引用单击鼠标右键,选择添加服务引用,如图所示:

技术分享

然后弹出界面,我们在地址栏填写http://127.0.0.1:9999/getserverinfoservice/metadata然后单击“转到”按钮,即可看见我们的服务,如图所示:

技术分享

然后单击确定即可,此时服务就已经引用成功了。此时我们需要编写客户端代码运行试试看,能否得到我们的期望的结果,Client项目中控制台代码如下所示:

 static void Main(string[] args)
 {
     ServiceReference1.GetServerInfoClient client = new ServiceReference1.GetServerInfoClient();
     string sTime = client.GetServerTime();
     Console.WriteLine("服务器时间:" + sTime);

     string sName = client.GetServerName();
     Console.WriteLine("服务器名称:" + sName);

     Console.Read();
 }

编写完成后,运行(WCF服务端一定要开启)试试看,运行效果如下所示:

技术分享

嗯,这样我们基本上就完成了WCF服务端与客户端的简单示例。

实际上在WCF中还有非常非常多的功能、扩展、细节配置等,将在后面的文章中继续陈述。

本文示例源码下载:WCFDemo

以上是关于C#编写简单计算器的主要内容,如果未能解决你的问题,请参考以下文章

C#中基于出生日期的简单年龄计算器[重复]

如何使用JS编写一个简单的计算器

C# 简单计算器设计 & 字符提取和整数整除练习

C# 计算器设计 代码,及过程图解

用c语言编写一个简单计算器程序

初遇C#:一个简单的小程序(圆形周长,面积计算器)