当前位置:文档之家› 汽院数据结构课设(计算器)

汽院数据结构课设(计算器)

HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY数据结构课程设计报告课设题目:计算器专业:软件工程班级: T1323-4姓名:费昱成绩:完成日期: 2015年7月1日-2015年7月10日指导教师: 袁科马春江目录一、设计题目 (2)二、设计目的 (4)三、总体设计 (5)四、详细设计五、设计结果与分析六、总结(收获和不足)一、设计题目计算器的基本使用:计算器使用的基本函数与计算表达式求值问题、集合函数与三角函数、指数函数与对数函数的使用。

详细功能如下:(1)基本的运算:加,减,乘,除,求余;(2)基本的优先级预算:小括号,中括号;(3)基本的三角函数:正弦sin、余弦cos、正切tan 函数;(4)基本的反三角函数:反正切arcsin、反余切arccos、反正切arctan函数;(5)基本的函数:sinh、cosh、tanh;(6)基本的指数函数:2的n次方2^n、10的n次方10^n、自然对数的n次方e^n、任意数的n次方x^n; (7)基本的对数函数:以10为底的x对数log(10,x)、以e为底x的对数ln(x)、以a为底b的对数log(a,b);(8)基本的开方函数:算数平方根sqrt(x)、立方算数跟cuberoot(x)、任一数开n次方yroot(x,n); (9)基本的使用函数:阶乘函数fact(x),求余函数mod(x);(10)基本的集合函数:集合统计sum()、集合的估计方差var()、集合的总体方差varp()、集合的估计标准差stdevp()、集合的总体标准偏差stdev()。

二、设计目的1、巩固并加深学生对C#语言程序设计知识的理解;2、培养学生面程序设计思想,使学生认识数据结构在程序设计与构思上的应用于实战;3、进一步掌握和应用VS2013集成开发环境;4、提高运用C#语言解决实际问题的能力;5、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的程序实现功能;6、掌握课本与课外知识的结合、掌握理论与实践的结合、掌握数据与结构的存储关系;7.掌握基本的编程思想与知识,学会独立思考与动手能力;8.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;9.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;10.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;11.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

12.锻炼动手操作能力,培养我们的创新思维能力。

三、总体设计(1)基本思路与流程图:以9*(6+3)为例①获取intputbox中的字符9*(6+3)内容存入intput[i]的数组中;②进行解析intput[i]中的内容,依次解析intput[0]是否为数字在解析下一个intput[1]中的是否为数字不是跳出循环,将起始位置为0到1的字符转化成数值9存入数字栈中;③检测到intput[1]为操作,“*”进入操作栈,记录“*”的优先级为level = 3;④检测下一个intput[2]位字符,进行if (ch == '(')leftBracket++;⑤检测下一个intput[3] 是否为数字在解析下一个intput[1]中的是否为数字不是跳出循环,将起始位置为2到3的字符转化成数值6存入数字栈中;⑥检测到intput[4]为操作,“+”进入操作栈,记录“+”的优先级为level = 1;⑦检测下一个intput[4] 是否为数字在解析下一个intput[4]中的是否为数字不是跳出循环,将起始位置为4到5的字符转化成数值3存入数字栈中;⑧检测下一个intput[2]位字符,进行if (ch == ')')rightBracket++; 判断左右括号个数是否相等(leftBracket == rightBracket),相等无误,可以进行计算,记录小括号的优先级为:level = 8;⑨根据优先级进行计算,首先进行小括号的运算,此时进行的是双目运算,从数字栈取出的数字为“3”与“6”,进行“+”的运算,运算结果为“9”,数字“9”进入数字栈中;⑩此时在进行优先级的运算,只有一个“*”,进行双目运算,取出“9”与“*”进行“*”的计算,登出最后的计算结果“81”,显示,计算完成。

(2)数据与符号进栈,用栈去存储数据与符号。

class CStack {private int top;private ArrayList list;public CStack() {list = new ArrayList();top = -1;}(3)判断符号的优先级问题。

①加减同一级别,“+”、“-”,等级为level = 1②乘除取余同一级别,“*”,“/”,“%”,等级为level= 3;③所有的集合函数同一级别:“sum()”、“var()”、“varp()”、“stdevp()”、“stdev()”、等级为level = 4;④所有的三角函数同一级别:“sin”、“cos”、“tan”,“arcsin”、“arcos”、“arctan”,“sinh”、“cosh”、“tanh”,“log(10,x)”、“ln(x)”、“log(a,b)”、“sqrt(x)”、“cuberoot(x)”、“yroot(x,n)”、“fact(x)”、“mod(x)”等级为level =5;⑤所有的指数函数同一级别:“2^n”、“10^n”、“e^n”、“x^n”、,等级为level =5;⑥所有的符号操作优先级为:“(”、“)”等级为:level =8;“^”等级为:level = 6;“[”、“]”等级为level = 9;“,”等级为:level = 0;(4)区分inputbox中的数据为数值和操作符与字母。

public int DealNum(string input, int i, ArrayListalist) {int num = -1;while (input[i] >= '0' && input[i] <= '9'|| input[i] == '.') {num++; i++;if (i == input.Length) break; }alist.Add(Convert.ToDouble(input.Substring(i- num - 1, num + 1)));return num;}(6)对于括号必须成对的出现,如不是成对出现则报错。

public bool IsBracketPair(string input) {int leftBracket = 0, rightBracket = 0;int leftofarrbracket = 0,rightofarrbracket = 0; //记录左右方括号的数量foreach (char ch in input) {if (ch == '(') leftBracket++;if (ch == ')') rightBracket++;if (ch == '[') leftofarrbracket++;if (ch == ']') rightofarrbracket++;}return (leftBracket == rightBracket) && (leftofarrbracket == rightofarrbracket);}(7)所有的数值与操作操作进栈之后按照操作的优先级进行,然后按照先进后出进行数值计算。

CStack s_symbol = new CStack();ArrayList suffix_expression = new ArrayList();int[] sb_level = new int[MAX_ARR_SIZE];int topofsb_level = -1;int leftofarrbracket = 0, rightofarrbracket = 0;int positionofalist = 0;bool isarrbracket = false;foreach (object o in alist) {positionofalist++;string str = o.ToString();if (o.GetType() == typeof(int) || o.GetType() == typeof(double)|| o.GetType() == typeof(float)) {suffix_expression.Add(o); continue;}(8)对于函数有单目运算和双目运算,区分运算。

public double FunctionCout(CStackcout_number, string str) { //双目运算double result = 0;if (str == "[" || str == "]" || str == ",") ;if (str == "+" || str == "-" || str == "*"|| str == "%|| str == "/" || str == "log" || str== "pow" || str == "mod(" || str == "mod" ||str == "yroot"|| str == "^") {if (cout_number.Count == 1) returndouble.NaN;double var1 =double.Parse(cout_number.Pop().ToString()),var2 = double.Parse(cout_number.Pop().ToString());else { //单目运算double var = double.Parse(cout_number.Pop().ToString());二、详细设计1.例如:在集合运算的时候是多个数值求和,求差,求方差等。

有时候还会遇到集合里面还有集合等各种特殊情况,此时采用递归函数运算,进行一步一步的分离开最后计算最外层的函数。

相关主题