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中小 ...
随机推荐
- 深入分析 Java 中的中文编码问题
登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...
- shutter截图工具
安装: 1.打开ubuntu software center,搜索shutter,安装. 使用:
- Codeforces Round #350 (Div. 2) D2 二分
五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多 ...
- Qt常用命令收集
qt的命令很多,用到的时候到网上查,常常不能一下查到.这里记录下一些备用 1 从.ui文件生成头文件: uic xxx.ui > xxx.h 2 moc生成 moc yourfilename.h ...
- do put in ruby
apikey: XO.apikeys.cms, data: { favoriteItems: [{ UserId: SaveToFavoriteVar.content.FavoriteItem.Use ...
- UIWebView如何获取内容高度
iOS UIWebView如何获取到内容的高度呢?我们经常会遇到项目中需要使用UIWebView来加载H5页面,但是页面的高度并不确定,而我们前端需要根据内容的高度呈现出来,且不允许webview滚动 ...
- 关于队列queue
1.在多线程和多进程中都有queue.调用方式不同,使用方式一致: 线程中: import queue q = queue.Queue(maxsize = 2) 进程中: from multiproc ...
- golang protobuf SetExtension
对golang protobuf 的扩展字段赋值时候一直提示proto: bad extension value type clkUrl:="z.cn" proto.SetExte ...
- Decimal To Fraction 小数转换成分数
以0.25为例, 0.25 * 100 = 25, 求25 和 100 的最大公约数gcd. 25/gcd 为分子. 100/gcd为分母. //小数转分数 //0.3 -> 3/10, 0.2 ...
- mysql-四舍五入
四舍五入:1.format函数:select FORMAT(2.567,2); 返回:2.57select FORMAT(12562.6655,2); 返回:12,562.67 //整数部分超过三位的 ...