用户需求:
程序能接收用户输入的整数答案,并判断对错
程序结束时,统计出答对、答错的题目数量。
补充说明:0——10的整数是随机生成的
用户可以选择四则运算中的一种
用户可以结束程序的运行,并显示统计结果。
在此基础上,做增量开发。

增量内容:

(1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况;
             (2)用户可以设定倒计时;
             (3)用户可以设定随机整数的范围和题目数量;
             (4)用户可以选择哪种计算类型,比如加减乘除,或可选择软件随机生成四则运算中的一种;
             (5)用户可以选择随机生成的题目中是否带有小括号,比如(2+3)*5,如果是gui程序,添加这个功能可以用复选框实现。
             (6)保证生成过的题目不再重复出现。

设计思路:

我的想法是,先生成两个数运算的表达式,就和上次的一样。先让两个数进行加减计算,得到一个结果,之后再与第三个数进行乘除运算。如果要是这样做的话就要让它产生两个运算符,那就会有先算乘除后算加减了。就不能达到(2+3)*5这种先加减后乘除的运算了。并且也不能一次就生成一个三个数运算的表达式。所以就把这种想法舍弃了。
             因此呢,我们就把第一个和第二个文本框合并成了一个文本框,让它来存一个运算表达式。不管是生成两个数亦或是三个数的表达式都可以,最后只需要对这个字符串表达式进行计算就可以了。这才只是生成一个式子。难点在于对这个式子进行计算,要把这个式子取出来,用到队列,把它的每一个字符都取出来放到了栈里之后再进行计算。

代码实现:

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; namespace _Random
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public static int select = ;
public static int Count = ;
private int t = ;
public static int right = ; private void button1_Click(object sender, EventArgs e)
{
label2.Text = t.ToString();
timer1.Enabled = true;
timer1.Interval = ;
timer1.Start();
} private void RDN()
{
Random ran=new Random();
int n1,n2;
if (textBox4.Text==""&&textBox5.Text=="")
{
MessageBox.Show("请输入取值范围!");
return;
}
if (checkBox1.Checked == true)
select = ;
for (int i = ; i < int.Parse(textBox6.Text); i++)
{
textBox1.Clear();
switch (select)
{
case :
{
n1 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
int n3 = ran.Next(, int.Parse(textBox5.Text));
textBox1.Text += "(";
if (n1 < ) textBox1.Text += "(" + n1 + ")";
else textBox1.Text += n1;
if (ran.Next(, ) == ) textBox1.Text += "+";
else textBox1.Text += "-";
if (n2 < ) textBox1.Text += "(" + n2 + ")";
else textBox1.Text += n2 + ")";
if (ran.Next(, ) == ) textBox1.Text += "*"+n3;
else textBox1.Text += "/" + n3;
break;
}
} textBox3.Text = "";
}
} private void RandomNumjia()
{
textBox1.Clear();
textBox3.Clear();
if (textBox4.Text == "" && textBox5.Text == "")
{
MessageBox.Show("请输入取值范围!");
return;
} Random ran = new Random();
int n1 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
int n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
if (n1 < ) textBox1.Text += "(" + n1 + ")";
else textBox1.Text += n1;
textBox1.Text += "+";
if (n2 < ) textBox1.Text += "(" + n2 + ")";
else textBox1.Text += n2;
} private void RandomNumjian()
{
textBox1.Clear();
textBox3.Clear();
if (textBox4.Text == "" && textBox5.Text == "")
{
MessageBox.Show("请输入取值范围!");
return;
} Random ran = new Random();
int n1 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
int n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
if (n1 < ) textBox1.Text += "(" + n1 + ")";
else textBox1.Text += n1;
textBox1.Text += "-";
if (n2 < ) textBox1.Text += "(" + n2 + ")";
else textBox1.Text += n2;
} private void RandomNumcheng()
{
textBox1.Clear();
textBox3.Clear();
if (textBox4.Text == "" && textBox5.Text == "")
{
MessageBox.Show("请输入取值范围!");
return;
} Random ran = new Random();
int n1 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
int n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
if (n1 < ) textBox1.Text += "(" + n1 + ")";
else textBox1.Text += n1;
textBox1.Text += "*";
if (n2 < ) textBox1.Text += "(" + n2 + ")";
else textBox1.Text += n2;
} private void RandomNumchu()
{
textBox1.Clear();
textBox3.Clear();
if (textBox4.Text == "" && textBox5.Text == "")
{
MessageBox.Show("请输入取值范围!");
return;
} Random ran = new Random();
int n1 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
int n2 = ran.Next(int.Parse(textBox4.Text), int.Parse(textBox5.Text));
if (n1 < ) textBox1.Text += "(" + n1 + ")";
else textBox1.Text += n1;
textBox1.Text += "/";
if (n2 < ) textBox1.Text += "(" + n2 + ")";
else textBox1.Text += n2;
} private void timer1_Tick(object sender, EventArgs e)
{
if (t <= )
{
timer1.Enabled = false;
textBox3.Enabled = false;
MessageBox.Show("时间到!");
textBox3.Enabled = false;
Form2 frm2 = new Form2();
frm2.ShowDialog();
}
t = t - ;
label2.Text = t.ToString();
} private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
Form2 frm2 = new Form2();
frm2.ShowDialog();
} private void button3_Click(object sender, EventArgs e)
{
RandomNumjia();
} private void button4_Click(object sender, EventArgs e)
{
RandomNumjian();
} private void button5_Click(object sender, EventArgs e)
{
RandomNumcheng();
} private void button6_Click(object sender, EventArgs e)
{
RandomNumchu();
} private void button7_Click(object sender, EventArgs e)
{
if (textBox4.Text == "" && textBox5.Text == "")
{
MessageBox.Show("请输入取值范围!");
return;
}
else
{
for (int i = ; i < int.Parse(textBox6.Text);i++)
{
RDN();
}
}
} private void textBox3_KeyDown(object sender, KeyEventArgs e)
{
string result = textBox1.Text; if (Count == int.Parse(textBox6.Text))
{
Form2 frm2 = new Form2();
frm2.ShowDialog();
} if (e.KeyCode == Keys.Enter)
{
if (textBox3.Text == Calucate(result).ToString()) //直接调用Calucate这个方法计算result的值并与输入的值进行比较
{
right++;
Count++;
MessageBox.Show("回答正确!");
} else
{
MessageBox.Show("答题错误!");
Count++;
string s = textBox1.Text;
if (s.Substring(textBox4.TextLength, ) == "+")
{
RandomNumjia();
}
else if (s.Substring(textBox4.TextLength, ) == "-")
{
RandomNumjian();
}
else if (s.Substring(textBox4.TextLength, ) == "*")
{
RandomNumcheng();
}
else if (s.Substring(textBox4.TextLength, ) == "/")
{
RandomNumchu();
}
else if (s.Length > )
{
RDN();
}
} string m = textBox1.Text;
if (m.Substring(textBox4.TextLength, ) == "+")
{
RandomNumjia();
}
else if (m.Substring(, ) == "-")
{
RandomNumjian();
}
else if (m.Substring(, ) == "*")
{
RandomNumcheng();
}
else if (m.Substring(, ) == "/")
{
RandomNumchu();
}
else if (m.Length > )
{
RDN();
}
}
} static Dictionary<char, int> priorities = null; //优先级 static void Calculator() //添加了四种运算符以及四种运算符的优先级
{
priorities = new Dictionary<char, int>();
priorities.Add('#', -);
priorities.Add('+', );
priorities.Add('-', );
priorities.Add('*', );
priorities.Add('/', );
} const string operators = "+-*/"; //运算符
static 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;
default: return ;
}
} static bool IsOperator(char op) //每次判断这个字符是否是运算符?
{
return operators.IndexOf(op) >= ;
} static bool IsAssoc(char op) //返回一个关联符号
{
return op == '+' || op == '-' || op == '*' || op == '/';
} static 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;
for (int i = , 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 == ')') //将右括号添加到结尾
{
while (operatorStack.Count > && (tempChar = operatorStack.Pop()) != '(')
{
result.Enqueue(tempChar);
}
}
else
{
tempNum = "" + cur;
j = i;
while (j < expression.Length && (expression[j] == '.' || (expression[j] >= '' && expression[j] <= '')))
{
tempNum += expression[j++];
}
i = j;
result.Enqueue(tempNum);
}
}
}
while (operatorStack.Count > )
{
cur = operatorStack.Pop();
if (cur == '#') continue;
if (operatorStack.Count > )
{
top = operatorStack.Peek();
} result.Enqueue(cur);
} return result;
} static double Calucate(string expression)
{
try
{
var rpn = QueueSort(expression); //rpn逆波兰表达式reverse polish notation
Stack<double> operandStack = new Stack<double>();
double left, right;
object cur;
while (rpn.Count > )
{
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("表达式格式不正确!");
}
} }
}

代码编写过程:

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; namespace _Random
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = Form1.Count.ToString();
textBox2.Text = Form1.right.ToString();
textBox3.Text = (Form1.Count - Form1.right).ToString();
} }
}

运行过程:

答题的时候给出取值范围,点击随机,程序会给出一个运算式,在等号后面的文本框
里面输入答案,这是会调用计算方法,并判断对错。

时间到了会给出测试结果。并提示时间到!

PSP耗时分析:

结对编程总结:

说明:我们一起做的是第五个增量。

  这次结对编程依然是我的老搭档张宇,总的来说他是一个比较优秀的搭档,对我的辅导也非常尽心,通过这两次结对编程我学到了很多知识,也了解了自己以前不知道的逆波兰表达式,这些多亏我的搭档给我讲解。说实话看到老师发的作业增量一次比一次难我都有放弃的想法,多亏搭档坚持。当看到增量作业一点头绪都没后来我们在网上查了一些资料才有所了解。通过这次编程我明白了所谓的迭代,代码永远都敲不完,客户的每一次需求,我们都要进行一次代码修改,还要保证之前的功能依然可以实现,所以程序员真的不是一个轻松的活。但是我想只要努力就可以成功!

C#窗体——四则运算的更多相关文章

  1. C#窗体->>随机四则运算(计算表达式)

    用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在 ...

  2. C#窗体->>随机四则运算

    用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在 ...

  3. C#窗体随机四则运算 (第四次作业)

    ---恢复内容开始--- 增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:2)用 ...

  4. 四则运算(window窗体程序)

    我的第一个程序 忙活了半个下午做出来了,勉强可以见人,虽然还有些瑕疵,但是我也尽力了...... 我做的是一个能对0--10之间的整数进行四则运算的,题目的数据是程序自动生成的,而且程能接收用户输入的 ...

  5. web窗体之四则运算

    1,计算方法: namespace ASP.NET { public class JiSuan { public int S; public int Result { get { return S; ...

  6. Homework_4 四则运算 - C#版

    题目要求 :http://www.cnblogs.com/gdfhp/p/5311937.html 结对同伴: 姓名:胡仕辉   学号:130201225   博客地址:http://www.cnbl ...

  7. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  8. java 24 - 9 GUI 之 给窗体换图标、设置启动在屏幕中间、更换皮肤

    A.首先更改窗体左上角的图片 步骤一: 创建3个包,分别建立1个类 第一个是窗体的包,窗体类:设置窗体的主要布置和功能 第二个是资源包,图片:把想要改的图案拉进来 第三个是UI界面包,UI界面设计类: ...

  9. java 24 - 8 GUI之创建四则运算计算器(未校验版)

    这个是用NetBeans软件制作的,因为这个软件制作GUI任务比较方便 通过拖拽控件生成的窗体:(红色的名称是更改后的控件名称) 拉拽好布局后,要进行的步骤: A:更改想要进行操作的控件的名称(右键控 ...

随机推荐

  1. 初学node.js-nodejs连接MongoDB(5)

    一.吧MongoDB的驱动程序添加到Node.js中 Node.js 连接 MongoDB 连接

  2. PHP代码优化—array_push

    PHP中数组插入数据通常有这么几种: 定义的时候直接赋值 $arr = array('apple', 'banana'); 使用数组变量操作 $arr = array(); $arr[] = 'app ...

  3. PHP原生开发的各大音乐平台API接口

    支持以下音乐平台 网易云音乐 QQ音乐 酷狗音乐 酷我音乐 虾米音乐 百度音乐 一听音乐 咪咕音乐 荔枝FM 蜻蜓FM 喜马拉雅FM 全民K歌 5sing原创 5sing翻唱 若是数据获取失败 方案一 ...

  4. Scala-元组操作

    package com.bigdata object TupleMapO { def main(args: Array[String]): Unit = { // 元组:Tuple,就是由()包起来, ...

  5. scala字段权限问题

    1.对象私有字段 1)private class Counter(num: Int) { private var value = 0 def increment() = { value += 1 } ...

  6. JavaWeb基础—会话管理之Session

    一.什么是session session类似于客户端在服务器端的账户.使用Map存放 一个会话锁定一个用户(一般情况下是一个客户端,即一个浏览器独占一个session对象),即使使用浏览器访问其他程序 ...

  7. RabbitMQ(二):理解消息通信RabbitMQ

    原文:RabbitMQ(二):理解消息通信RabbitMQ 一.消费者.生产者和信道 生产者(producer):生产者创建消息,然后发布(发送)到代理服务器(RabbitMQ),可以说发送消息的程序 ...

  8. 工作中应对客户时日语mail的总结

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  9. c++ 分配与释放内存

    教学内容: calloc分配内存 calloc与malloc的区别 memset函数初始化内存 free释放动态分配的内存 一.calloc函数分配内存 void *calloc( size_t nu ...

  10. loj#121.「离线可过」动态图连通性

    题面 话说#122怎么做啊 题解 我的\(\mathrm{LCT}\)水平极差,连最小生成树都快忘了,赶紧复习一下 做法和这篇是一样的 这道题还可以练习线段树分治 还可以练习ETT 果然是道吼题 代码 ...