科学计算器实验报告 下载本文

实验三科学计算器

一、实验目的: 1、熟练并掌握.net编程的方法。 2、对比JAVA和C++,掌握C# 编程与前二者的联系与区别。 3、按照教师要求实践针对.net编程技术的原型系统。 二、实验内容: 实现一个计算器的原型系统。 三、收获与体会(要求小组成员简要填写在课程实验中遇到的主要问题以及解决方法,并手工签上小组所有成员姓名): 遇到的问题及解决方法: 实验过程中遇到的问题及解决方法: 本次实验我们编写了一个Formula类,用以实现通过string计算出表达式结果。对于计算过程当中可能出现的异常(如:表达式无效、尝试在表达式结果未计算时获取表达式结果等)编写自定义异常,并在主程序中获取异常并处理。在处理表达式时如果遇到括号,则将括号内的字符串作为参数,创建一个新的Formula实例(InnerFormula),并将其计算出结果后放回原表达式替换这串括号继续处理。 体会: 虽然这个程序不难编程但是也让我们发现了自己在编程上的许多问题,以及对一些C#的语法还不够熟悉,但也让我们知道自己的不足,以及自己今后需要进行加强的方面是什么。更让我们体会到了团队合作的精神,以及大家在一起互帮互助,共同解决问题的感觉。相信我们今后也会更加默契,共同学习,共同进步。 签名: 附加代码

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.Threading;

namespace计算器 {

publicpartialclassFrmMain : Form {

bool error = false; public FrmMain() {

InitializeComponent(); }

privatevoid FrmMain_KeyPress(object sender, KeyPressEventArgs e) {

switch (e.KeyChar) { case'0':

button0.PerformClick(); break; case'1':

button1.PerformClick(); break; case'2':

button2.PerformClick(); break; case'3':

button3.PerformClick(); break; case'4':

button4.PerformClick(); break; case'5':

button5.PerformClick(); break; case'6':

button6.PerformClick(); break; case'7':

button7.PerformClick(); break; case'8':

button8.PerformClick(); break; case'9':

button9.PerformClick(); break; case'+':

buttonPlus.PerformClick(); break; case'-':

buttonMinus.PerformClick(); break; case'*':

buttonMultiply.PerformClick(); break; case'/':

buttonDivide.PerformClick(); break; case'.':

buttonDot.PerformClick(); break; case'(':

buttonLeft.PerformClick(); break; case')':

buttonRight.PerformClick(); break; case'\\b':

buttonDelete.PerformClick(); break; case'\\n':

buttonEqual.PerformClick(); break; } }

privatevoid button_Click(object sender, EventArgs e) {

switch (((Button)sender).Text)

{ case\←\:

if(textBoxExpression.Text.Length > 0)

textBoxExpression.Text = textBoxExpression.Text.Substring(0, textBoxExpression.Text.Length - 1); break; case\:

error = false;

textBoxExpression.Text = \; break; case\:

textBoxExpression.Text = \; break; case\:

DoFormula(); break; default:

textBoxExpression.Text += ((Button)sender).Text; break; } }

protectedvoid DoFormula() {

if (error == true) {

MessageBox.Show(\请先点击CE按钮清除上一次运算的错误!\, \运算错误\, MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

Formula fm = newFormula(textBoxExpression.Text); try

{

fm.Calculate(); } catch (Exception ex) {

textBoxExpression.Text = \; error = true;

MessageBox.Show(ex.Message, \运算错误\, MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

textBoxExpression.Text = fm.result.ToString(); }

}

classFormula {

protectedstring expression = \; protecteddouble _result = 0; protectedbool calculated = false;

Stack numbers = newStack(); Stack operators = newStack(); ///

///通过字符串初始化一个算式 ///

///

expression = initialString; } ///

///运算表达式并生成结果 ///

publicvoid Calculate() { //清空堆栈

numbers.Clear(); operators.Clear(); //扫描表达式,并解决乘除法 int index = 0; double tmpNum = 0; bool isNum = false;

for (index = 0; index < expression.Length; index++) { if (isNum == false) { //检测是否内嵌表达式

if (expression[index] == '(') { //扫描内嵌表达式的结尾 int i = index;

for (; i < expression.Length; i++) { if (expression[i] == ')') break;

} //新建子表达式并计算

Formula innerFormula = newFormula(expression.Substring(index+1, i - index - 1));//除去两个括号