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的元数据获取方式,元数据的发布地址通过ServiceMetadataBehavior
的HttpGetUrl指定。在调用ServiceHost
的Open
方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。在浏览器的地址栏上键入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#编写简单计算器的主要内容,如果未能解决你的问题,请参考以下文章