汽院数据结构课设(计算器)
数据结构课程设计(算术表达式求值)-计算器
高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。
第二章系统分析开始运行时界面如下:你可以输入一个表达式,按E对其进行求值。
第四章系统实现#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define N 100double numStack[N]={0};//操作数栈int numTop;char opStack[N];//运算符栈int opTop;void print_num(double str1[],int n){int i;printf("\n操作数栈:\n");for(i=0;i<n;i++)printf("%g ",str1[i]);}void print_op(char str2[],int m){int j;printf("\n运算符栈:\n");for(j=0;j<m;j++)printf("%c ",str2[j]);}int op(char ch)//判断运算符优先级{if(ch=='+'||ch=='-') return 2;if(ch=='*'||ch=='/') return 3;if(ch=='(') return -1;return 0;}double result(double num1,char op,double num2)//计算{if(op=='+') return num1+num2;if(op=='-') return num1-num2;if(op=='*') return num1*num2;if(op=='/') return num1/num2;return 0;}int compute(char str[]){double num=0;int i=0,j=1,k=1;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')num=num*10+str[i]-'0';else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) )k=-1;else{if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')'){numStack[numTop++]=num*k;if(opTop!=0&&numTop!=0)print_num(numStack,numTop);num=0; j=1; k=1;}if(opTop==0||str[i]=='('){opStack[opTop++]=str[i];print_op(opStack,opTop);}else if(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop);print_op(opStack,opTop);}numTop--;}if(opStack[opTop]!='(') return 0;}else{if(str[i]=='\0'&&numTop==0) return 0;while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop-1); print_op(opStack,opTop);}numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];if(opTop!=0&&numTop!=0)print_op(opStack,opTop);}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void menu(){system("cls");printf("_______________________________\n");printf(" Clear(C) | Equal(E) | Quit(Q) \n");printf("-------------------------------\n");}int main(void){int i=0,j=0,k;char str[N]="\0";char num[N]="\0";char save[N]="\0";char ch;double temp;unsigned long temp2;menu();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch==')'||op(ch)||ch>='0'&&ch<='9'){str[i++]=ch;str[i]='\0';menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' ){num[j++]=ch;num[j]='\0';}elsej=0;}if(ch=='C'||ch=='c'){if(strlen(str))str[--i]='\0';menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}if(ch=='E'||ch=='e'){if(compute(str)){printf("\n=%g\n",numStack[0]);j=0; temp=numStack[0];if(temp<0){temp=-temp;num[j++]='-';num[j]='\0';}temp2=(unsigned long)temp;k=1;while(temp2/k>=10) k*=10;while(k){num[j++]=temp2/k+'0';num[j]='\0';temp2=temp2%k;k/=10;}temp=temp-(int)temp;if(temp!=0){num[j++]='.';num[j]='\0';temp+=0.0000005;}for(k=6;k>0;k--){if(temp==0) break;temp*=10;num[j++]=(int)temp+'0';num[j]='\0';temp=temp-(int)temp;}}i=0; j=0; str[0]='\0';}if(ch=='Q'||ch=='q'){printf("\nare you sure to quit?(Y/N)\n");ch=getch();if(ch=='Y'||ch=='y') break;else{menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}}ch=getch();}return 0;}第五章系统测试1.先输入: 3+2*5 后按E求值2.再输入:12/4-5 后按E求值3.再输入Q4.输入Y,退出系统。
数据结构课程设计-计算器
数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。
通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。
本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。
一、需求分析首先,我们需要明确计算器程序的功能需求。
这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。
用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。
此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。
在这个计算器程序中,我们可以使用栈这种数据结构。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。
我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。
当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。
如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。
在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。
三、算法设计1、表达式解析算法从左到右扫描表达式。
如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。
如果遇到操作符(+、、、/),则将其压入操作符栈。
如果遇到左括号“(”,则将其压入操作符栈。
如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。
2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。
根据操作符的类型,从操作数栈中弹出相应数量的操作数。
进行计算,并将结果压回操作数栈。
大数据结构课程设计简单计算器C语言
郑州师范学院信息科学与技术学院《简单计算器》课程设计报告设计题目:简单计算器班级: B15计科二班组长:组员:指导教师:完成日期: 2016 年 12 月 23 日成绩:摘要本次选做的课程设计是实现简单计算器的问题。
计算器是一个常用的运算工具,本次课题要求用程序语言的方式解决问题。
此问题仅使用数据结构中的栈操作就可以解决此问题。
而在为了方便使用,添加了easyx图形库实现了UI设计。
为了接近平常使用的计算器,特地创建死循环而且添加了“CE”清空输入和“<-”删除键来控制输入错误或者循环使用的问题。
在UI方面主要是实现按键和点击响应等交互,方便输入和修改,在程序框上面有输入和显示结果的文本框。
在计算过程中,以栈出栈进站的特性把中缀形式的算数表达式转化为计算机方便计算的后缀表达式,最后计算出结果以文本方式显示在结果输出框内。
目录摘要 (I)目录 ............................................................. I I 1需求分析. (3)1.1功能简介及分析 (3)1.2设计平台 (3)2概要设计 (3)2.1 Trans函数 (3)2.2 Compvalue 函数 (4)2.3 GetKey函数 (4)3详细设计和实现 (4)3.1转化为逆波兰式 (4)3.2计算逆波兰式 (6)3.3实现流程图 (7)3.3部分具体程序 (8)4调试与操作说明 (13)4.1调试情况 (13)4.2操作说明 (14)5设计总结 (15)参考文献 (16)1需求分析1.1功能简介及分析本次选做的课程设计是实现简单的计算器并且添加UI的交互。
此计算器是以软件的形式实现的计算器,运行在windows系统。
计算器在功能上分为三类,分别是:常见计算器,专用计算器,综合功能计算器。
常见的计算器又分为四种:①简单型计算器:只实现基本的加减乘除和括号运算。
②科学型计算器:可以进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。
数据结构课程设计___一元稀疏多项式计算器(报告 代码)__完整版
数据结构课程设计一、课程题目一元稀疏多项式计算器二、需求分析1、一元稀疏多项式简单计算器的功能是:1.1 输入并建立多项式;1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;1.3 求多项式a、b的导函数;1.4 计算多项式在x处的值;1.5多项式a和b相加,建立多项式a+b;1.6 多项式a和b相减,建立多项式a-b。
2、设计思路:2.1 定义线性表的动态分配顺序存储结构;2.2 建立多项式存储结构,定义指针*next2.3利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
多项式显示的格式为:c1x^e1+c2x^e2+…+cnx^en3、设计思路分析要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polyn p中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:① 若p->expn<q->expn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
② 若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③ 若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
数据结构计算器(包括中缀转换后缀)课程设计报告
课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。
对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。
测试数据:任意选取一个符合题目要求的表达式。
提高要求:(1)能够处理多种操作符。
(2)实现包含简单运算的计算器。
(3)实现一个包含简单运算和函数运算的计算器。
2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。
此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。
可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。
本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。
对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。
并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。
(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。
数据结构课程设计___一元稀疏多项式计算器(报告+代码)__完整版.
数据结构课程设计系别电子信息系专业计算机科学与技术班级学号4090113姓名王健指导教师党群成绩2011年7 月14 日目录一、课程题目 (1)二、需求分析 (1)三、测试数据 (2)四、概要设计 (2)五、调用关系图 (3)六、程序代码 (3)七、心得体会及总结 (12)数据结构课程设计一、课程题目一元稀疏多项式计算器二、需求分析1、一元稀疏多项式简单计算器的功能是:1.1 输入并建立多项式;1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;1.3 求多项式a、b的导函数;1.4 计算多项式在x处的值;1.5多项式a和b相加,建立多项式a+b;1.6 多项式a和b相减,建立多项式a-b。
2、设计思路:2.1 定义线性表的动态分配顺序存储结构;2.2 建立多项式存储结构,定义指针*next2.3利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
多项式显示的格式为:c1x^e1+c2x^e2+…+cnx^en3、设计思路分析要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polyn p中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:① 若p->expn<q->expn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
数据结构 模拟计算器课程设计
《数据结构》课程设计实验报告模拟计算器班级:学号:姓名:模拟计算器1、问题描述对于模拟计算器的设计,实际便是利用栈对一个表达式求值的问题。
要求:对包含加,减,乘,除,括号的任意整型表达式进行求解2、设计思路表达式:任何表达式都是由操作数、运算符和界限符组成的有意义的式子。
表达式求值时一般有后缀表示、中缀表示、前缀表示。
操作数:可以是常数、变量、常量。
运算符:从运算对象上分有单目运算符、双目运算符、三目运算符。
界限符:左右括号和表达式结束符。
思路:我们平时用到的表达式即为我们所输入的表达式(以‘ # ’结束),此表达式为中缀表达式,只要将此表达式利用栈来进出运算的符号转换为后缀表达式,之后利用栈来进出运算的数字将后缀表达式的值求出即可。
3、数据结构定义一般表达式的长度不会过长所以将顺序栈的容量设为100已经算是比较大了具体数据结构如下:# define maxsize 100typedef double datatype1;typedef char datatype2;typedef struct stack1{datatype1 data1[maxsize];int top1; /*栈顶元素*/}seqstack1,*pseqstack1; /*顺序栈*/typedef struct stack2{datatype2 data2[maxsize];int top2; /*栈顶元素*/}seqstack2,*pseqstack2; /*顺序栈*/4、系统功能模块介绍(1)判断字符是否为操作数函数 int isnum(char)当输入表达式时要利用栈对表达式中的数字和符号进行进栈出栈,因此要判断表达式中的内容是操作数、运算符还是界限符,给出相关信息。
(2)求运算符优先级函数 int priority(char )对输入的表达式中的内容,若为运算符和界限符则要判断其优先级已完成其计算的先后顺序。
(3)中缀表达式转换为后缀表达式函数 int infix_exp_value(char *,char *)我们平时使用的为中缀表达式,但若利用栈则利用后缀表达式比较容易计算,因此要将中缀表达式转换为后缀表达式,具体算法步骤如下:<1>count=0,初始化运算符栈s,将结束符‘# ’加入运算符栈s中。
数据结构课程设计-计算器
数据结构课程设计报告实验一:计算器设计要求1、问题描述:设计一个计算器,可以实现计算器的简单运算,输出并检验结果的正确性,以及检验运算表达式的正确性。
2、输入:不含变量的数学表达式的中缀形式,可以接受的操作符包括+、-、*、/、%、(、)。
具体事例如下:3、输出:如果表达式正确,则输出表达式的正确结果;如果表达式非法,则输出错误信息。
具体事例如下:知识点:堆栈、队列实际输入输出情况:正确的表达式对负数的处理表达式括号不匹配表达式出现非法字符表达式中操作符位置错误求余操作符左右出现非整数其他输入错误数据结构与算法描述解决问题的整体思路:将用户输入的中缀表达式转换成后缀表达式,再利用转换后的后缀表达式进行计算得出结果。
解决本问题所需要的数据结构与算法:用到的数据结构是堆栈。
主要算法描述如下:A.将中缀表达式转换为后缀表达式:1. 将中缀表达式从头逐个字符扫描,在此过程中,遇到的字符有以下几种情况:1)数字2)小数点3)合法操作符+ - * / %4)左括号5)右括号6)非法字符2. 首先为操作符初始化一个map<std::string,int> priority,用于保存各个操作符的优先级,其中+ -为0,* / %为13. 对于输入的字符串from和输出的字符串to,采用以下过程:初始化遍历器 std::string::iterator it=infix.begin()在当it!=from.end(),执行如下操作4. 遇到数字或小数点时将其加入到后缀表达式:case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{to=to+*it;break;}5. 遇到操作符(+,-,*,/,%)时,如果此时栈顶操作符的优先级比此时的操作符优先级低,则将其入栈,否则将栈中的操作符从栈顶逐个加入到后缀表达式,直到栈空或者遇到左括号,并将此时的操作符加入到栈中,在此过程中需判断表达式中是否出现输入错误:case'+':case'-':case'*':case'/':case'%':{if((it+1)==from.end()){cout<<"输入错误:运算符号右边缺少运算数"<<endl;return false;}if((*it=='*'||*it=='/')&&it==from.begin()){cout<<"输入错误:运算符号左边缺少运算数"<<endl;return false;}if((it+1)!=from.end()&&(*(it+1)=='+'||*(it+1)=='-'||*(it+1)=='*'||*(it+1)=='/' ||*(it+1)=='%')){cout<<"输入错误:运算符号连续出现"<<endl;return false;}to=to+" ";if(sym.empty()){sym.push(*it);break;}tem=sym.top();while(pri[*it]<=pri[tem]&&!sym.empty()&&tem!='('){to=to+tem+" ";sym.pop();if(sym.empty())break;tem=sym.top();}sym.push(*it);break;}6. 遇到“(”时,直接将其加入操作符栈,并且检测输入错误,并且当括号后的第一个符号为-时,说明用户试图输入负号,这种情况我们向目标表达式输出一个0,以达到处理负号的目的:case'(':{if((it+1)==from.end()){cout<<"输入错误:表达式以左括号结尾"<<endl;return false;}//若以+或者-开头,则按照正负号看待,向目标表达式中加入一个0if(*(it+1)=='-'||*(it+1)=='+'){to=to+'0';}if((it+1)!=from.end()&&((*(it+1)=='*'||*(it+1)=='/'||*(it+1)=='%'||*(it+1)==')'))) {cout<<"输入错误:左括号右边不能为运算符号或右括号"<<endl;return false;}if(it!=from.begin()&&(*(it-1)!='+'&&*(it-1)!='-'&&*(it-1)!='*'&&*(it-1)!='/'&&*(it-1)!='%'&&*(it-1)!='(')){cout<<"输入错误:左括号左边不能为运算数或右括号"<<endl;return false;}sym.push(*it);break;}5.遇到“)”时,将栈中的操作符从栈顶逐个弹出并放入后缀表达式中,直到在栈中遇到“(”,并将“(”从栈中弹出:case')':{if((it+1)!=from.end()&&*(it+1)!='+'&&*(it+1)!='-'&&*(it+1)!='*'&&*(it+1)!='/'&&*(it+1)!='%'&&*(it+1)!=')'){cout<<"输入错误:右括号右边不能为运算数"<<endl;return false;}if(it!=from.begin()&&(*(it-1)=='+'||*(it-1)=='-'||*(it-1)=='*'||*(it-1)=='/'||*(it-1)=='%')){cout<<"输入错误:右括号左边不能为运算符号"<<endl;return false;}to=to+" ";if(sym.empty()){cout<<"输入错误:表达式以右括号开始"<<endl;return false;}tem=sym.top();while(tem!='('){to=to+tem+" ";sym.pop();if(sym.empty()){cout<<"输入错误:括号匹配有误"<<endl;return false;}tem=sym.top();}sym.pop();break;}B.计算后缀表达式的主要思想:逐个字符的扫描后缀表达式,遇到单个数字或小数点时则先将其将其存到一个字符串中,当遇到后缀表达式中的分隔符(这里使用空格)时,则将这个字符串转化为数字放到堆栈numstack中;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{numtemp+=*it;break;}case' ':{if(numtemp!=""){if(numtemp.find('.')&&numtemp.find('.',(numtemp.find('.')+1))!=string::npos){cout<<"输入错误:小数点数目超出:"+numtemp<<endl;return false;}strm.str(numtemp);strm>>d;numstack.push(d);numtemp="";strm.str("");strm.clear();break;}break;}2.遇到操作符+,-,*,/,%时,将堆栈numstack中的栈顶的两个数取出来,进行相应操作的运算,并将结果加入到堆栈numstack 中;case'+':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1+d2);break;}case'-':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1-d2);break;}case'*':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1*d2);break;}case'/':{d2=numstack.top();numstack.pop();if(fabs(d2)<0.0000001){cout<<"输入错误:除数不能为0"<<endl;return false;}d1=numstack.top();numstack.pop();numstack.push(d1/d2);break;}case'%':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();if((fabs(d2-(int)d2))<0.0000001&&(fabs(d1-(int)d1))<0.0000001){int n1=(int)d1;int n2=(int)d2;numstack.push((double)(n1%n2));break;}else{cerr<<"输入错误:求模操作只能作用于整数"<<endl;return false;}}3.直到后缀表达式扫描完并且堆栈numstack中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。
数据结构课程设计 模拟计算器程序
数据结构课程设计题目名称:模拟计算器程序计算机科学与技术学院课程设计任务书一、设计任务设计一个模拟计算器的程序二、设计要求1、要求对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解2、程序基本功能要求实现完整,并有简单的验证。
3、设计报告要求格式规范,符合学校课程设计报告要求。
4、报告中流程图要求描述规范,算法设计清楚正确。
三、设计期限2018年3月5日到2018年3月30日前言利用本学期所学的《数据结构》课程,运用相关知识,查阅相关资料,编写C语言程序,设计一个简单计算器,要求编写的简单计算器能够模拟windows系统的计算器,用户能够用键盘输入相关数据,要求对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解,并且在程序运行过程中能够正常的退出程序。
这个程序实际上就是对一个表达式进行计算。
而一个算术表达式中包含各种运算符,每个运算符的等级可能会不同,这就成了本程序需要解决的一个主要的问题之一了。
另外计算器中需要有各种数学函数,比如:abs sqrt sin cos tan等,如何对这些函数进行处理,也是本程序能成功的一个关键。
还有一个问题就是如何处理操作符和操作数之间的关系也是一个要点。
例如:1+2*(3-2/1),经过怎么样的变换和处理能得出结果5。
数据的输入这里应该要用字符,然后通过字符和整形之间的关系进行转换即可,这样处理的话,就方便很多了。
在计算器程序运行中,输入数据时如果遇到输入错误的情况,能够能过键盘上的退格键进行删除,并且重新输入正确的数据。
在数据输入完成后,如果需要放弃本次计算操作,可以利用程序中设置好的按键进行清零,并为下一次运算作准备。
本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。
该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。
数据结构课程设计报告(二)表达式求值(计算器)
课程设计报告课程名称:数据结构课程设计设计题目:表达式求值(计算器)学院:信息科学与工程学院专业:计算机科学与技术(软件外包)姓名:指导教师:二零一五年十二月二十九日一、设计容与要求1、问题描述设计一个算术计算器,能运算包括四则运算、括号的表达式的运算。
2、设计要求实现()、+、-、*、/、^ 等运算,实现小数和整数混合运算,优先级的处理,能判断算术表达式是否正确等。
二、算法设计1、输入并建立表达式,运用数组结构体构建将整型数字与操作符结合定义运算符的优先级。
typedef struct yxj{char operat;int rank;}yxj;2、分别建立一个操作数栈和操作符栈存放数字和操作符,定义操作符栈第一个元素优先级最低。
3、自左向右扫描字符串遇到字符串中的数字时一律提取转换成double型存入操作数栈。
遇到操作符时,则将当前运算符的优先级数与运算符栈顶元素的优先级数相比较。
若当前运算符的优先级数大,则进栈;反之,则取出栈顶的运算符,并在数栈中连续取出两个栈顶元素作为运算对象进行运算,并将运算结果存入数栈,然后继续比较当前运算符与栈顶元素的优先级。
直到当前运算符进栈。
4、对比运算符进行+ - * /()^ 运算。
三、程序代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define N 100typedef struct yxj{char operat;int rank;}yxj;typedef struct str{char data[N];}zs;void szys(yxj mark[]){yxj os[N];char ch;double ns[N];zs zhan[20];int numb[N];int Len,p=0,q=1,i,o=1,n=0;char data[N];os[0]=mark[0];printf("请输入算术(+ - * / ^)表达式(以 = 结束):\n");scanf("%s",data);Len=strlen(data);numb[0]=0;for(i=0;i<20;i++)zhan[i].data[0]='\0';for(i=0;i<Len;i++){int t=0;if(data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/'||data[ i]=='('||data[i]==')'||data[i]=='='){int j,k=0;if((data[i]=='='||data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data [i]=='/')&&(data[i-1]=='^'||data[i-1]=='+'||data[i-1]=='-'||data[i-1]=='*'||data[i -1]=='/')){printf("格式错误\n");return;}numb[q++]=i;while(zhan[(p+k)/2].data[0]!='\0'){k++;}for(j=numb[q-2];j<numb[q-1];j++)if(data[j]>='0'&&data[j]<='9'||data[j]=='.')zhan[(p+k)/2].data[t++]=data[j];zhan[(p+k)/2].data[t]='\0';if(zhan[(p+k)/2].data[0]!='\0')ns[n++]=atof(zhan[(p+k)/2].data);p++;for(j=0;j<8;j++)if(mark[j].operat==data[i])break;while(1){if(mark[j].operat=='('){os[o++]=mark[j];break;}else if(mark[j].rank>os[o-1].rank&&mark[j].operat!='(') {os[o++]=mark[j];break;}else{double numb1,numb2,numb;ch=os[--o].operat;if(ch=='+'){numb1=ns[--n];numb2=ns[--n];numb=numb1+numb2;ns[n++]=numb;}if(ch=='-'){numb1=ns[--n];numb2=ns[--n];numb=numb2-numb1;ns[n++]=numb;}if(ch=='*'){numb1=ns[--n];numb2=ns[--n];numb=numb2*numb1;ns[n++]=numb;}if(ch=='/'){numb1=ns[--n];numb2=ns[--n];if(numb1==0){printf("无效操作\n");return;}else{numb=numb2/numb1;ns[n++]=numb;}}if(ch=='^'){numb1=ns[--n];numb2=ns[--n];numb=pow(numb2,numb1);ns[n++]=numb;}}}}else if(data[i]>='0'&&data[i]<='9');else if(data[i]=='.');else{printf("格式错误,请重新输入:\n");szys(mark);break;}}printf("%lf\n",ns[0]);}int main (){yxj mark[9];mark[0].operat='#';mark[0].rank=-1;mark[1].operat='+';mark[1].rank=1;mark[2].operat='-';mark[2].rank=1;mark[3].operat='*';mark[3].rank=2;mark[4].operat='/';mark[4].rank=2;mark[5].operat='(';mark[5].rank=-1;mark[6].operat=')';mark[6].rank=-1;mark[7].operat='=';mark[7].rank=0;mark[8].operat='^';mark[8].rank=3;while(1){char i[N];printf("*****1、计算器*****\n");printf("*****0、退出 *****\n");scanf("%s",&i);if(strcmp(i,"0")==0)break;else if(strcmp(i,"1")==0)szys(mark);elseprintf("没有该选项\n");}}四、运行测试1.正常四则运算2.乘方运算3.除数为零时4.格式出现错误5.小数运算五、结论这次课程设计让我们更加了解大一学到的C和这个学期学到的数据结构。
数据结构与算法课程设计--模拟简单计算器
数据结构与算法课程设计--模拟简单计算器数据结构与算法课程设计模拟简单计算器在计算机科学领域中,数据结构和算法是非常重要的基础知识。
本次课程设计的目标是模拟一个简单计算器,通过这个实践项目,深入理解和应用数据结构与算法的相关知识。
首先,让我们来明确一下简单计算器需要实现的功能。
它应该能够进行基本的四则运算,即加法、减法、乘法和除法。
同时,还需要支持输入多个操作数和运算符,能够按照正确的运算顺序进行计算。
为了实现这个简单计算器,我们需要选择合适的数据结构来存储输入的操作数和运算符。
考虑到操作的顺序性和灵活性,栈这种数据结构是一个不错的选择。
栈具有先进后出的特点,可以方便地处理运算的优先级。
接下来,我们开始设计算法。
当用户输入一个表达式时,程序需要对其进行解析。
首先,将表达式中的数字和运算符分别提取出来,并按照顺序存储在相应的栈中。
在计算过程中,从运算符栈中取出运算符,从操作数栈中取出相应的操作数进行计算,将结果重新压入操作数栈中。
在具体的实现过程中,我们需要处理一些特殊情况。
例如,除数不能为零的情况。
当遇到除法运算且除数为零时,程序应该给出相应的错误提示。
另外,对于表达式的合法性也需要进行检查。
比如,输入的表达式是否符合基本的数学运算规则,是否存在多余的字符或不匹配的括号等。
如果表达式不合法,程序也需要给出明确的提示信息,以便用户能够及时修正。
为了提高程序的可读性和可维护性,我们采用模块化的编程思想。
将表达式解析、运算处理、错误检查等功能分别封装成独立的函数,这样在后续的调试和优化过程中会更加方便。
```pythonclass Stack:def __init__(self):selfitems =def push(self, item):selfitemsappend(item)def pop(self):if not selfis_empty():return selfitemspop()else:return Nonedef is_empty(self):return len(selfitems) == 0def calculate(expression):operand_stack = Stack()operator_stack = Stack()num =""for char in expression:if charisdigit():num += charelif char in "+/":if num!="":operand_stackpush(int(num))num =""operator_stackpush(char)if num!="":operand_stackpush(int(num))while not operator_stackis_empty():operator = operator_stackpop()operand2 = operand_stackpop()operand1 = operand_stackpop()if operator =='+':result = operand1 + operand2 elif operator =='':result = operand1 operand2elif operator =='':result = operand1 operand2elif operator =='/':if operand2 == 0:print("除数不能为零!")returnresult = operand1 / operand2 operand_stackpush(result)return operand_stackpop()测试代码expression ="2+34-5/2"print(calculate(expression))```在上述代码中,我们首先定义了一个栈类`Stack`,用于存储操作数和运算符。
数据结构课程设计(简单计算器C语言)
郑州师范学院信息科学与技术学院《简单计算器》课程设计报告设计题目:简单计算器班级: B15计科二班组长:组员:指导教师:完成日期: 2016 年 12 月 23 日成绩:摘要本次选做的课程设计是实现简单计算器的问题。
计算器是一个常用的运算工具,本次课题要求用程序语言的方式解决问题。
此问题仅使用数据结构中的栈操作就可以解决此问题。
而在为了方便使用,添加了easyx图形库实现了UI设计。
为了接近平常使用的计算器,特地创建死循环而且添加了“CE”清空输入和“<-”删除键来控制输入错误或者循环使用的问题。
在UI方面主要是实现按键和点击响应等交互,方便输入和修改,在程序框上面有输入和显示结果的文本框。
在计算过程中,以栈出栈进站的特性把中缀形式的算数表达式转化为计算机方便计算的后缀表达式,最后计算出结果以文本方式显示在结果输出框内。
目录摘要 (I)目录 (II)1需求分析 (3)1.1功能简介及分析 (3)1.2设计平台 (3)2概要设计 (3)2.1 Trans函数 (3)2.2 Compvalue 函数 (4)2.3 GetKey函数 (4)3详细设计和实现 (4)3.1转化为逆波兰式 (4)3.2计算逆波兰式 (6)3.3实现流程图 (7)3.3部分具体程序 (8)4调试与操作说明 (14)4.1调试情况 (14)4.2操作说明 (14)5设计总结 (15)参考文献 (17)1需求分析1.1功能简介及分析本次选做的课程设计是实现简单的计算器并且添加UI的交互。
此计算器是以软件的形式实现的计算器,运行在windows系统。
计算器在功能上分为三类,分别是:常见计算器,专用计算器,综合功能计算器。
常见的计算器又分为四种:①简单型计算器:只实现基本的加减乘除和括号运算。
②科学型计算器:可以进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。
③程序员计算器:专门为程序员设计的计算器, 主要特点是支持And, Or, Not, Xor:最基本的与或非和异或操作, 移位操作 Lsh, Rsh:全称是Left Shift和Right Shift,也就是左移和右移操作,你需要输入你要移动的位数(不能大于最大位数) RoL, RoR:全称是Rotate Left和Rotate Right,对于RoL来讲,就是向左移动一位,并将移出的那位补到最右边那位上,RoR类似。
2019《数据结构》课程设计报告简单计算器设计-7页文档资料
安徽科技学院计算机(信息)专业《数据结构》课程设计实验报告学院: 理学院班级: 网络工程103班组长: 郭天翔学号: 1887100307成员:郭天翔、朱国华、孙前前开课学期: 2019年9月10日实验日期: 2019年12月1日指导教师: 赵靖实验名称:简单计算器设计实验场所:力行楼6楼实验室一、需求分析根据计算器的功能,我们知道,就是要求输入一个算数表达式,然后由程序计算出结果并输出,当然这是最基本的,我们还可以根据实际需求对其进行功能扩展,让其不光可以计算简单的加减乘除,还可以计算包括括号在内的,考虑到实际计算中需求,还可以将指数计算、开方、阶乘等运算加入到其中。
经过讨论,我们还可以做到在输入一个算式后对其进行表达式合法与否的判断,来增加程序的人性化。
综上,这就要求我们的程序分为主函数、表达式判断函数、结果计算函数。
二、概要设计在需求分析中,我们已对程序的功能做了大致规划,但是又怎样来实现这些功能呢?在主函数中,只需要输入输出以及对各函数进行调用就行了,所以主函数是相对简单的,只是编写程序代码是注意代码的规范性就行了!在表达式判断中,函数接收由主函数传来的表达式的地址,然后对表达式中个字符扫描对左右括号配对即可。
而计算函数有要分成两部分了,因为输入时按照一串字符串输入的,并不是数据,所以计算机并不能直接计算,而且计算牵扯到运算符的优先级问题,这是计算机不能直接处理的,因此,我们要首先把表达式转换成其能够识别计算的后缀表达式,这就有要求用一个后缀转换来实现,其次就要对这个后缀表达式计算了,我们仍用一个函数来实现。
在处理运算符优先级问题时,我们按自己定义其优先级大小并用结构体进行存储,这样即方便理解,又方便加入一些运算符!三、详细设计1、主函数(main.cpp)由于要输如一表达式,将此表达式存于一数组,考虑到程序可循环性,故判断输入的第一个字符是否等于“q”当输入为“q”是退出程序。
当不是时,调用pipei子函数对表达式进行匹配判断,不匹配是输出提示要求再次输入。
数据结构课程设计计算器
数据结构课程设计 计算器一、课程目标知识目标:1. 让学生掌握计算器的基本数据结构原理,包括栈、队列等在计算器中的应用。
2. 使学生理解表达式求值的中缀转后缀方法,并能够运用数据结构实现转换过程。
3. 让学生掌握利用数据结构进行有效计算的过程,如利用栈进行算术表达式的求值。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,如设计并实现一个简单的计算器程序。
2. 培养学生通过编程实践,加深对计算器内部处理机制的理解,提高编程技能。
3. 培养学生团队合作能力,通过小组合作完成课程设计任务。
情感态度价值观目标:1. 培养学生对计算机科学和编程的兴趣,激发其探究计算器内部原理的欲望。
2. 培养学生严谨的科学态度,注重细节,追求程序的正确性和效率。
3. 培养学生面对问题时,能够积极寻求解决方案,勇于克服困难的精神。
课程性质分析:本课程设计为高年级的数据结构课程实践环节,旨在通过实际案例让学生将理论知识与实际应用相结合,加深对数据结构原理的理解。
学生特点分析:学生已经具备了一定的编程基础和数理逻辑思维能力,能够理解较为复杂的数据结构,并具备一定的程序设计能力。
教学要求:1. 教师应引导学生主动探究,培养学生自主学习能力。
2. 教学过程中注重理论与实践相结合,强调动手实践能力。
3. 注重培养学生的团队协作能力和沟通能力,提高其综合素质。
二、教学内容1. 计算器的基本数据结构原理:- 栈的概念、原理及应用- 队列的概念、原理及应用2. 表达式求值:- 中缀表达式与后缀表达式的转换方法- 利用栈进行后缀表达式的求值3. 计算器程序设计:- 设计计算器程序的需求分析- 计算器程序的数据结构设计- 计算器程序的核心算法实现4. 课程实践:- 按照教学进度,分阶段完成计算器程序的设计与实现- 小组合作,进行程序调试与优化- 提交课程设计报告,分享学习成果教学内容安排与进度:1. 第1周:学习计算器基本数据结构原理,了解栈、队列的应用场景2. 第2周:学习表达式求值方法,掌握中缀转后缀及后缀求值算法3. 第3周:进行计算器程序设计,完成需求分析、数据结构设计和核心算法实现4. 第4周:课程实践,小组合作完成计算器程序的设计与实现,进行调试与优化5. 第5周:提交课程设计报告,进行成果分享和总结教材章节关联:本教学内容与教材中“数据结构”、“算法设计与分析”章节相关,结合实际案例,引导学生将所学知识应用于计算器程序设计中。
数据结构课程设计(一元稀疏多项式计算器)
实习报告:1.5题一元稀疏多项式计算器题目:设计一个一元稀疏多项式简单计算器班级:计科一班姓名:康宇学号:10061014 完成日期:2013.4.15一、需求分析1、一元稀疏多项式简单计算器的功能是:1)输入并建立多项式;2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;3)多项式a和b相加,建立多项式a+b;4)多项式a和b相减,建立多项式a-b。
5)计算多项式在x处的值;6)求多项式a、b的导函数;2、测试数据:1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^-3-x);3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);4、(x+x^3)+(-x-x^3)=0;5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);6、(x+x^2+x^3)+0=x+x^2+x^3.二、概要设计为实现上述程序功能,应以有序链表来表示多项式的系数和指数。
定义线性表的动态分配顺序存储结构;建立多项式存储结构,定义指针*next利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
1、元素类型、结点类型和指针类型:typedef struct LNode{float xishu; //系数int zhishu; //指数struct LNode *next;} LNode,*Linklist;2、建立两个全局链表指针,Linklist List1=NULL;Linklist List2=NULL;用来存放两个多项式,然后在main()函数里调用输入函数。
数据结构课程设计报告--简单计算器
计算机科学与信息工程学院数据结构课程设计设计题目:简单计算器专业计算机软件班级计软2班小组成员蔡松佐陈吉院王希刘军符锦柏曾祖滨刘一霖指导教师张显全2010 年12 月25 日数据结构分工情况组长:蔡松佐组员:曾祖滨、陈吉院、符锦柏、刘军、刘一霖、王希王希:负责设计程序的整体框架(定义数据结构,编写主函数)评分:90分符锦柏:负责编写栈的代码评分:95分蔡松佐:负责编写计算算术表达式的代码评分:95分陈吉院:负责编写比较符号优先级的代码评分:90分曾祖滨:负责将所有代码整合成一个完整的程序评分:88分刘军:负责写实验报告评分:90分刘一霖:负责测试程序,看其是否具有良好的健壮性评分:88分简单计算器一基本功能描述简单的计算器的功能是对基本的加、减、乘、除、四则运算,可对输入的操作数,包括整数,小数等进行运算。
二设计思路本程序主要是采用栈的理论知识,主要用到两个结构体栈,一个用来转化表达式,一个用来计算表达式。
区别就在于一个存储字符,一个存储浮点。
首先,用一个字符数组来存储用户输入的中缀表达式。
然后用栈来把这个表达式转化为后缀表达式,转化时要进行符号优先级比较,这里将‘*’‘/’的优先级定为2,‘+’‘-’定为1,括号和‘=’定为0。
具体思想如下:例如用户输入了1+2*3=,将其存放入一个字符数组中。
先在栈的底部存放一个‘=’号符,用作符号优先级比较。
首先将1存放到另外一个字符数组s1中,再将‘+’号入栈。
入栈的同时与底部的‘=’比较优先级,‘+’的优先级高于‘=’,所以不出栈,之后将2存放入s2中,然后再将‘*’入栈,入栈的同时与‘+’比较符号优先级,‘*’比‘+’高,所以不出栈。
再将3存入s2中。
之后将栈中不是‘=’的运算符都弹出栈,并依次存入s2中。
所以s2中的表达式为123*+。
之后进行计算,计算时用到浮点栈。
首先将s2中的字符依次入栈,遇到运算符时进行计算。
所以将123入栈后,再将‘*’入栈的同时,将前面两个数字进行运算,算出结果为6并存入栈中,之后再将‘+’入栈,再与1进行运算,结果即为7,然后输出结果。
数据结构课程设计报告(二)表达式求值(计算器).doc
数据结构课程设计报告(二)表达式求值(计算器).课程设计报告课程名称:数据结构课程设计设计题目:表达式求值(计算器)学院:信息科学与工程学院专业:计算机科学与技术(软件外包)姓名:指导教师:二零一五年十二月二十九日word教育资料.一、设计内容与要求1、问题描述设计一个算术计算器,能运算包括四则运算、括号的表达式的运算。
2、设计要求实现()、+、- 数据结构课程设计设计题目:表达式求值(计算器)学院:信息科学与工程学院专业:计算机科学与技术(软件外包)姓名:指导教师:二零一五年十二月二十九日word教育资料.一、设计内容与要求1、问题描述设计一个算术计算器,能运算包括四则运算、括号的表达式的运算。
2、设计要求实现()、+、:\n"); scanf("%s",data); Len=strlen(data); numb[0]=0; for(i=0;i20;i++) zhan[i].data[0]='\0'; for(i=0;i='0'data[i]='9'); else if(data[i]=='.'); else { printf("格式错误,请重新输入:\n"); szys(mark); break; } } printf("%lf\n",ns[0]);}int main (){ yxj mark[9]; mark[0].operat='#'; mark[0].rank=-1; mark[1].operat='+'; mark[1].rank=1; mark[2].operat='-'; mark[2].rank=1; mark[3].operat='*'; mark[3].rank=2; mark[4].operat='/'; mark[4].rank=2; mark[5].operat='('; mark[5].rank=-1; mark[6].operat=')'; mark[6].rank=-1; mark[7].opera该选项\n"); }}四、运行测试1.正常四则运算2.乘方运算3.除数为零时4.格式出现错误5.小数运算五、结论这次课程设计让我们更加了解大一学到的C和这个学期学到的数据结构。
数据结构课程设计计算器
数据结构课程设计计算器在计算机科学的学习中,数据结构课程设计是一个非常重要的实践环节。
而本次课程设计的主题是实现一个计算器,这不仅考验了我们对数据结构的理解和运用能力,还锻炼了我们的编程思维和解决实际问题的能力。
一、需求分析在开始设计之前,我们首先需要明确计算器的功能需求。
一个基本的计算器应该能够支持常见的四则运算(加、减、乘、除),以及处理括号的优先级。
此外,还应该能够处理整数和浮点数的运算,并且具备一定的错误处理能力,比如输入非法字符或表达式错误时能够给出相应的提示。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理表达式。
栈是一种非常适合的数据结构,因为它具有后进先出(LIFO)的特性,可以方便地处理括号和运算符的优先级。
我们可以使用两个栈,一个用来存储操作数(数字),另一个用来存储运算符。
在处理表达式时,从左到右依次读取字符,如果是数字,则将其压入操作数栈;如果是运算符,则根据运算符的优先级与栈顶运算符进行比较,决定是直接压入运算符栈还是先进行运算。
三、算法设计1、表达式转换首先,需要将用户输入的中缀表达式转换为后缀表达式。
中缀表达式如“(2 + 3) 4 5”,后缀表达式则是“2 3 +4 5 ”。
转换的过程中,通过栈来处理括号和运算符的优先级。
2、计算后缀表达式得到后缀表达式后,使用操作数栈进行计算。
从左到右读取后缀表达式的字符,如果是操作数,则压入栈中;如果是运算符,则从栈中弹出两个操作数进行相应的运算,并将结果压回栈中。
最后,栈顶元素即为计算结果。
3、错误处理在整个计算过程中,需要对用户输入的表达式进行错误检查。
例如,检查是否存在非法字符、括号是否匹配、除数是否为零等情况。
如果发现错误,及时给出提示信息。
四、代码实现以下是使用 C++语言实现计算器的部分代码示例:```cppinclude <iostream>include <stack>include <string>//判断字符是否为数字bool isDigit(char c) {return c >='0' && c <='9';}//计算运算符的优先级int precedence(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isDigit(c)){postfix += c;} else if (c =='('){opStackpush(c);} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();} else {while (!opStackempty()&& precedence(opStacktop())>=precedence(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();opStackpop();}return postfix;}//计算后缀表达式的值double evaluatePostfix(std::string postfix) {std::stack<double> operandStack;for (char c : postfix) {if (isDigit(c)){operandStackpush(c '0');} else {double operand2 = operandStacktop();operandStackpop();double operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':if (operand2!= 0) {operandStackpush(operand1 / operand2);} else {std::cout <<"除数不能为零!"<< std::endl; return -1;}break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入表达式:";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);double result = evaluatePostfix(postfixExpression);std::cout <<"结果:"<< result << std::endl;return 0;}```五、测试与优化在完成代码实现后,需要进行充分的测试以确保计算器的功能正确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.例如:在集合运算的时候是多个数值求和,求差,求方差等。
有时候还会遇到集合里面还有集合等各种特殊情况,此时采用递归函数运算,进行一步一步的分离开最后计算最外层的函数。