数据结构课程设计 模拟计算器程序

合集下载

数据结构课程设计-计算器

数据结构课程设计-计算器

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。

通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。

本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。

一、需求分析首先,我们需要明确计算器程序的功能需求。

这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。

用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。

此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。

在这个计算器程序中,我们可以使用栈这种数据结构。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。

我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。

当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。

如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。

在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。

三、算法设计1、表达式解析算法从左到右扫描表达式。

如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。

如果遇到操作符(+、、、/),则将其压入操作符栈。

如果遇到左括号“(”,则将其压入操作符栈。

如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。

2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。

根据操作符的类型,从操作数栈中弹出相应数量的操作数。

进行计算,并将结果压回操作数栈。

C语言课程设计 简单计算器程序.

C语言课程设计  简单计算器程序.
else
{ printf("Sym栈空\n"); return; }
}
void NumPush()//压栈
{
If(Num.top<MaxSize-1)
{
Num.data[++Num.top]=ston(expr,&i);
}
else
{
printf("Num栈满\n"); return;
}
}
定义逆波兰(后缀式)表达式的计算函数(出栈)
将算术表达式转化为逆波兰表达式计算逆波兰表达式的值

3.1栈的定义与使用
首先定义两个栈,一个字符型,一个双精度型,程序代码如下:
Struct
{
char data[MaxSize];//存放表达式的字符数组
int top;//栈顶指针
}Sym;/*符号*///作为存放运算表达式的栈使用
struct
{
{
if(Sym.top<MaxSize-1)
{ Sym.data[++Sym.top]=calc[i++]; }
else
{ printf("Sym栈满\n"); return; }
}
void SymPop() //出栈
{
if(Sym.top>=0)
{ expr[++t]=Sym.data[Sym.top--];}
(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:a当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入(后缀)逆波兰表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。

数据结构计算器(包括中缀转换后缀)课程设计报告

数据结构计算器(包括中缀转换后缀)课程设计报告

课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。

基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。

对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。

测试数据:任意选取一个符合题目要求的表达式。

提高要求:(1)能够处理多种操作符。

(2)实现包含简单运算的计算器。

(3)实现一个包含简单运算和函数运算的计算器。

2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。

此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。

可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。

本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。

对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。

并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。

(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。

数据结构课程设计报告设计一个一元多项式计算器

数据结构课程设计报告设计一个一元多项式计算器

数据结构课程设计报告题目设计一个一元多项式计算器班级20090201学生姓名学号2009031327专业电类强化班指导教师提交日期 2011/1/4南京航空航天大学金城学院目录一、题目要求及内容二、函数模块及功能三、技术要点四、源代码五、举例六、调试心得一.题目要求及内容1.题目:设计一个一元多项式计算器○1.用带头结点的单链表存储多项式Typedef struct lnode{Float coef;Int expn;Struct lnode *next;} lnode,*linklist;Typedef linklist polynominal;○2.输入时,构成的多项式链表按指数项大小递增有序排列○3.输出格式要求如:3x^2+6x^8+7x^12-9x^15○1.输入并且建立一元多项式○2.输出多项式○3.多项式相加a+b○4.多项式相减a-b○5.多项式相乘a*b二.函数模块及功能1 .void Insert( linklist p,linklist h);链表插入void Insert( linklist p,linklist h){if(p->coef==0) free(p);//系数为0的话释放结点else{linklist q1,q2;q1=h;q2=h->next;while(q2&&p->expn>q2->expn) {//查找插入位置q1=q2;q2=q2->next;}if(q2&&p->expn==q2->expn) {//将指数相同相合并q2->coef+=p->coef;free(p);if(!q2->coef) {//系数为0的话释放结点q1->next=q2->next;free(q2);}}else{//指数为新时将结点插入p->next=q2;q1->next=p;}}}2.linklist Createlinklist(linklist head);创建链表linklist Createlinklist(linklist head) {//建立一个头指针为head的一元多项式linklist p;float a;int b;p=head=(linklist)malloc(sizeof(struct lnode));p->next=NULL;scanf("%f %d",&a,&b);while(a!=0 || b!=0){ //当输入为0 0时停止输入p=(linklist)malloc(sizeof(struct lnode));p->coef=a;p->expn=b;Insert(p,head); //调用Insert函数插入结点scanf("%f %d",&a,&b);}return head;}3.void Destroylinklist(linklist p);销毁链表void Destroylinklist(linklist p){ //销毁多项式linklistlinklist q1,q2;q1=p->next;q2=q1->next;while(q2){free(q1);q1=q2;q2=q2->next;}}4.void Printlinklist(linklist P);打印链表void Printlinklist(linklist P){linklist q=P->next;int flag=1;//项数计数器if(!q){ //若多项式为空,输出0putchar('0');printf("\n");return;}while(q){if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况printf("%g",q->coef);if(q->expn==1) putchar('X');else if(q->expn) printf("X^%d",q->expn);}else{if(q->coef==1){if(!q->expn) putchar('1');else if(q->expn==1) putchar('X');else printf("X^%d",q->expn);}if(q->coef==-1){if(!q->expn) printf("-1");else if(q->expn==1) printf("-X");else printf("-X^%d",q->expn);}}q=q->next;flag++;}printf("\n");}5.int compare(linklist a,linklist b);链表非空判断int compare(linklist a,linklist b){if(a&&b){if(!b||a->expn>b->expn) return -1;else if(!a||a->expn<b->expn) return 1;else return 0;}else if(!a&&b) return -1;//a多项式已空,但b多项式非空else return 1;//b多项式已空,但a多项式非空}6.linklist Addlinklist(linklist pa,linklist pb);链表合并—多项式相加linklist Addlinklist(linklist pa,linklist pb){//求解并建立多项式a+b,返回其头指针linklist qa=pa->next;linklist qb=pb->next;linklist headc,hc,qc;hc=(linklist)malloc(sizeof(struct lnode));//建立头结点hc->next=NULL;headc=hc;while(qa||qb){qc=(linklist)malloc(sizeof(struct lnode));switch(compare(qa,qb)){case 1:{qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}case 0:{qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;}case -1:{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}if(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}return headc;}7.linklist Subtractlinklist(linklist pa,linklist pb);链表合并—多项式相减linklist Subtractlinklist(linklist pa,linklist pb){//求解并建立多项式a-b,返回其头指针linklist h=pb;linklist p=pb->next;linklist pd;while(p){ //将pb的系数取反p->coef*=-1;p=p->next;}pd=Addlinklist(pa,h);for(p=h->next;p;p=p->next) //恢复pb的系数p->coef*=-1;return pd;}8.linklist Multiplylinklist(linklist pa,linklist pb);多项式相乘linklist Multiplylinklist(linklist pa,linklist pb){ //求解并建立多项式a*b,返回其头指针linklist hf,pf;linklist qa=pa->next;linklist qb=pb->next;hf=(linklist)malloc(sizeof(struct lnode));//建立头结点hf->next=NULL;for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){pf=(linklist)malloc(sizeof(struct lnode));pf->coef=qa->coef*qb->coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf);//调用Insert函数以合并指数相同的项}}return hf;}9.int Valuelinklist(linklist head,int x);多项式带值函数int Valuelinklist(linklist head,int x){//输入x值,计算并返回多项式的值linklist p;int i;int sum=0;int t;for(p=head->next;p;p=p->next){t=1;for(i=p->expn;i!=0;){if(i<0){t/=x;i++;}//指数小于0,进行除法else{t*=x;i--;}//指数大于0,进行乘法}sum+=int(p->coef)*t;}return sum;}10.void main();主函数void main(){int s,x;char flag;linklist pa=0,pb=0,pc;printf(" 欢迎使用多项式操作程序\n\n");//输出菜单printf(" *******************************************************\n"); printf(" * 一元多项式操作程序*\n"); printf(" * *\n"); printf(" * *\n"); printf(" * 1:输入多项式a 2:输入多项式b *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * a:输出多项式a b:输出多项式b *\n");printf(" * *\n"); printf(" * *\n"); printf(" * c:代入x的值计算a d:代入x的值计算b *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * +:输出a+b -:输出a-b *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * *:输出a*b q:退出程序*\n"); printf(" * *\n"); printf(" *******************************************************\n");printf("\n 请选择操作:");while(s){scanf(" %c",&flag);//空格符号一定要注意switch(flag){case '1':{printf("请输入多项式a各项系数和指数(系数,指数)输入0 0为结束:");pa=Createlinklist(pa);//建立多项式aprintf(" \n");printf("请继续操作: ");break;}case '2':{p rintf("请输入多项式b各项系数和指数(系数,指数)输入0 0为结束: ");pb=Createlinklist(pb);//建立多项式bprintf(" \n");printf("请继续操作: ");break;}case'a':{printf("\n 多项式a=");Printlinklist(pa);break;}case'b':{printf("\n 多项式b=");Printlinklist(pb);break;}case'c':{printf("输入x的值:x=");scanf("%d",&x);printf("\n x=%d时,a=%d\n",x,Valuelinklist(pa,x));break;}case'd':{printf("输入x的值:x=");scanf("%d",&x);printf("\n x=%d时,b=%d\n",x,Valuelinklist(pb,x));break;}case'+':{pc=Addlinklist(pa,pb);printf("\n a+b=");Printlinklist(pc);break;}case'-':{pc=Subtractlinklist(pa,pb);printf("\n a-b=");Printlinklist(pc);break;}case'*':{pc=Multiplylinklist(pa,pb);printf("\n a*b=");Printlinklist(pc);break;}case'q':{printf("\n 感谢使用此程序!\n");Destroylinklist(pa);Destroylinklist(pb);s=0;break;}default:printf("\n 操作错误,请重新选择! \n");}}}三.技术要点这两个链表的交叉合并运算主要用到的是链表的基本操作,定义节点,将链表的创建(输入0 0为结束)、链表的交叉组合、链表内容升序排列、销毁链表、多项式的插入、多项式相加、多项式相减、多项式相乘、以及带值计算多项式等算法写成独立函数,通过主函数调用。

数据结构实验报告总结

数据结构实验报告总结

数据结构实验报告总结设计题目:模拟计算器程序学生姓名:谢先斌系别:计算机与通信工程学院专业:计算机科学与技术班级:1班学号:541007010144指导教师:卢冰李晔XX 年 6 月 21 日郑州轻工业学院课程设计任务书题目模拟计算器程序专业、班级计算机科学与技术10-01班学号541007010144 姓名谢先斌主要内容:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。

基本要求:要检查有关运算的条件,并对错误的条件产生报警。

主要参考资料:严蔚敏吴伟民编著《数据结构(C语言版)》清华大学出版社第44页栈、第52页表达式求值完成期限: XX年6月21日指导教师签名:课程负责人签名:XX年 6月 21 日一、设计题目模拟计算器的程序设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。

设计要求:要检查有关运算的条件,并对错误的条件产生报警。

二、算法设计的思想本程序设计主要是应用了栈,利用栈的“先进后出”原理,建立了两个栈,分别为运算符栈pOStack和运算数栈pDStack。

算法的基本思想(参考课本p53页)是:(1) 首先置操作数栈为pDStack空栈,表达式起始符为“=”,位运算符栈的栈底元素;(2) 依次读入表达式中的每个字符,若是操作数则进入pDStack栈,若是运算符则和pOStack栈的栈定运算符比较优先权后作相应操作,直到整个表达式求值完毕(即pOStack栈的栈定元素和当前读入的字符均为“=” )。

三、算法的流程图本程序的流程如下附图1所示:附图1 程序流程图四、算法设计分析首先创建了两个栈:typedef struct OPStack //定义运算符栈{char opStack;int top;}OPStack, *pOPStack;typedef struct DATAStack //定义运算数栈{double stack;int top;}DATAStack, *pDATAStack;来分别存放运算符和运算数。

运用数据结构实现计算器(2023版)

运用数据结构实现计算器(2023版)

运用数据结构实现计算器运用数据结构实现计算器1.简介本文档将介绍如何使用数据结构来实现一个计算器。

计算器是一种用于执行数学运算的工具,通过输入表达式来计算结果。

我们将使用数据结构来存储和处理表达式中的数据和运算符。

2.功能需求我们的计算器将具有以下功能:●支持基本的四则运算(加法、减法、乘法、除法)●支持括号运算●支持多位数和小数运算●支持优先级运算(乘法和除法的优先级高于加法和减法)3.数据结构设计我们将使用以下数据结构来实现计算器:●栈(Stack):用于存储运算符和括号,以实现运算符优先级处理和括号匹配。

●队列(Queue):用于存储数值和中间结果,以实现表达式的计算和保存结果。

4.算法设计计算器的核心算法如下:●表达式解析:将输入的表达式解析为数值和运算符,并存储在队列中。

●运算符优先级处理:使用栈来存储运算符并进行优先级处理,确保正确的运算顺序。

●括号匹配:使用栈来匹配括号,以确保括号内的表达式可以正确计算。

●表达式计算:使用队列中的数值和运算符进行计算,并得出最终结果。

5.界面设计计算器可以有一个简单的用户界面,包括一个文本框用于输入表达式和一个按钮用于计算。

在计算完成后,结果将显示在另一个文本框中。

6.实现步骤要实现计算器,可以按照以下步骤进行:1.设计数据结构:确定使用的数据结构,包括栈和队列。

2.实现表达式解析:编写代码将输入的表达式解析为队列中的数值和运算符。

3.实现运算符优先级处理:编写代码使用栈来处理运算符的优先级。

4.实现括号匹配:编写代码使用栈来匹配括号。

5.实现表达式计算:编写代码使用队列中的数据进行计算并得出结果。

6.设计界面:创建用户界面,包括输入表达式的文本框、计算按钮和显示结果的文本框。

7.组合功能:将各个模块结合起来,实现完整的计算器功能。

7.附件本文档不涉及附件。

8.法律名词及注释本文档不涉及法律名词及注释。

数据结构课程设计-计算器

数据结构课程设计报告实验一:计算器设计要求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中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。

模拟计算器程序课程设计

模拟计算器程序-课程设计模拟计算器学生姓名:**** 指导老师:****摘要本课程设计的课题是设计一个模拟计算器的程序,能够进行表达式的计算,并且表达式中可以包含Abs()和Sqrt()运算。

在课程设计中,系统开发平台为Windows ,程序设计设计语言采用C++,程序运行平台为Windows 或*nix。

本程序的关键就是表达式的分离和处理,在程序设计中,采用了将输入的中缀表达式转化为后缀表达式的方法,具有可靠的运行效率。

本程序做到了对输入的表达式(表达式可以包含浮点数并且Abs()和Sqrt()中可以嵌套子表达式)进行判定表达式是否合法并且求出表达式的值的功能。

经过一系列的调试运行,程序实现了设计目标,可以正确的处理用户输入的表达式,对海量级数据都能够通过计算机运算快速解决。

关键词C++程序设计;数据结构;表达式运算;栈;中缀表达式;后缀表达式;字符串处理;表达式合法判定;目录1 引言 (4)1.1课程设计目的 (4)1.2课程设计内容 (5)2 设计思路与方案 (5)3 详细实现 (6)3.1 表达式的合法判定 (6)3.2 中缀表达式转化为后缀表达式 (7)3.3 处理后缀表达式 (10)3.4 表达式嵌套处理 (12)4 运行环境与结果 (13)4.1 运行环境 (13)4.2 运行结果 (13)5 结束语 (16)参考文献 (17)附录1:模拟计算器源程序清单 (18)1 引言本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。

该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。

利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

该算法的复杂度为O(n),能够高效、快速地求解表达式的值,提高用户的效率。

课程设计计算器模拟

《模拟计算器程序》程序设计基础课程设计报告学院:信息科学与技术学院专业:电子信息工程班级:2014电信1班姓名:李辉学号: 2014508206指导教师:郭理1.课程设计题目与要求 ........................... 错误!未定义书签。

1.1设计题目 ....................................... 错误!未定义书签。

1.2设计要求 ....................................... 错误!未定义书签。

2.总体设计 ............................................... 错误!未定义书签。

2.1总体功能框架............................... 错误!未定义书签。

2.2数据结构概要设计....................... 错误!未定义书签。

3.详细设计 ............................................... 错误!未定义书签。

3.1数据结构详细设计....................... 错误!未定义书签。

3.2系统功能详细设计....................... 错误!未定义书签。

3.2.1关于函数原型声明 (4)3.2.2函数功能 (4)3.2.3函数的形参说明 (4)3.2.4算法流程图 (5)4.运行结果 (8)5.课程设计总结 (11)6.程序设计方法 (12)7.参考文献 131.课程设计题目与要求1.1设计目的设计一个程序来模拟一个简单的手持计算器。

程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。

1.2设计要求程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’符号后,窗口显示出结果。

测试数据程序输入不少于5种不同的表达式进行测试2.总体设计2.1总体功能框架根据要求将该计算器分为九个模块,八个计算模块,一个退出模块.2.2数据结构概要设计用printf语句分开实现各自功能,并且将每种功能的实现步骤也插入语句中.每一个小模块各自完成功能,通过主调函数void调用.3.详细设计3.1数据结构详细设计运用函数while,switch,case,3.2算法流程3. 2.1关于函数原型声明void menu();void add();void sub();void mul();void div();void remain();void add_n_to_m();void factor();3.2.2函数功能printf("+ 1.加法 +\n");printf("+ 2.减法 +\n");printf("+ 3.乘法 +\n");printf("+ 4.除法 +\n");printf("+ 5.求余 +\n"); printf("+ 6.退出 +\n"); 3.2.3函数的形参说明3.2.4算法流程图1.主函数主函数比较简洁,只提供输入,处理和输出部分的函数调用。

计算器程序设计 数据结构课程设计指导书

一、课程设计的基本任务数据结构是一门涉及多门课程的课程,难度较大,需要较好的C语言的程序设计和调试能力,如果学生能够按照要求,从时间和精力上保证完全的投入,相信能够有很大的收获,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。

《数据结构》课程设计是计算机科学与技术专业的主要实践性教学环节。

在进行了专业基础课和《数据结构》课程的基础上,设计一个实际的应用软件,初步软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。

二、课程设计的基本要求课程设计按照教学要求需要一周时间完成,总共至少要上机调试程序10小时。

对每个题目要有需求分析,在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,(有些题目已经指定了数据存储的,按照指定的设计),设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

对有些题目提出算法改进方案,比较不同算法的优缺点。

如果程序不能正常运行,写出实现此算法中遇到的问题,和改进方法;2 对每个题目要有相应的源程序(可以是一组源程序,即详细设计部分):源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;3 最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。

1、能力培养要求①巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力。

②培养学生选用参考书,查阅手册及文献资料的能力。

培养独立思考,深入研究,分析问题、解决问题的能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计题目名称:模拟计算器程序计算机科学与技术学院课程设计任务书一、设计任务设计一个模拟计算器的程序二、设计要求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章需求分析‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 51.1系统设计流程图‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 51.2 主要功能表‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 6第2章总体设计‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 72.1 数据结构的选择‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 72.2 程序实现流程图‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 8第3章详细设计和编码‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 93.1表达式的判断‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 103.2 栈的定义及存储‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 11 3.3 表达式的嵌套处理‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 14 3.4 中缀表达式转化为后缀表达式‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 14第 4章编码与调试‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 17 4.1 系统测试‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 17 4.2 调试‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 17 4.3错误原因分析‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 17 4.4 调试结果‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 19第 5章总结‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 21 参考文献‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 22 附录‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 23第1章需求分析1.1系统流程图本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。

该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。

利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

该算法的复杂度为O(n),能够高效、快速地求解表达式的值,提高用户的效率。

本次课程设计为计算器模拟程序,主要解决表达式计算的问题,实现分别按表达式处理的过程分解为几个子过程,详细的求解过程如下:1 、用户输入表达式。

2 、判定表达式是否合法。

3 、把中缀表达式转化为后缀表达式。

4 、求出后缀表达式的结果。

5 、输出表达式的结果。

通过设计该程序,从而做到方便的求出一个表达式的值,而不需要一步一步进行运算。

1.1系统设计流程图1.2主要功能表除了实现基本的功能外,我还增加了其它一些功能,比如支持输入数据为浮点数,更重要的是本程序还支持表达式的嵌套运算,例如:A(1+2*S(2))我的实现方法是利用函数的递归调用来解决此问题,即把1+2*S(2)看成一个子表达式,这个子表达式中2也看成子表达式。

这样使得程序的适用范围更加的广泛,适应性更强,能支持更复杂的表达式的运算。

这也是本程序的优点之一。

第2章总体设计2.1 数据结构选择输入的时候将一个算术表达式用一个字符数组来接收,故需要对这个数组进行处理,让操作数和操作符分开,这里我想把开始的算术表达式转换成一个后缀表达式,这样在进行计算的时候就简单多了。

而在转换的过程中,对运算符的处理极为重要,这里运用堆栈,用堆栈的先进后出的特点,来处理运算符优先级的问题,让其成功转换成后缀表达式。

而在对后缀表达式进行处理的时候,又需要一个堆栈,这个堆栈存放操作数的。

并将运算结果存入该栈中。

两个堆栈的数据结构如下:struct{ char data[Maxlen];int top;}optr; //定义运算符栈struct{ double data[Maxlen];int top;}opnd; //定义操作数栈这里定义了类型,并且一起定义了两者类型的对象optr,opnd。

在将算术表达式转换成后缀表达式,定义change函数;在对后缀表达式进行处理时,定义jisuan函数,另外本程序有个欢迎界面,由meun函数实现。

因此主函数于各函数之间的关系为:meun()main() change()jisuan() 2.2程序实现流程图2.2程序设计流程图这里的两个主要的函数具体算法在详细设计中有说明本课程设计需要考虑许多的问题,首先是表达式的合法判断,然后是字符串表达式提取分离的问题,核心部分就是中缀表达式转化为后缀表达式。

对于第一个问题,我是分步来判断,首先表达式中是否含有其它非法字符,然后判断括号是否合法,接着判断运算法两边是否合法比如除法时,除数不能为零。

对于第二个问题,我是直接转换的,从左到右遍历中缀表达式,把数据全部取出来。

对于核心问题,利用了“栈”这种“后进先出”的数据结构,利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

本程序用户界面总共分为3个模块,分别是操作提示,数据输入,数据输出。

如图2.3所示。

2.3用户界面第3章详细设计和编码3.1表达式的判断表达式的合法判定过程如图3.1所示首先是其它字符的判定,从左到右遍历中缀表达式,看是否存在其它非法的。

然后是判定括号是否的匹配是否和合法,首先把“(”对应为1,相应的“)”对应为-1。

从左到右遍历表达式,如果遇到括号就加上其对应的值,用sum来保存其累加值。

如果在中途出现小于零的情况,即出现“..... )”那么的情况,即非法。

在遍历的最后,还要判断sum的值是否为零,如果为零就是合法,否则就是非法。

代码如下:for(i=0;i<s.length();i++){ //检验括号是否合法,以及是否存在非法字符if(!IsNum(s[i]) && !IsSign(s[i]) && s[i]!='(' && s[i]!=')' && s[i]!='A' && s[i]!='S' && s[i]!='.')return false;if(s[i]=='(')sum+=1;else if(s[i]==')')sum-=1;if(sum<0)return false; //括号匹配不合法}运算符判断是否合法,也是遍历一遍表达式,遇到“/”,看其后面的除数是否为零。

这里要考虑表达式中出现负数的情况,因此特殊考虑“-”号,判断它的前面是“(”还是没有字符了,那么就是负数。

3.2栈的定义、存储然后定义两个数组,p[400]用来存放算术表达式,q[400]用来存放后缀表达式。

由前面的数据结构定义两个对象optr,opnd。

当输入一个表达式后,定义i作为q的下标,定义dh=1表示是负号,初始化运算符栈optr.top=-1;让后对p进行扫描,当p指向的为数字字符,则将此字符如q,后在往q中输入#,具体为:while (*p>='0' && *p<='9'){q[i]=*p;i++; p++; }if (*p=='.'){ q[i]='.'; i++; p++;while (*p>='0' && *p<='9'){q[i]=*p;i++; p++;}}q[i]='#'; i++; dh=0;p后移,继续扫描,当遇到+或-时,执行if (dh==1){ if (*p=='-')optr.top++;optr.data[optr.top]='@'; p++; break; }while (optr.top!=-1 && optr.data[optr.top]!='('){ q[i]=optr.data[optr.top];optr.top--; i++;}optr.top++;optr.data[optr.top]=*p; p++; dh=0; break;当遇到*或/时,先查看操作符栈中是否有优秀级比它大的或者一样大的运算符,有的话就将其他的出栈,最后自己入栈。

执行:while (optr.data[optr.top]=='*' || optr.data[optr.top]=='/'|| optr.data[optr.top]=='s'){ q[i]=optr.data[optr.top];optr.top--; i++; }optr.top++;optr.data[optr.top]=*p; p++; dh=0; break;当遇到(时,此时不需要别的其他的操作,只需将其入操作符栈,并将dh=0;当遇到)时,此时需要将(之前的操作符全部出栈,具体操作如下:while (optr.data[optr.top]!='('){ q[i]=optr.data[optr.top];optr.top--; i++;}optr.top--; p++; dh=0; break;当遇到^时,根据运算符的优先级,执行:while (optr.data[optr.top]=='^'){ q[i]=optr.data[optr.top];optr.top--;i++;}optr.top++;optr.data[optr.top]=*p;p++;dh=0;break;遇到%时的操作和^差不多,这里就不做介绍了。

相关文档
最新文档