C语言上机实验报告书 表达式求值实验报告
(完整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语言实验报告
数据结构实验实验项目三栈和队列的应用计算机科学与技术系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
实验目的: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语言程序设计实验第一次上机实验报告
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语言程序设计实验报告实验数据类型运算符和表达式
(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语言上机实验报告
学号
班级
姓名
上机日期
实验题目
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);
C语言程序设计上机实验报告(精选5篇)
C语言程序设计上机实验报告(精选5篇)第一篇:C语言程序设计上机实验报告黔南民族师范学院 C语言程序设计上机实验报告系部:计算机科学系年级:2013 级班级:姓名:学号:实验时间:实验成绩:2013年月日实验三顺序结构程序的设计一实验名称:顺序结构程序的设计二.实验环境:windows XP系统,VC++6.0软件三.实验目的:四.实验内容:五.算法描述流程图六.源程序七.测试数据及运行结果八.实验心得实验成绩评分要求1、原创性发现抄袭或雷同成绩为0分2、正确性程序正确60分3、可读性格式清楚,有注释,变量命名规范20分4、健壮性对特殊测试数据有考虑有测试10分5、效率程序运行效率高10分第二篇:《c语言程序设计》上机实验报告要求《c语言程序设计》上机实验报告要求1.实验环境:软件系统:使用的软件环境硬件系统:机型说明2.实验目的:掌握如何编辑、编译、链接调试运行c程序3.实验内容:(1)掌握顺序结构程序设计.P26 ,p49,p62 3.2~3.7(2)掌握选择结构程序设计(if 和switch语句的用法)p4.2~(3)循环结构程序设计(while, dowhile,for语句的用法)。
(4)掌握数组的定义、输入和输出的方法,字符数组、字符串函数的使用。
(5)了解函数的定义,熟悉函数实参与形参的“值传递”方式,掌握函数的嵌套调用和递归调用方法。
(6)熟悉指针含义及其使用。
(7)熟悉结构体和共用体的使用。
(8)熟悉文件的使用。
4.实验要求:(1)输入编写的源程序,检查程序有无错误(语法和逻辑错误),有则改之。
(2)编译和连接,仔细分析编译信息,如有错误应找出原因并改正。
(3)运行程序,输入数据,分析结果。
5.实验结果:输出程序清单和运行结果。
(要求把原题内容,调试好的程序和其结果一并打印),6.实验体会分析运行结果,本次调试程序取得的经验(遇到的问题,解决的方法等)。
第三篇:C程序设计上机实验报告10C程序设计实验报告实验名称:指针与数组学时安排:2课时实验类别:上机操作型实验要求:1人1组 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目的1.理解指针、地址和数组间的关系;2.掌握通过指针操作数组元素的方法;3.掌握数组名作为参数的编程方式。
C语言运算符和表达式-实验报告
中山大学南方学院电子通信与软件工程系课程名称:高级语言程序设计实践实验题目:运算符和表达式附:实验报告专业:年级:完成日期:学号:姓名:成绩:一、实验目的1、能够使用C语言进行简单的算术运算、关系运算和逻辑运算。
2、掌握不同的类型数据之间赋值的规律。
3、进一步熟悉C语言程序的编辑、编译和运行的过程。
二、实验原理1、用int定义整型变量来存放整数;2、用float定义浮点数变量来存放小数;3、使用scanf() 函数从键盘输入两个整型数据,并赋值给两个变量。
三、实验过程1、算术运算实验代码如下:#include <stdio.h>#include <stdlib.h>int main(){int a=2, b=3;float x=3. 9, y=2. 3;float result;result=(float) (a+b) /2+(int) x%(int) y;return result}输出结果如图:2、算术运算实验代码如下:#include <stdio.h>#include <stdlib.h>int main(){int number;int a1, a2, a3;printf("请输入一个三位数:");scanf("%d", &number) ;a1=number%10;number=number/10;a2=number%10;a3=number/10;printf("三位数%d的个位数字是%d,十位数字是%d,百位数字是%d\n",number,a1, a2, a3) ;return 0;}输出结果如图:3、关系运算与逻辑运算实验代码如下:#include <stdio.h>#include <stdlib.h>int main(){int x;printf("输入x的值:") ;scanf("%d", &x) ;printf("表达式(x>0)的值:%d\n", x>0) ;printf("表达式(x>=-20&&x<=-10)的值:%d\n", x>=-20&&x<=-10) ;printf("表达式(x>=100||x<10)的值:%d\n", x>=-20&&x<=-10) ;printf("表达式(x>20&&x%3==0的值:%d\n", x>20&&x%3==0) ;if(x%5==0&&x%3==0)printf("yes\n") ;elseprintf ("no\n") ;return 0;}输出结果如图:4、综合任务实验代码如下:#include <stdio.h>#include <stdlib.h>int main(){int grad1, grad2;scanf("%d%d", &grad1, &grad2) ;printf("表达式(grad1>=0&&grad1<=100)值:%d\n",grad1>=0&&grad1<=100);printf("表达式(grad2>=0&&grad2<=100)值:%d\n",grad2>=0&&grad2<=100);printf("%d", grad1>grad2? grad1:grad2) ;return 0;}输出结果如图:四、思考并回答以下问题1、举例说明逻辑运算符的短路特性。
程序设计实训报告—表达式求值问题
程序设计实训报告—表达式求值问题完成者:何炜班级:计科1501学号:完成日期:2016年7月14日星期四目录一、题目的内容及要求................................. 错误!未定义书签。
二、需求分析 ................................................ 错误!未定义书签。
三、概要设计 ................................................ 错误!未定义书签。
四、详细设计 ................................................ 错误!未定义书签。
五、源代码 .................................................... 错误!未定义书签。
六、运行结果及分析..................................... 错误!未定义书签。
七、收获及体会............................................. 错误!未定义书签。
一、题目的内容及要求求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。
这种表达式只包括加、减、乘、除4种运算符。
为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。
用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式二、需求分析本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。
不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。
三、概要设计1.用户输入中缀表达式2.程序将中缀表达式用二叉树的链式存储结构存储下来3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内,并输出后缀表达式5.对后缀表达式进行求值四、详细设计以下对概要设计进行详细的原理分析。
实验报告二--表达式求值
实验报告二表达式求值一、问题描述1.实验题目:表达式求值2.基本要求:输入一个算术表达式,输出其值。
3.测试数据:表达式为:1.5+(2-3)*2# (#表示结束)运行结果应为:-0.500000二、需求分析1. 本程序用来求任意一个由浮点型数据和加减乘除四则运算构成的简单算术表达式的值。
2. 用户根据程序运行后的提示信息输入算术表达式,运算符仅限+-*/,操作数仅限浮点数,表达式以#结尾表示结束。
3. 用户输入完毕后,程序自动输出运算结果。
三、设计核心算法:采用算符优先算法,使用两个工作栈,一个称为OPTR,用来存放运算符;另一个称为OPND,用来寄放操作数或运算结果。
算法的基本思想是:(1)首先置操作数为空栈,表达式起始符"#"为运算符栈的栈底元素;(2)依次读入表达式中的每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶元素比较优先权后作相应操作,直至整个表达式求值完毕(输入为"#").四、测试结果五、附录//表达式求值#include <stdio.h>#include <stdlib.h>#include <string.h>#define error 0#define ok 1#define overflow -1#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OPSETSIZE 7char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'}; unsigned char Prior[7][7] = { // 算符间的优先关系'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};typedef int Status;template <typename T>struct SqStack{T *top;T *base;int stacksize;};//顺序栈结构模板template <typename T1,typename T2>Status InitStack(T1 &S){S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));if(!S.base) exit (overflow);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return ok;}//初始化栈函数模板template <typename T1,typename T2>Status Push(T1 &S,T2 e){if(S.top-S.base>=S.stacksize){S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));if(!S.base) exit (overflow);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return ok;}//入栈函数模板template <typename T1,typename T2>Status Pop(T1 &S,T2 &e){if(S.top==S.base) return error;e=*--S.top;return ok;}//出栈函数模板template <typename T1,typename T2>T2 GetTop(T1 S){if(S.top==S.base)return error;elsereturn *(S.top-1);}//获取栈顶元素模板Status In(char Test,char* TestOp) {bool Find=false;for (int i=0; i< OPSETSIZE; i++) {if (Test == TestOp[i]) Find= true;}return Find;}//判断是否为运算符float Operate(float a,unsigned char theta, float b) {switch(theta) {case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;default : return 0;}}//运算int ReturnOpOrd(char op,char* TestOp) {int i;for(i=0; i< OPSETSIZE; i++) {if (op == TestOp[i]) return i;}return 0;}char precede(char Aop, char Bop) {return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}//ReturnOpOrd和precede组合,判断运算符优先级float EvaluateExpression() {// 算术表达式求值的算符优先算法。
表达式求值 实验报告
表达式求值实验报告表达式求值实验报告一、引言表达式求值是计算机科学中一个重要的概念,它涉及到对数学表达式的计算和求解。
在本次实验中,我们将探讨表达式求值的相关算法和实现方法,并通过编程实现一个简单的表达式求值器。
二、算法原理1. 表达式的表示方法在计算机中,我们通常使用字符串来表示表达式。
例如,一个简单的数学表达式"2 + 3 * 4"可以表示为字符串"2+3*4"。
在实现表达式求值的算法时,我们需要将字符串中的数字和运算符进行分离,以便进行后续的计算。
2. 中缀表达式转后缀表达式为了方便计算,我们通常将中缀表达式转换为后缀表达式。
后缀表达式也称为逆波兰表达式,它的特点是运算符位于操作数的后面。
例如,上述的中缀表达式"2+3*4"可以转换为后缀表达式"234*+"。
转换的方法可以通过使用栈来实现。
3. 后缀表达式求值得到后缀表达式后,我们可以通过扫描表达式并使用栈来求解。
当遇到操作数时,将其压入栈中;当遇到运算符时,从栈中弹出相应数量的操作数进行计算,并将结果压入栈中。
最终,栈中的唯一元素即为表达式的求值结果。
三、实验过程1. 数据结构设计为了实现表达式求值器,我们需要设计相应的数据结构。
在本次实验中,我们选择使用栈来存储操作数和运算符。
2. 中缀表达式转后缀表达式首先,我们需要编写一个函数来将中缀表达式转换为后缀表达式。
该函数的实现可以通过使用栈和遍历字符串来实现。
具体的步骤如下:- 创建一个空栈和一个空字符串用于存储后缀表达式。
- 从左到右遍历中缀表达式的每个字符。
- 如果遇到操作数,直接将其添加到后缀表达式字符串中。
- 如果遇到运算符,将其与栈顶的运算符进行比较:- 如果栈为空或栈顶为左括号"(",则直接将运算符入栈。
- 如果栈顶的运算符优先级低于当前运算符,则将当前运算符入栈。
- 如果栈顶的运算符优先级高于或等于当前运算符,则将栈顶的运算符弹出并添加到后缀表达式字符串中,直到栈顶的运算符优先级低于当前运算符或栈为空。
数据结构表达式求值实验报告
数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。
具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理表达式求值是程序设计中的一个常见问题,通常采用栈这种数据结构来实现。
表达式可以分为中缀表达式、后缀表达式和前缀表达式。
中缀表达式是我们日常使用的表达式形式,如“2 +3 4”,但直接对中缀表达式求值比较复杂。
而后缀表达式(如“2 3 4 +”)和前缀表达式(如“+2 3 4”)求值相对简单。
因此,在实现表达式求值时,通常先将中缀表达式转换为后缀表达式,然后对后缀表达式进行求值。
转换过程中,使用两个栈,一个用于存储操作数,另一个用于存储运算符。
求值过程中,根据后缀表达式的特点,从左到右依次处理操作数和运算符,进行相应的计算。
四、实验步骤1、定义数据结构定义栈类,用于存储操作数和运算符。
定义一个结构体来表示操作数和运算符。
2、中缀表达式转后缀表达式从左到右扫描中缀表达式。
遇到操作数,直接输出。
遇到运算符,根据其优先级与栈顶运算符的优先级进行比较,决定入栈或出栈操作。
3、后缀表达式求值从左到右扫描后缀表达式。
遇到操作数,入栈。
遇到运算符,从栈中取出两个操作数进行计算,将结果入栈。
4、主函数输入中缀表达式。
调用转换函数和求值函数,输出计算结果。
五、实验代码```cppinclude <iostream>include <stack>include <string>//定义操作符的优先级int priority(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 =='('){} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();//弹出'('} else {while (!opStackempty()&& priority(opStacktop())>=priority(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();}return postfix;}//后缀表达式求值int evaluatePostfix(std::string postfix) {std::stack<int> operandStack;for (char c : postfix) {if (isdigit(c)){operandStackpush(c '0');} else {int operand2 = operandStacktop();operandStackpop();int operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':operandStackpush(operand1 / operand2);break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入中缀表达式: ";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);int result = evaluatePostfix(postfixExpression);std::cout <<"表达式的计算结果为: "<< result << std::endl;return 0;}```六、实验结果输入不同的中缀表达式,如“2 +3 4”“( 2 + 3 )4”等,程序能够正确地将其转换为后缀表达式,并计算出结果。
集中上机———C语言程序设计的实验报告
成绩: 实验名称:集中上机———C语言程序设计学生姓名:学生学号:学生专业:学生班级:指导老师:实验时间:实验名称: c语言运行过程、简单c程序设计一、实验目的熟悉编程环境、运行简单的c程序。
掌握基本数据类型及它们的使用方法和定义方式。
熟练掌握赋值运算的使用。
二、实验内容练习一求三个数中的最大者#include<stdio.h>void main(){int a,b,c,max;printf("Input three numbers:");scanf("%d%d%d",&a,&b,&c);if(a>b){ max=a;if(a>c)max=a;elsemax=c;}else{if(b>c)max=b;elsemax=c;}printf("max=%d\n",max);}三、实验结果Input three numbers:10 20 30max=30Press any key to continue四、问题讨论C语言中通过函数是进行的值传递实验名称: 数据类型、运算符和表达式一、实验目的进一步熟悉c程序的编辑、编译、连接和运算。
掌握数据类型、定义变量和对他们赋值的方法,了解数据输出时的格式转换符,会使用有关算术运算符,特别是(++)和(--)的使用二、实验内容1.#include<stdio.h>void main(){char s[80],x;printf("input a characters:");gets(s);x=0;while(s[x]!='\0'){s[x]=(s[x]>='A'&&s[x]<='Z')?(s[x] +32):s[x];x++;}s[x]='\0';puts(s);}2#include<stdio.h>#include<math.h>void main(){ int m,i,j,count=0;for(m=101;m<1000;m++){for(i=2;i<sqrt(m);i++)if(m%i==0) break;if(i>=sqrt(m)){ printf("%d ",m);count=count+1;if(count%5==0)printf("\n");} }printf("count=%d",count);printf("\n");}3.#include<stdio.h>void main(){ int i,j,k,count=0;for(i=1;i<=4;i++)for(j=1;j<=4;j++)for(k=1;k<=4;k++)if(i!=j&&i!=k&&j!=k){ printf("%d ",i*100+j*10+k);count=count+1;}printf("\n");printf("count=%d\n",count);}三、实验结果练习1 结果input a characters:CYUYANcyuyanPress any key to continue练习2 结果101 103 107 109 113121 127 131 137 139149 151 157 163 167169 173 179 181 191193 197 199 211 223227 229 233 239 241251 257 263 269 271277 281 283 289 293307 311 313 317 331337 347 349 353 359361 367 373 379 383389 397 401 409 419421 431 433 439 443449 457 461 463 467479 487 491 499 503509 521 523 529 541547 557 563 569 571577 587 593 599 601607 613 617 619 631641 643 647 653 659661 673 677 683 691701 709 719 727 733739 743 751 757 761769 773 787 797 809811 821 823 827 829839 841 853 857 859863 877 881 883 887907 911 919 929 937941 947 953 961 967971 977 983 991 997count=150Press any key to continue练习3 结果123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432count=24Press any key to continue四、问题讨论++i是先自加在算i,二i++是先运算i在加。
数据类型、运算符和表达式(C语言实验报告)
仲恺农业工程学院实验报告纸信息学院(院、系)专业班C语言程序设计课实验目的:(1)掌握C语言数据类型,熟悉基本类型变量的定义、赋值和运算。
(2)熟悉C程序的编辑、编译、链接和运行过程。
实验内容与总结:1、运行下面程序,分析实验结果。
#include <stdio.h>void main(){float x=2.5,y=4.7;int a=7,b;float result;result=x+a%3*(int)(x+y)%2/4; /*赋值语句1*/printf("result1=%f\n",result);a=2;b=3;x=3.5;y=2.5;result=(float)(a+b)/2+(int)x%(int)y; /*赋值语句2*/printf("result2=%f\n",result);}分析:(1)、result=x+a%3*(int)(x+y)%2/4;语句求值过程分析如下:a%3=1;(int)(x+y)=7;result=x+a%3*(int)(x+y)%2/4=2.5+1*7%2/4=2.5+1/4=2.500000因为float result,所以输出结果有六位小数。
(2)、result=(float)(a+b)/2+(int)x%(int)y; 语句求值过程分析如下:(float)(a+b)/2=(2+3)/2=2.500000;(int)x%(int)y=3%2=1,所以result=3.500000.(3)、该实验中表达式求值所用到的知识点包括:①单精度浮点型变量float,有效数学为6~7位;②基本整型int;③程序内printf函数中的“%f”是输出浮点数时指定的格式符,作用是指定该实数以小数形式输出;④取商符号“/”,取余符号“%”;⑤转义字符\n,作用是换行,将当前位置移到下一行开头。
2、译码:教材P67-3.7程序:#include<stdio.h>void main(){char c1='C',c2='h',c3='i',c4='n',c5='a';c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf("Password is %c%c%c%c%c\n",c1,c2,c3,c4,c5);}(1)、程序编制要点:①指定字符变量,初值分别’C’,’h’,’i’,’n’,’a’;②经过运算,使C变为G,h变为l,i变为m,n变为r,a变为e;③输出结果:China 译成Glmre。
C语言_算数表达式求值_课程设计报告
特点:本程序能进行小数、以及2进制、8进制、16进制的运算。
不足:结果都以10进制形式表示,用户不能改变;结果的10进制形式不能超
出longdouble型数据能存储的数的范围;
进一步的设想:将数分段存储,内存动态分配,使其能进行天文数字运算;录入其他的运算符例如指数运算,开方运算,取余运算,解一元一次方程,解二元一次方程组。
三 详细设计
我任务是整个程序的算法设计, 以及部分子函数的编写, 经过其他组员编写的子函数的处理, 将表达式变为一个普通的表达式, 其中数与运算符已经分开,将这个表达式的头指针传递到我所编写函数
中,运算思想为:找到最内层的一对括号, 计算括号间的表达式的值,得到值之后,用这个值替换掉原始位置上的一对括号, 以及其中的表达式。例如(((6.5-2*2.25)*2-6)/2+1.5)+3#,第一次替换后为((2*2-6)/2+1.5)+3#,第二次替换后为(-2/2+1.5)+3#,第三次替换后为0.5+3#,当没有括号时调用四则运算函数直接计算。
Node *node,*head;
Node_ys_char *node_char;
switch(m)
{
case 2:
JiWei=2;
max=50;
break;
case 8:
JiWei=8;
max=56;
break;
case 10:
JiWei=10;
max=97;
break;
case 16:
JiWei=16;
p->c='+';
C语言实验报告
C语言上机实验报告姓名:学号:班级:专业:一、实验内容1、编写一个C程序,输入a、b、c三个数,输出其中的最大值。
2、从终端输入一个字符串,以回车换行为结束。
对其中的字母处理:如果字母是小写字母则转换成大写,其余的保持不变,处理完后输出。
3、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?请输出满足条件的每一个这样的三位数。
4、求S=a+aa+aaa+aaaa+aa……a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
请由键盘输入a和个数的值后输出s的值。
5、用递归方法编程实现:1!+2!+···+20!的和。
6、已有一个已拍好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
7、打印一下的杨辉三角(要求打印出10行)。
11 11 2 1.1 3 3 11 4 6 4 11 5 10 10 5 1二、实验结果1、#include<stdio.h>void main(){int a,b,c,temp,max;printf("input three numbers:");scanf("%d%d%d",&a,&b,&c);if(a>b)temp=a;elsetemp=b;if(temp>c)max=temp;elsemax=c;printf("%d\n",max);}2、#include<stdio.h>void main(){char s[80];int x;printf("input a characters:");gets(s);x=0;while(s[x]!='\0'){s[x]=(s[x]>='a'&&s[x]<='z')?(s[x]-32):s[x];x++;}s[x]='\0';puts(s);}3、#include<stdio.h>void main(){int i,j,k;for(i=1;i<=4;i++){for(j=1;j<=4;j++)for(k=1;k<=4;k++){if(i!=j&&j!=k&&k!=i)printf("%d%d%d ",i,j,k);}printf("\n");}}4、#include<stdio.h>void main(){int a,n,i;long int s;printf("请输入a与个数");scanf("%d%d",&a,&n);for(i=1,s=0;i<=n;i++){s+=a;a=a*10+a;}printf("s=%ld\n",s);}5、#include<stdio.h>void main(){double jiecheng(int x);int i,n=20;double sum=0;for(i=1;i<=n;i++){sum+=jiecheng(i);}3printf("the sum is %lf\n",sum);}double jiecheng(int x){double y;if(x==1)y=1;elsey=x*jiecheng(x-1);return(y);}6、#include<stdio.h>#define N 10void main(){int a[N+1],n,i,j=0;printf("请对数组赋值:");for(i=0;i<N;i++)scanf("%d",&a[i]);printf("请输入一个所需要插入的数:");scanf("%d",&n);printf("你将数插入在第几个数后面?");scanf("%d",&j);for(i=N;i>j;i--)a[i]=a[i-1];a[j]=n;for(i=0;i<=N;i++)printf("%d ",a[i]);printf("\n");}7、#include<stdio.h>#define N 11void main(){int i,j,a[N][N];for(i=1;i<N;i++){a[i][1]=1;a[i][i]=1;}for(i=3;i<N;i++)for(j=2;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=1;i<N;i++){for(j=1;j<=i;j++)printf("%6d",a[i][j]);printf("\n");}printf("\n");}三、实验心得通过对C语言上机实验课的学习,我学会了很多实用的操作技巧,充分认识到了理论和实际存在相当大的差距。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 '=': //脱括号并接收下一字符