C语言上机实验报告书 表达式求值实验报告

合集下载

(完整word版)数据结构表达式求值实验报告

(完整word版)数据结构表达式求值实验报告

《数据结构》课程设计报告书题目: 表达式求值系别:计算机科学与信息系学号:学生姓名:指导教师:完成日期:目录➢1.前言➢2.概要设计2。

1 数据结构设计2.2 算法设计2.3 ADT描述2。

4 功能模块分析➢3。

详细设计3.1 数据存储结构设计3.2主要算法流程图(或算法代码)➢4.软件测试➢5。

总结➢附录1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行.因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符.栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

2.2 算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。

1。

首先置操作数栈为空栈,表达式起始符”#"为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为"#")。

实验三算法表达式C语言实验报告

实验三算法表达式C语言实验报告

数据结构实验实验项目三栈和队列的应用计算机科学与技术系0902班组长:雷耀阳组员:柴瑞东、李志鹏、张玲春日期:实验报告实验类型__综合设计__实验室软件实验室1 1.实验题目求一个数学表达式的值:用户输入一个包含正整数、括号和四则运算符(“+”、“—”、“*”、“/”)的算术表达式,计算其结果。

2.需求分析首先置操作数栈为空栈,表达式起始符“#”为运算符栈底元素;依次读入表达式中每个字符,若是操数则进操作数栈,若是操作符则和操作符栈顶的运算符进行比较优先权后作相应的操作,直到整个表达式求值完毕(即操作符栈顶元素和当前读入的字符均为“#”)3.概要设计结点结构类型描述如下typedef struct{char *base,*top;int stacksize;}sqstack;函数关系:4.详细设计实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。

对主程序和其他模块也都需要写出伪码算法。

#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <process.h>#include <string.h>#define N 100double numStack[N]={0};int numTop;char opStack[N];int opTop;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;int Flag=0;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')if(Flag==0)num=num*10+str[i]-'0';else{num+=(str[i]-'0')/(j*10.0);j*=10;}elseif(str[i]=='.')Flag=1;elseif( 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;num=0; j=1; Flag=0; k=1;}if(opTop==0||str[i]=='(')opStack[opTop++]=str[i];elseif(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]); 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]);numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void face(){system("cls");printf("__________________________________________________________________\n"); printf(" Save number(S) | Read number(R) | Clear(C) | Equal(E) | Quit(Q) \n"); printf("------------------------------------------------------------------\n"); }main(){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;face();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch=='.'||ch==')'||op(ch)||ch>='0'&&ch<='9')str[i++]=ch;str[i]='\0';face();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';}else j=0;}if(ch=='S'||ch=='s')if(strlen(num)){face();printf("%s has been saved\n",strcpy(save,num));printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}else{face();printf("there is no number to save!\n");printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}if(ch=='R'||ch=='r')if(strlen(save)){face();printf("input an expression,press key 'E' to compute\n"); printf("%s",strcat(str,save));i+=strlen(save);}if(ch=='C'||ch=='c')if(strlen(str))str[--i]='\0';face();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;}}else{face();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);printf("\nwrong expression!");}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{face();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}}ch=getch();}}#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <process.h>#include <string.h>#define N 100double numStack[N]={0};int numTop;char opStack[N];int opTop;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;int Flag=0;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')if(Flag==0)num=num*10+str[i]-'0';else{num+=(str[i]-'0')/(j*10.0);j*=10;}elseif(str[i]=='.')Flag=1;elseif( 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;num=0; j=1; Flag=0; k=1;}if(opTop==0||str[i]=='(')opStack[opTop++]=str[i];elseif(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]); 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]); numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void face(){system("cls");printf("__________________________________________________________________\n"); printf(" Save number(S) | Read number(R) | Clear(C) | Equal(E) | Quit(Q) \n"); printf("------------------------------------------------------------------\n"); }main(){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;face();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch=='.'||ch==')'||op(ch)||ch>='0'&&ch<='9'){str[i++]=ch;str[i]='\0';face();printf("%s",str);if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' ) {num[j++]=ch;num[j]='\0';}else j=0;}if(ch=='S'||ch=='s')if(strlen(num)){face();printf("%s has been saved\n",strcpy(save,num));printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}else{face();printf("there is no number to save!\n");printf("input an expression,press key 'E' to compute\n"); printf("%s",str);}if(ch=='R'||ch=='r')if(strlen(save)){face();printf("input an expression,press key 'E' to compute\n"); printf("%s",strcat(str,save));i+=strlen(save);}if(ch=='C'||ch=='c'){if(strlen(str))str[--i]='\0';face();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;}}else{face();printf("input an expression,press key 'E' to compute\n");printf("%s",str);printf("\nwrong expression!");}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{face();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}}ch=getch();}}5.调试分析1.实验过程中,发现错误后,经过看书,不断调试后,成功。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

实验报告课程名:数据结构(C语言版)实验名:表达式求值姓名:班级:学号:时间:2014.10.25一实验目的与要求1. 了解栈的应用2. 利用栈进行算术表达式求值二实验内容1.以字符串的形式给出一个算术表达式, 计算出该算术表达式的值。

2.表达式中可能出现”+”, ”−”, ”∗”, ”/”, ”(”, ”)”。

三实验结果与分析分析:r:读入字符t:栈顶字符r( ) # 低优先运算符高优先运算符( 入栈出栈错误入栈入栈) 错误错误错误错误错误t # 入栈错误结束入栈入栈低优先运算符入栈出栈+运算出栈+计算出栈+计算入栈高优先运算符入栈出栈+运算出栈+计算出栈+计算出栈+计算1, 入栈2, 错误3, 出栈4, 出栈+计算5, 结束( ) # 低优先运算符高优先运算符( 1 3 2 1 1) 2 2 2 2 2# 1 2 5 1 1低优先运算符 1 4 4 4 1高优先运算符 1 4 4 4 4此实验可用两个栈和数组来实现,一个操作栈,一个数字栈,两个栈的字符进行优先权比较可得到5种结果。

首先置操作栈为空栈,表达式起始符“#”作为数字栈的栈底元素,依次读入表达式的每个字符,若是操作字符进操作栈,若是数字进数字栈,操作栈和数字栈的栈顶元素比较优先权后进行相应操作,直至结束,最后输出值即可。

实验程序:#include<stdio.h>#include<stdlib.h>#include<string.h>int change(char c)//字符转换{int j=-1;switch(c){case '(':j=0;break;case ')':j=1;break;case '#':j=2;break;case '+':j=3;break;case '-':j=3;break;case '*':j=4;break;case '/':j=4;break;}return(j);}int compu(int x,int y,char c)//数字计算转换{int j=-1;switch(c){case '+':j=x+y;break;case '-':j=x-y;break;case '*':j=x*y;break;case '/':j=x/y;break;}return(j);}void get(char a[],int num_op,int method[5][5]){int a_length=strlen(a)+1;//表达式的长度int p=0,num_p=0,op_p=0;int *num_s=(int *)malloc((a_length)*sizeof(int));// char *op_s=(char *)malloc((a_length)*sizeof(int));// op_s[op_p]='#';op_p++;//进字符栈int k=-1;//输出结果判断int ox,oy;while(1){char c=a[p];//将表达式中的字符一个一个赋值给cif(c>='0'&&c<='9')//判断是不是数字{num_s[num_p]=c-48;//将Ascll码转换成对应数字num_p++;//进数字栈p++;//代表表达式的位置开始为0指向第一位}else{int t=method[change(op_s[op_p-1])][change(c)];//将5种操作的一种传给tswitch(t){case 1:op_s[op_p]=c;op_p++;p++;break;case 2:k=0;break;case 3:op_p--;p++;break;case 4:ox=num_s[num_p-2];oy=num_s[num_p-1];num_p=num_p-2;num_s[num_p]=compu(ox,oy,op_s[op_p-1]);//将计算的值存入num_s[]num_p++;//入数字栈op_p--;break;case 5:k=1;break;}}if(k>=0)//跳出循环{break;}}switch(k)//0错误,1输出结果{case 0:printf("表达式错误!");break;case 1:printf("%s=%d\n",a,num_s[num_p-1]);break;}}int main(int argc,char *argv[]){ char a[20];puts("请输入个位数的表达式:");gets(a);int num_op=5;//表示操作的种数int method[5][5]={{1,3,2,1,1},{2,2,2,2,2},{1,2,5,1,1},{1,4,4,4,1},{1,4,4,4,4}};//1表示入栈,2表示错误,//3表示出栈,4表示出栈+计算,//5表示结束get(a,num_op,method);return 0;}图1.表达式求值运行结果。

C语言上机实验报告1

C语言上机实验报告1

C语言上机实验报告1
实验目的:1、初步知道什么是C语言
2、了解C语言的特点
3、会上机运行简单的C程序
4、了解怎样从程序得到运算结果
实验器材:电脑、C程序设计课本
实验内容:1、在屏幕上输出以下一行信息。

This is a C program.
2、求两个整数之和。

3、求两个整数中的较大者。

实验步骤及结果:
实验结果分析及结论:
对于实验一利用printf函数输出了题目中要求的信息This is a C program.
对于实验二我们定义了a,b来存放两个整数,定义了sum来存放和数。

用赋值运算符“=”把相加的结果传送给sum,最后输出sum就得到两数之和。

所以123和456的和为579。

对于实验三我们调用max函数来得出两数中的较大者。

所以输入8和5运行得较大者为8.实验心得体会和建议:
1、#include<stdio.h>是编译预处理指令。

2、int表示此函数的类型是整型。

3、main是函数的名字,表示“主函数”。

每一个C语言程序都必须有一个main函数。

4、函数体由{}括起来。

5、\n是换行符。

6、每一个语句最后都有一个分号,表示语句结束。

7、程序右侧的//表示从此出道本行结束是“注释”。

8、return0表示函数执行完毕时返回函数值0.
实验评价及结论:
通过这次实验我初步知道了什么是C语言,了解了C语言的特点,会上机运行简单的C程序,知道了怎样从程序得到运算结果。

实验指导老师签字:年月日。

表达式求值实验报告

表达式求值实验报告

淮海工学院计算机工程学院课程设计报告设计名称:数据结构课程设计选题名称:表达式求值姓名:学号:专业班级:系(院):计算机工程学院设计时间:设计地点:软件工程实验室、教室指导教师评语:成绩:签名:年月日1.课程设计目的1、训练学生灵活使用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。

2.课程设计任务和要求:任务根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择使用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。

设计题目从任务书所列选题表中选取,每班每题不得超过2人。

学生自选课题学生原则上可以结合个人爱好自选课题,要求课题有一定的深度和难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。

学生自选课题需在18周前报课程设计指导教师批准方可生效。

要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。

前期准备工作完备和否直接影响到后序上机调试工作的效率。

在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。

2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。

3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。

C语言程序设计实验第一次上机实验报告

C语言程序设计实验第一次上机实验报告

2.第一次实验C语言程序设计实验报告专业运算机科学与技术班级信安1302班日期成绩实验组别第 1 次实验表达式和标准输入与输出实验指导教师周时阳学生姓名学号同组人姓名实验名称表达式和标准输入与输出实验实验目的1.熟练把握各类运算符的运算功能,操作数的类型,运算结果的类型及运算进程中的类型转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性。

2.把握getchar, putchar, scanf和printf等函数的用法。

3.把握简单的C程序(顺序结构程序)的编写方式。

4.完成教师布置的习题及课程设计上的题目。

实验内容(一)输出“王”字源程序如下:#include <>int main(){puts("*************");puts(" * ");puts(" * ");puts("*************");puts(" * ");puts(" * ");puts("*************");return 0;}实验步骤:步骤一:计算输出进程中应操纵的空格数,选择星号作为输出的标记。

步骤二:采纳puts函数实现对字符串的输出。

调试及编译进程:实验中显现的不足及修改:无。

调试:实现对王字的输出。

(二)编程将华氏温度转换为摄氏温度源程序如下:#include <>int main(){double x,y;printf("请输入华氏温度:");scanf("%lf",&x);y=(5*(x-32))/9;printf("%.2lf(F)=%.2lf(C)",x,y);return 0;}编辑步骤:步骤一:概念两个浮点型变量,别离用来寄放华氏温度和摄氏温度步骤二:用输入函数输入一个华氏温度值并存入命名为x的单元中。

C语言程序设计实验报告实验数据类型运算符和表达式

C语言程序设计实验报告实验数据类型运算符和表达式
二、实验内容:
(1)输人并运行下面的程序
#include<>
voidmain()
{
charc1,c2;
c1='a';
c2='b';
printf("%c%c\n",c1,c2);
}
(2)按习题的要求编程序并上机运行
该题的要求是:
要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。
65535,f=65580。
(4)输人习题
#include<>
voidmain()
{
inti,j,m,n;
i=8;
j=10;
m=++i;
n=j++;
printf("%d,%d,%d,%d\n",i,j,m,n);
}
①运行程序,注意i,j,m,n各变量的值。分别作以下改动并运行:
②将第6,7行改为:
m=i++;
例如,字母“A”后面第4个字母是“。
请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。
{
charc1='a',c2='b',c3='c',c4='\101',c5='\116';
printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);
printf("\t\b%c%c\n",c4,c5);

C语言上机实验报告

C语言上机实验报告
C语言程序设计上机报告
学号
班级
姓名
上机日期
实验题目
1、编写一个程序,输入一个圆半径,求该圆周长和面积
(1)、将圆周率PI定义为一个常量,值为3.14159
(2)、从键盘输入圆半径的值,并赋值给一个浮点型变量r
(3)、计算圆的周长L和面积S,并输出,要求取小数点后两位数字
(4)、分别输入以下三个半径测试:r=3.5,r=2.3,r=4
#define PI 3.14159
int main()
{
float r,L,S;
scanf("%f",&r);
L=2*PI*r;
S=PI*r*r;
printf("L=%.2f\nS=%.2f\n",L,S);
return 0;
}
#include<stdio.h>
#include<math.h>
void main()
2、编写程序求一元二次方程的根
实验目的
1、理解函数的概念;
2、掌握函数定义的方法;
3、理解函数参数与函数的值。
主要功能
1、实现求圆的周长和面积的功能2、实现求一元二 Nhomakorabea方程的根
函数说明
1、在主函数前定义常量
2、调用math数据库
3、使用根号函数sqrt和平方函数pow
实验结果
出现的问题及分析
1、double声明变量r,S,L,得出错误结果
{
int x1,x2;
float a,b,c,d;
scanf("%f%f%f",&a,&b,&c);
d=sqrt(pow(b,2)-4*a*c);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++;
if (In(*c, OPSET)){
Data=atof(TempData);//字符串转换函数(double)
OPND=Push(OPND, Data);
strcpy(TempData,"\0");
}
}
else{ //不是运算符则进栈
switch (precede(OPTR->c, *c)){
//设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
SC *OPTR=NULL; //运算符栈,字符元素
SF *OPND=NULL; //运算数栈,实数元素
char TempData[20];
float Data,a,b;
char theta,*c,x,Dr[]={'#','\0'};
/*'('*/'<','<','<','<','<','=',' ','<',
/*')'*/'>','>','>','>',' ','>','>','>',
/*'#'*/'<','<','<','<','<',' ','=','<',
/*'^'*/'>','>','>','>','<','>','>','>'
二.系统设计
1.栈的抽象数据类型定义:
ADT Stack{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}
约定an端为栈顶,ai端为栈底
基本操作:
Push(&S,e)
初始条件:栈S已存在
操作结果:插入元素e为新的栈顶元素
for (int i=0; i< OPSETSIZE; i++){
if (Test == TestOp[i]) Find= true;
}
return Find;
}
ReturnOpOrd(char op,char *TestOp){
for(int i=0; i< OPSETSIZE; i++)
if (op == TestOp[i]) return i;
a=OPND->f;OPND=Pop(OPND);
OPND=Push(OPND, Operate(a, theta, b));
break;
} //switch
}
} //while
return OPND->f;
} //EvaluateExpression
void main(){
char str1[128],s[128];
}
float Operate(float a,unsigned char theta, float b){ //计算函数Operate
switch(theta){
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
一.需求分析
设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。
(1)输入的形式:表达式,例如2*(3+4)
包含的运算符只能有'+'、'-'、'*'、'/'、'('、')';
(2)输出的形式:运算结果,例如2*(3+4)=14;
(3)程序所能达到的功能:对表达式求值并输出
};
typedef struct StackChar{
char c;
struct StackChar *next;
}SC; //StackChar类型的结点SC
typedef struct StackFloat{
float f;
struct StackFloat *next;
}SF; //StackFloat类型的结点SF
}
char precede(char Aop, char Bop){
return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}
float EvaluateExpression(char* MyExpression){
//算术表达式求值的算符优先算法
#include<string.h>
#include<math.h>
#define true 1
#define false 0
#define OPSETSIZE 8
typedef int Status;
unsigned char Prior[8][8] = { //运算符优先级表
// '+' '-' '*' '/' '(' ')' '#' '^'
p->f=f;
p->next=s;
return p;
}
SC *Pop(SC *s){ //SC类型的指针Pop
SC *q=s;
s=s->next;
free(q);
return s;
}
SF *Pop(SF *s){ //SF类型的指针Pop
SF *q=s;
s=s->next;
free(q);
return s;
ReturnOpOrd(op,*TestOp):若Test为运算符,则返回此运算符在数组中的下标
precede(Aop,Bop):根据运算符优先级表返回Aop与Bop之间的优先级
EvaluateExpression(*MyExpression):用算符优先法对算术表达式求值
三.调试分析
(1)刚开始只编写了一个Push和一个Pop函数,但因为在EvacuateExpression()里既有运算符入/出栈,又有运算数入/出栈,运行下来总是出错。所以就编写了两个不同的Push和Pop函数,分别使用。
/*'+'*/'>','>','<','<','<','>','>','<',
/*'-'*/'>','>','<','<','<','>','>','<',
/*'*'*/'>','>','>','>','<','>','>','<',
/*'/'*/'>','>','>','>','<','>','>','<',
case '^': return pow(a,b);
default : return 0;
}
}
char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#','^'};
Status In(char Test,char *TestOp){
int Find=false;
*Push(SC *s,char c):把字符压栈
*Push(SF *s,float f):把数值压栈
*Pop(SC *s):把字符退栈
*Pop(SF*s):把数值退栈
Operate(a,theta,b):根据theta对a和b进行'+'、'-'、'*'、'/'、'^'操作
In(Test,*TestOp):若Test为运算符则返回true,否则返回false
case '<': //栈顶元素优先级低
OPTR=Push(OPTR, *c);
c++;
break;
case '=': //脱括号并接收下一字符
相关文档
最新文档