数据结构课程设计姓名:杨颂敬班级:软件0901班学号:0930*******目录:1.需求分析 (1)2.概要设计 (1)3.详细设计................................. 3-6 4.调试分析................................. 6-8 5.用户使用说明 (8)6.测试结果 (9)7.附录 (9)利用栈求表达式的值,可供小学生作业,并能给出分数。
1.需求分析任务:通过此系统可以实现如下功能:此系统能够输入一个表达式,并计算该表达式的值。
可以根据计算结果给出分数。
能供小学生进行简单的四则运算,此外这里特别强调括号的匹配!要求:根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;2. 概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
主菜单3.详细设计#include "string.h"#include "stdio.h"#include"conio.h"#define maxsize 100#include "ctype.h"typedef char datatype;typedef struct{datatype stack[maxsize];int top;} seqstack;void stackinitiate(seqstack *s){s->top=0;}int stacknotempty(seqstack s){if(s.top<=0) return 0;else return 1;}int stackpush(seqstack *s, datatype x) {if(s->top>=maxsize){printf("堆栈已满无法插入!\n");return 0;}else{s->stack[s->top]=x;s->top++;return 1;}}int stackpop(seqstack *s,datatype *d) {if(s->top<=0){printf("堆栈已空无数据元素出栈!\n");return 0;}else{s->top--;*d=s->stack[s->top];return 1;}}int stacktop(seqstack s,datatype *d){if(s.top<=0){printf("堆栈已空!\n");return 0;}else{*d=s.stack[s.top-1];return 1;}}void expiscorrect(char exp[], int n){seqstack mystack;int i;char c;stackinitiate(&mystack);for(i=0;i<n;i++){if(exp[i]=='(')stackpush(&mystack, exp[i]);else if((exp[i]==')') && stacknotempty(mystack) && stacktop(mystack,&c) && c=='(') stackpop(&mystack,&c);else if((exp[i]==')') && !stacknotempty(mystack)){printf("右括号多余左括号!\n");return ;}}if(stacknotempty(mystack))printf("左括号多余右括号!\n");elseprintf("左右括号匹配正确!\n");}static float ans[50];static int count=0;static int right=0;static float yourresult[50];int postexp(char exp[]){seqstack mystack;datatype x1,x2;int i;int j=0,ls;int top=0;int isFalse=0;int isRead=0;char oprator = ' ';stackinitiate(&mystack);for(i=0;exp[i]!='#';i++){if(isdigit(exp[i])){top=(int)(exp[i]-48);top*=10;}else{if (isRead == 0){isRead++;top/=10;stackpush(&mystack,top);oprator = exp[i];top=0;}else if (isRead == 1){stackpush(&mystack,top);if (isRead == 1){isRead++;stackpop(&mystack,&x2);}stackpop(&mystack,&x1);ls=x1;x1=x2;x2=ls;x1/=10;switch(oprator){case '+': {x1+=x2;break;}case '-': {x1-=x2;break;}case '*': {x1*=x2;break;}case '/':{if(x2==0.0){printf("除数为0错!\n");isFalse=1;}else{x1/=x2;}};break;}oprator = exp[i];x2=x1;top=0;}}}if (isRead == 0){isRead++;top/=10;stackpush(&mystack,top);oprator = exp[i];top=0;}else if (isRead == 1){stackpush(&mystack,top);if (isRead == 1){isRead++;stackpop(&mystack,&x2);}stackpop(&mystack,&x1);ls=x1;x1=x2;x2=ls;x1/=10;switch(oprator){case '+': {x1+=x2;break;}case '-': {x1-=x2;break;}case '*': {x1*=x2;break;}case '/':{if(x2==0.0){printf("除数为0错!\n");isFalse=1;}else{x1/=x2;}};break;}oprator = exp[i];x2=x1;top=0;}if (isFalse == 1) return -1;ans[count] = x1;printf("请输入您计算的结果:");scanf("%f",&yourresult[count]);if(ans[count]==yourresult[count]) right++;count++;getchar();}int main(){int i=0;char exp[100];printf(" ------计算表达式------\n使用说明:\n");printf(" 1.请输入要计算的表达式,以#结尾,例如1+2#\n");printf(" 2.结束计算请输入符号$\n");printf(" 3.在表达式中可以运算括号,中括号[]和大括号{}统一使用小括号代替()!\n");printf(" 4.程序输入格式错误时,将会自动结束程序,请注意格式正确!\n");printf("请输入要计算的表达式,以#结尾。
结束程序输入$。
\n");// c=getchar();scanf("%s",exp);while(exp[i]!='$'){expiscorrect(&exp,i);postexp(&exp);printf("-------------------------------------------\n");printf("请输入下一个表达式,以#结尾。
结束程序输入$。
\n");scanf("%s",exp);// c=getchar();}printf("\n\n ******您的成绩单*******\n");printf("----------------------------------------\n");printf(" 序号正确答案您的答案结论\n");for(i=0;i<count;i++){printf("表达式%d %.2f %.2f %s\n",i+1,ans[i],yourresult[i],ans[i]==yourresult[i]?"正确!":"错误!");}printf("----------------------------------------\n");printf("解答题目总共为%d道,其中\n",count);printf("正确解答%d道题,错误解答%d道题。
\n *****最后得分为%d分!*****\n", right,count-right,right*100/count);printf("----------------------------------------\n");getchar();getchar();return 0;}4.调试分析5.用户使用说明运行程序,然后根据提示进行计算并给出分数,然后退出。