数据结构课程设计计算器

合集下载

数据结构课程设计(算术表达式求值)-计算器

数据结构课程设计(算术表达式求值)-计算器

高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。

第二章系统分析开始运行时界面如下:你可以输入一个表达式,按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、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构计算器实验报告

数据结构计算器实验报告

数据结构计算器实验报告1. 引言数据结构是计算机科学的基础,它提供了一种组织和存储数据的方式,以便能够高效地访问和操作这些数据。

计算器是一种常见的应用程序,它可以执行各种数学运算。

本实验的主要目的是设计和实现一个简单的数据结构计算器,用于实现基本的四则运算功能。

2. 设计思路在设计数据结构计算器时,我们需要考虑以下几个方面的问题:2.1 数据结构选择为了实现四则运算功能,我们首先需要选择合适的数据结构来存储和操作数学表达式。

在本实验中,我们选择使用栈作为数据结构,因为栈具有后进先出的特性,非常适合处理运算符和操作数的顺序。

2.2 表达式解析在计算器中,我们需要将用户输入的数学表达式解析成运算符和操作数,以便进行计算。

为了实现表达式解析功能,我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。

2.3 运算符优先级在进行四则运算时,运算符的优先级非常重要。

我们需要确保高优先级的运算符先于低优先级的运算符进行计算。

为了实现这一功能,我们可以使用栈来存储运算符,并在遇到运算符时进行比较和计算。

2.4 计算结果输出最后,我们需要将计算结果输出给用户。

为了实现这一功能,我们可以使用一个变量来存储计算结果,并在计算完成后将结果输出到屏幕上。

3. 实现步骤基于上述设计思路,我们可以按照以下步骤来实现数据结构计算器:3.1 定义栈数据结构首先,我们需要定义一个栈数据结构来存储运算符和操作数。

栈可以使用数组或链表来实现,具体选择取决于实际需求。

3.2 解析数学表达式接下来,我们需要编写代码来解析用户输入的数学表达式。

我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。

3.3 实现运算符优先级比较和计算在解析数学表达式的过程中,我们需要实现运算符的优先级比较和计算功能。

每当遇到一个运算符时,我们可以将其与栈顶的运算符进行比较,如果栈顶的运算符优先级较高,则可以进行相应的计算。

数据结构课程设计(简单计算器C语言)

数据结构课程设计(简单计算器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调试与操作说明 (13)4.1调试情况 (13)4.2操作说明 (14)5设计总结 (15)参考文献 (16)1需求分析1.1功能简介及分析本次选做的课程设计是实现简单的计算器并且添加UI的交互。

此计算器是以软件的形式实现的计算器,运行在windows系统。

计算器在功能上分为三类,分别是:常见计算器,专用计算器,综合功能计算器。

常见的计算器又分为四种:①简单型计算器:只实现基本的加减乘除和括号运算。

②科学型计算器:可以进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。

③程序员计算器:专门为程序员设计的计算器, 主要特点是支持And, Or, Not, Xor:最基本的与或非和异或操作, 移位操作Lsh, Rsh:全称是Left Shift和Right Shift,也就是左移和右移操作,你需要输入你要移动的位数(不能大于最大位数)RoL, RoR:全称是Rotate Left和Rotate Right,对于RoL来讲,就是向左移动一位,并将移出的那位补到最右边那位上,RoR类似。

运用数据结构实现计算器(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中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。

c设计计算器课程设计

c设计计算器课程设计

c 设计计算器课程设计一、课程目标知识目标:1. 学生能理解计算器的基本原理和功能,掌握计算器的基本操作方法。

2. 学生能够运用计算器解决基本的数学运算问题,如加减乘除、百分比计算等。

3. 学生能够理解并运用计算器上的科学计算功能,如平方根、指数运算等。

技能目标:1. 学生能够熟练操作计算器,快速进行数值输入、计算和结果读取。

2. 学生能够运用计算器进行实际问题的计算,如购物找零、时间计算等。

3. 学生能够通过计算器解决一些简单的数学问题,培养解决问题的能力和逻辑思维能力。

情感态度价值观目标:1. 学生培养对计算器的正确使用态度,明白计算器是辅助工具,提高计算效率的同时,不应过度依赖。

2. 学生在合作交流中使用计算器,培养团队合作意识和分享精神。

3. 学生通过计算器的运用,增强对数学学科的兴趣,认识到数学与生活的紧密联系。

课程性质:本课程属于实践操作类课程,注重培养学生的动手操作能力和实际问题解决能力。

学生特点:学生处于小学高年级阶段,对计算器有一定了解,好奇心强,喜欢动手操作。

教学要求:教师应引导学生通过实践操作,掌握计算器的使用方法,将计算器与实际生活问题相结合,提高学生的数学应用能力。

同时,注重培养学生的团队合作意识和正确使用计算器的态度。

在教学过程中,关注学生的学习成果,及时进行教学评估和调整。

二、教学内容1. 计算器的基本结构:介绍计算器的各个部分及其功能,如显示屏、键盘、电源等。

教材章节:《计算器与计算法则》第一章内容列举:计算器按键的功能及操作方法。

2. 计算器的基本操作:教授加减乘除、百分比、平方根、指数等基本运算。

教材章节:《计算器与计算法则》第二章内容列举:各类运算的操作步骤及注意事项。

3. 计算器在生活中的应用:通过实例教授计算器解决实际问题,如购物找零、时间计算等。

教材章节:《计算器与计算法则》第三章内容列举:实际案例及解决方法。

4. 科学计算器的使用:针对高年级学生,介绍科学计算器的拓展功能,如三角函数、对数等。

数据结构课程设计—十进制四则运算计算器的设计与实现

数据结构课程设计—十进制四则运算计算器的设计与实现

十进制四则运算计算器的设计与实现1.问题描述(1)题目描述:在以二叉树表示算术表达式的基础上,设计一个十进制的四则运算计算器。

(2)基本要求:实现整数或浮点数的四则运算。

(3)测试数据:12 - ( - 4 ) * ( ( 20 + 3 / 5 ) * 8 / 5 ) * ( - 4 ) #=-515.36- ( 22.7 - 4208.3 ) / ( ( 2.4 + 1.6 ) * 12 ) + 4.4 - 2.9 #=88.710 - ( - 3 ) * ( ( 21 + 3 / 5 ) * 8 / 3 ) * ( - 2 ) #=-335.62.需求分析(1)程序实现的功能是从键盘输入有效的表达式,求出其值并输出(2)程序运行后,会提示用户输入表达式,并判断是否有效,并返回值3.概要设计为了实现程序功能,用二叉树存储表达式,然后从二叉树按后序遍历的方式取出数据,进行运算,运算时用堆栈存储数据。

(1)二叉链表的定义ADT BinaryTree{//数据对象D:D是具有相同特性的数据元素的集合。

//数据关系R:// 若D=Φ,则R=Φ,称BinaryTree为空二叉树;// 若D≠Φ,则R={H},H是如下二元关系;// (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;// (2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;// (3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1 ?H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

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

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

数据结构课程设计题目名称:模拟计算器程序计算机科学与技术学院课程设计任务书一、设计任务设计一个模拟计算器的程序二、设计要求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和这个学期学到的数据结构。

课程设计设计计算器

课程设计设计计算器

课程设计设计计算器一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握计算器的基本原理和使用方法,理解计算器在数学和科学领域的应用。

技能目标要求学生能够熟练操作计算器,进行基本的算术运算、科学计算和数据处理。

情感态度价值观目标要求学生培养对科学技术的兴趣和好奇心,提高解决实际问题的能力,培养创新精神和团队合作意识。

通过分析课程性质、学生特点和教学要求,我们将目标分解为具体的学习成果。

课程目标明确,有利于学生和教师清晰地了解课程的预期成果,为后续的教学设计和评估提供依据。

二、教学内容根据课程目标,我们选择和了以下教学内容:1.计算器的基本原理:介绍计算器的电路结构、工作原理和编程方法。

2.计算器的使用方法:讲解计算器的各种功能键、操作界面和操作步骤。

3.计算器在数学领域的应用:举例说明计算器在代数、几何、概率等数学领域的应用。

4.计算器在科学领域的应用:介绍计算器在物理、化学、生物等科学领域的应用实例。

5.计算器编程:教授计算器的基本编程语言和编程技巧,让学生能够编写简单的计算器程序。

教学大纲将按照以上内容的安排和进度进行教学,确保内容的科学性和系统性。

三、教学方法为了激发学生的学习兴趣和主动性,我们选择以下教学方法:1.讲授法:教师讲解计算器的基本原理、使用方法和应用领域。

2.讨论法:学生分组讨论计算器编程技巧和解决实际问题的方法。

3.案例分析法:分析计算器在数学和科学领域中的应用案例,让学生加深理解。

4.实验法:学生动手操作计算器,进行编程和实践,提高操作技能。

通过多样化的教学方法,我们能够激发学生的学习兴趣,培养他们的创新精神和团队合作意识。

四、教学资源为了支持教学内容和教学方法的实施,我们选择和准备了以下教学资源:1.教材:选用权威、实用的计算器教材,为学生提供系统的学习材料。

2.参考书:提供相关的计算器参考书籍,丰富学生的知识储备。

3.多媒体资料:制作课件、视频等多媒体资料,生动展示计算器的使用和应用。

数据结构与算法课程设计--模拟简单计算器

数据结构与算法课程设计--模拟简单计算器

数据结构与算法课程设计--模拟简单计算器数据结构与算法课程设计模拟简单计算器在计算机科学领域中,数据结构和算法是非常重要的基础知识。

本次课程设计的目标是模拟一个简单计算器,通过这个实践项目,深入理解和应用数据结构与算法的相关知识。

首先,让我们来明确一下简单计算器需要实现的功能。

它应该能够进行基本的四则运算,即加法、减法、乘法和除法。

同时,还需要支持输入多个操作数和运算符,能够按照正确的运算顺序进行计算。

为了实现这个简单计算器,我们需要选择合适的数据结构来存储输入的操作数和运算符。

考虑到操作的顺序性和灵活性,栈这种数据结构是一个不错的选择。

栈具有先进后出的特点,可以方便地处理运算的优先级。

接下来,我们开始设计算法。

当用户输入一个表达式时,程序需要对其进行解析。

首先,将表达式中的数字和运算符分别提取出来,并按照顺序存储在相应的栈中。

在计算过程中,从运算符栈中取出运算符,从操作数栈中取出相应的操作数进行计算,将结果重新压入操作数栈中。

在具体的实现过程中,我们需要处理一些特殊情况。

例如,除数不能为零的情况。

当遇到除法运算且除数为零时,程序应该给出相应的错误提示。

另外,对于表达式的合法性也需要进行检查。

比如,输入的表达式是否符合基本的数学运算规则,是否存在多余的字符或不匹配的括号等。

如果表达式不合法,程序也需要给出明确的提示信息,以便用户能够及时修正。

为了提高程序的可读性和可维护性,我们采用模块化的编程思想。

将表达式解析、运算处理、错误检查等功能分别封装成独立的函数,这样在后续的调试和优化过程中会更加方便。

```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`,用于存储操作数和运算符。

数据结构课程设计-特殊矩阵计算器

数据结构课程设计-特殊矩阵计算器

数据结构课程设计-特殊矩阵计算器-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。

② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。

③各运算若可行,则打印结果;若不可行,则给出提示信息。

④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。

涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。

#include<>#include<>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵 //void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);[i][j]=[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);[i][j]=[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);[i][j]=[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n);[0]=0;for(i=1;i<=n;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);[i][j]=[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;[0]=0;[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);[i][j]=[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j]+[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j][i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C){int i,j,k;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=0;for(i=0;i<;i++) //A的行数for(j=0;j<;j++) //A的列数和B的行数for(k=0;k<;k++) //B的列数[i][j]+=[i][k]*[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)[i][j]= [i][j];else if(j==n+i)[i][j]=;else[i][j]=;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p= [i][k]/ [i][i];for(j=0;j<(n *2);j++){q= [i][j]*p;[i][j]= [i][j]-q;}}}}for(i=0;i<n ;i++){p=[i][i];for(j=0;j<n*2;j++)[i][j]=[i][j]/p;float y=;for(i=0;i<n;i++)y=y*[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)[i][j]=[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;=;=;for(i=0;i<;i++)for(j=0;j<;j++)[j][i]=[i][j];}//矩阵行列式的值void Determinant(Matrix A) {int count[100];int sum=0;int n;n=; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= [k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= [k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = [k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= [k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<;i++){for(j=0;j<;j++)printf(" %d ",[i][j]);printf("\n");}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);if(x==3){CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}if(x==2){CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。

数据结构课程设计计算器

数据结构课程设计计算器

数据结构课程设计 计算器一、课程目标知识目标: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()函数里调用输入函数。

数据结构课程设计报告(二)表达式求值(计算器).doc

数据结构课程设计报告(二)表达式求值(计算器).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. 基本要求一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式。

(2)输出多项式,输出形式为整数序列:n, c1, e1, c2, e2, ········,c n, e n ,其中n 是多项式的项数,c i,e i分别是第i项的系数和指数,序列按指数降序排列。

(3)多项式a和b想加,建立多项式a+b 。

(4)多项式a和b想减,建立多项式a-b 。

3. 测试数据(1) (2x++(7-5x8+11x9)=+11x9+2x+7)(2) (6x-3-x+ (3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)(4) (x+x3)+(-x-x3)=0(5) (x+x100)+(x100+x200)=(x+2x100+x200)(6) (x+x2+x3)+0=(x+x2+x3)(7) 互换测试数据的前后两个多项式。

4. 实现提示用带表头结点的单链表存储多项式。

二、概要设计为实现上述程序功能,应用带头结点的单链表存储多项式。

为此需要一个抽象数据类型:一元多项式。

1.抽象数据类型一元多项式定义为:ATD Ploynomial{数据对象:D={ai|ai∈Termset, i=1,2,3···,m,m≥0 Termset中的每个元素包含一个表示系数的实数和表示指数的整数}数据关系:R1={<ai-1,ai>ai-1,ai∈D,且ai-1中的指数<ai中的指数的值,i=1,2,3···n}基本操作:Insert(p,h)初始条件:h已存在。

操作结果:插入p项。

CreateLinklist(head, m)操作结果:建立一个头指针为head、项数为m的一元多项式。

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

数据结构课程设计报告实验一:计算器设计要求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<<"输入错误:运算符号右边缺少运算数"<<e ndl;return false ;}if ((*it== '*' ||*it== '/' )&&it==from.begin())coutvv"输入错误:运算符号左边缺少运算数"<<e ndl;return false ;}if ((it+1)!=from.end()&&(*(it+1)== '+' ||*(it+1)== '-' ||*(it+1)== '*' ||*(it+1)== '/'{||*(it+1)== '%')){coutvv"输入错误:运算符号连续岀现"<<e ndl;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()){coutvv"输入错误:表达式以左括号结尾"<<e ndl;return false ;}//若以+或者-开头,则按照正负号看待,向目标表达式中加入一个0if (*(it+1)== '-' ||*(it+1)== '+'){to=to+ 'O';}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«"输入错误:左括号左边不能为运算数或右括号"<<e ndl;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)!=')'){coutvv"输入错误:右括号右边不能为运算数"<<e ndl; |return false ;}____________ Iif (it匸from.begin()&&(*(it-1)== '+' ||*(it-1)== '-' ||*(it-1)== '*' ||*(it-1)== '/' ||*(it- 1)=='%')){coutvv"输入错误:右括号左边不能为运算符号"<<endl;return false ;}to=to+ "";if (sym.empty()){coutvv"输入错误:表达式以右括号开始"<<e ndl;return false ;}tem=sym.top();while (tem!='('){to=to+tem+ "";sym.pop(); |if (sym.empty()){coutvv"输入错误:括号匹配有误"<<endl; return false ;}tem=sym.top();}sym.pop();break;}B .计算后缀表达式的主要思想:逐个字符的扫描后缀表达式,遇到单个数字或小数点时则先将其将其存到一个字符串中,当遇到后缀表达式中的分隔符(这里使用空格)时,则将这个字符串转化为数字放到堆栈n umstack 中;case '1' : case '2' : case 3 : case'4' : case '5' : case '6' : case '7' : case '8' : case'9' : case '0' : case '.':{n umtemp+=*it;break;}case '':{if (numtemp!=""){if (numtemp.find( '.' )&&numtemp.find( '.' ,(numtemp.find( '.' )+1))!= string ::npos){cout«"输入错误:小数点数目超岀:"+n umtempvve ndl;return false ;}strm.str( numtemp); strm»d;n umstack.push(d); numtemp="; strm.str(""); strm.clear();break;}break;}2. 遇到操作符+, -, *, /, %时,将堆栈numstack中的栈顶的两个数取出来,进行相应操作的运算,并将结果加入到堆栈n umstack 中;case '+':{d2=n umstack.top();n umstack.pop();d1= numstack.top();n umstack.pop();n umstack.push(d1+d2);break;d2=n umstack.top();n umstack.pop();d1= numstack.top();n umstack.pop();n umstack.push(d1-d2); break;}'*' :{d2=n umstack.top();n umstack.pop();d1= numstack.top();n umstack.pop();n umstack.push(d1*d2);break;case 7'{d2=n umstack.top();n umstack.pop();if (fabs(d2)<0.0000001)}{cout«"输入错误:除数不能为0"<<e ndl; return false ;}d1= numstack.top();n umstack.pop();n umstack.push(d1/d2);break;d2=n umstack.top();n umstack.pop();d1= numstack.top();n umstack.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、测试结果分析:测试结果见本篇开始的实际输入输出结果。

相关文档
最新文档