C#带小括号的运算
计算类的封装
jisuan.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ZY四则运算 { public class jisuan { public Dictionary<char, int> priorities = null; //优先级 public void Calculator() //添加了四种运算符以及四种运算符的优先级 { priorities = new Dictionary<char, int>(); priorities.Add(); priorities.Add(); priorities.Add(); priorities.Add(); priorities.Add(); } const string operators = "+-*/"; //运算符 public double Compute(double leftNum, double rightNum, char op) //这是一种方法,用来计算左右两个数的静态方法! { switch (op) { case '+': return leftNum + rightNum; case '-': return leftNum - rightNum; case '*': return leftNum * rightNum; case '/': return leftNum / rightNum; ; } } public bool IsOperator(char op) //每次判断这个字符是否是运算符? { ; } public bool IsAssoc(char op) //返回一个关联符号 { return op == '+' || op == '-' || op == '*' || op == '/'; } public Queue<object> QueueSort(string expression) // 队列排序 { Queue<object> result = new Queue<object>(); Stack<char> operatorStack = new Stack<char>(); //运算符栈 operatorStack.Push('#'); char top, cur, tempChar; //top栈顶,current最近的; string tempNum; , j; i < expression.Length; ) //取出表达式 { cur = expression[i++]; //取出表达式的每个字符赋给cur top = operatorStack.Peek(); //栈顶元素赋给top此时为"#" if (cur == '(') //将左括号压栈,此时栈顶元素为"(" { operatorStack.Push(cur); } else { if (IsOperator(cur)) //如果是运算符的话 { while (IsOperator(top) && ((IsAssoc(cur) && priorities[cur] <= priorities[top])) || (!IsAssoc(cur) && priorities[cur] < priorities[top])) { result.Enqueue(operatorStack.Pop()); //如果元素为运算符并且优先级小于栈顶元素优先级,出栈 top = operatorStack.Peek(); //继续把栈顶元素赋给top } operatorStack.Push(cur); //把数字压栈 } else if (cur == ')') //将右括号添加到结尾 { && (tempChar = operatorStack.Pop()) != '(') { result.Enqueue(tempChar); } } else { tempNum = "" + cur; j = i; '))) { tempNum += expression[j++]; } i = j; result.Enqueue(tempNum); } } } ) { cur = operatorStack.Pop(); if (cur == '#') continue; ) { top = operatorStack.Peek(); } result.Enqueue(cur); } return result; } public double Calucate(string expression) { try { var rpn = QueueSort(expression); Stack<double> operandStack = new Stack<double>(); double left, right; object cur; ) { cur = rpn.Dequeue(); //出列 if (cur is char) //如果cur为字符的话 { right = operandStack.Pop(); //右边的数字出栈 left = operandStack.Pop(); //左边的数字出栈 operandStack.Push(Compute(left, right, (char)cur)); //此时调用compute方法 } else { operandStack.Push(double.Parse(cur.ToString())); //是数字就压栈 } } return operandStack.Pop(); } catch { throw new Exception("表达式不正确!"); } } } }
Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace ZY四则运算 { public partial class Form1 : Form { Form2 frm2 = new Form2(); public Form1() { InitializeComponent(); } private void button1_Click_1(object sender, EventArgs e) { string Express = textBox1.Text; frm2.listBox1.Items.Add(Express); listBox1.Items.Add(" " + Express + "="); textBox1.Clear(); } private void button2_Click(object sender, EventArgs e) { frm2.ShowDialog(); } } }
Form2.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace ZY四则运算 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } ; //倒计时 ; ; private void Form2_Load(object sender, EventArgs e) { lblTime.Text = "剩余时间:"; timer1.Enabled = false; timer1.Interval = ; } private void timer1_Tick(object sender, EventArgs e) { int tm = time--; lblTime.Text = "剩余时间:" + tm.ToString() + "秒"; ) { timer1.Enabled = false; MessageBox.Show("时间已到", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void button1_Click_1(object sender, EventArgs e) { timer1.Stop(); MessageBox.Show(label1.Text); } private void button2_Click_1(object sender, EventArgs e) { timer1.Start(); } private void button3_Click_1(object sender, EventArgs e) { sfd.Filter = "(*.txt)|*.txt"; if (sfd.ShowDialog() == DialogResult.OK) { string sPath = sfd.FileName; FileStream fs = new FileStream(sPath, FileMode.Create); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); ; ; i <= iCount; i++) { sw.WriteLine(listBox2.Items[i].ToString()); } sw.Flush(); sw.Close(); fs.Close(); } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { ) { textBox1.Text = listBox1.Items[].ToString(); } else { MessageBox.Show("答题结束"); } } private void textBox2_KeyDown(object sender, KeyEventArgs e) { jisuan js = new jisuan(); if (e.KeyCode == Keys.Enter) { string result = textBox1.Text; if (textBox2.Text.Trim() == string.Empty) //去除空格之后,如果没答题给出提示。 { MessageBox.Show("您尚未答题", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Count++; if (textBox2.Text ==js.Calucate(result).ToString()) //直接调用Calucate这个方法计算result的值并与输入的值进行比较 { MessageBox.Show("回答正确!"); listBox2.Items.Add(result + "=" + textBox2.Text + " " + "√");//若答对直接后面打个对勾。 listBox1.Items.Remove(listBox1.SelectedItem); right++; } else { MessageBox.Show("答题错误!"); listBox2.Items.Add(result + "=" + textBox2.Text + " " + "×");//若答错就在后面打个错号。 listBox1.Items.Remove(listBox1.SelectedItem); } label1.Text = ).PadRight(, , ) + "%"; textBox1.Clear(); textBox2.Clear(); } } } }
运行测试:
出题界面:
答题界面:
提示结束:
保存:
C#带小括号的运算的更多相关文章
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
小括号()和大括号{} 主要包括一下几种 ${var} $(cmd) ()和{} $((exp)) ${var:-string},${var:+string},${var:=string},${var ...
- shell中的括号(小括号,中括号,大括号)及单引号、 双引号,反引号(``)
一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...
- Javascript小括号“()”的多义性
摘要:本文主要介绍JavaScript中小括号有五种语义. Javascript中小括号有五种语义 语义1,函数声明时参数表 function func(arg1,arg2){ // ... } 语义 ...
- shell中的大括号和小括号
1.shell中的大括号和小括号 1.${var} 2.$(cmd) 3.() 和 {} 4.${var:-string}, ${var:+string}, ${var:=string}, ...
- Javascript 中的小括号 “()” 的多义性
Javascript 中小括号有5 种语义 语义1:函数声明时参数表 1 function func(arg1, arg2){ 2 // ... 3 } 语义2:和一些语句联合使用以 ...
- js小括号的作用
js中小括号()的用法详解:对于小括号无论是菜鸟还是高手一定都不会陌生,可以说它几乎是随处可见,虽然熟悉但并非真正的理解,由此可能会产生很多莫名其妙的错误,下面就通过代码实例详细介绍一下小括号的用法. ...
- JavaScript小括号、中括号、大括号的多义性
语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...
- javascript 函数后面有多个小括号f( )( )( )...
有时我们看见js函数后面跟着多个小括号是什么意思?f( )( )( )... f()执行f函数,返回子函数 f()()执行子函数,返回孙函数 f()()()执行孙函数,返回重孙函数 ... ... 但 ...
- javascript小括号、中括号、大括号学习总结
作为一名编程人员,和括号打交道是必不可少的.你可知道在不同的上下文中,括号的作用是不一样的,今天就让我们简单总结下javascript小括号.中括号.大括号的用法. 总的来说,JavaScript中小 ...
随机推荐
- C#中ref和out的使用与区别
C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...
- memcache的windows下的安装和简单使用
原文:memcache的windows下的安装和简单使用 memcache是为了解决网站访问量大,数据库压力倍增的解决方案之一,由于其简单实用,很多站点现在都在使用memcache,但是memcach ...
- DNS子域授权与转发配置
正向区域SUB_ZONE_NAME IN NS NSSERVER_SUB_ZONE_NAME NSSERVER_SUB_ZONE_NAME IN A IP .com xingxing.com. xin ...
- spring02
1.在spring容器中的一个bean的整个生命周期 1.启动spring容器 2.bean实例化 3.装配属性 4.BeanNameAware:setBeanName 5.BeanFactoryAw ...
- java学习规划
今天在网上看到一位大学生的java学习线路规划,觉得蛮适合我,就详细阅读了一下,规划路线应该适用于大部分学习java语言的人,贴出来与大家共勉. 在学习的过程中,不能急于去学习更多的知识,因为知识是无 ...
- Struts2(六):ResultType
本章节将继续学习struts2的返回类型的使用方法. 学习文档下载struts2 full包解压后会在doc下包含离线html文档. 点击运行后页面: 点击Guides向导终将会有向导列表 再点开后, ...
- 网站和Web应用程序的区别
新建项目里面的(ASP.NET Web 应用程序)主要是做B/S系统的,与winform的开发方式类似.新建网站(ASP.NET 网站)是主要开发网站的.其实你只要跟着教程做就行了.具体区别如下(借鉴 ...
- tomcat server需要重启的时刻
1.修改了web project的任何配置文件,都需要重启tomcat 2.修改了任何java class文件,都需要重启tomcat server 3.在项目中添加了任何的文件,包括配置文件.jav ...
- javascript jsscript .js xml html json soap
javascript ecma标准的脚本语言用于 jsscript 微软标准的一种脚本语言 .js javascript或jsscript保存成文件的形式可用于在html里重复引用 jsscript只 ...
- python日志模块
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系 统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...