当前位置:文档之家› 利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

中北大学数据结构课程设计说明书2011年12月20日1. 设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。

为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。

整体设计都是以这个要求为轴心进行的。

为了直观和方便,现画出软件整体设计模块图。

整体设计模块图可以清晰的看出软件的几大模块。

整个系统的操作流程图可以看出操作的整体流程,如下图2.根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3. 功能模块详细设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。

3.1 详细设计思想学生要进行测试,首先要有试题。

那么我们就要先建立试题库。

这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.txt的文件中。

首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。

创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中。

3.2 核心代码(正文宋体小四号字,1.5倍行距)#include <stdio.h>#include <stdlib.h>#include <time.h>#include<string.h>#include <conio.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1//定义表达式typedef struct shiti{char a[20];long result;}xuanti;typedef struct SqStack1{ //建立数字栈int *base;int *top;int stacksize;}SqStack1;typedef struct SqStack2{//建立运算符栈char *base;char *top;int stacksize;}SqStack2;void WriteToFile(xuanti *pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item){//建立菜单printf(">>> 数学习题库<<<\n\n- %s -\n\n",menu_item);}void return_confirm(){printf("\n按任意键返回……\n");getch();}void IntInitStack(SqStack1 *S1){S1->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)) ;if(!S1->base)exit(ERROR);S1->top=S1->base;S1->stacksize=STACK_INIT_SIZE;}//IntInitStackvoid CharInitStack(SqStack2 *S2){S2->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char ));if(!S2->base)exit(ERROR);S2->top=S2->base;S2->stacksize=STACK_INIT_SIZE;}//CharInitStacklong IntGetTop(SqStack1 *S1){ //取栈顶元素long e1;if((*S1).top==(*S1).base)return 0;e1=*((*S1).top-1);return e1;}//IntGetTopchar CharGetTop(SqStack2 *S2){ //取栈顶元素char e2;if((*S2).top==(*S2).base) return 0;e2=*((*S2).top-1);return e2;}//IntGetTopint IntPush(SqStack1 *S1,int e1){//入栈*(*S1).top++=e1;return OK;}//IntPushint CharPush(SqStack2 *S2,char e2) {//入栈*(*S2).top++=e2;return OK;}//CharPushint IntPop(SqStack1 *S1){//出栈int e1;if((*S1).top==(*S1).base)return 0;e1=*--(*S1).top;return e1;}//IntPopint CharPop(SqStack2 *S2){//出栈char e2;if((*S2).top==(*S2).base) return 0;e2=*--(*S2).top;return e2;}//CharPopchar Precede(char a,char b){int i,j;char Table[8][8]={ ' ','+','-','*','/','(',')','#','+','>','>','<','<','<','>','>','-','>','>','<','<','<','>','>','*','>','>','>','>','<','>','>','/','>','>','>','>','<','>','>','(','<','<','<','<','<','=',' ',')','>','>','>','>',' ','>','>','#','<','<','<','<','<',' ','=', }; //优先级表格for(i=0;i<8;i++)if(Table[0][i]==a) //纵坐标寻找break;for(j=0;j<8;j++) //横坐标寻找if(Table[j][0]==b)break;return Table[j][i];}//Precedeint Operate(int a,char theta,int b){ //计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值int c;if(theta=='+') c=a+b;else if(theta=='-') c=a-b;else if(theta=='*') c=a*b;else c=a/b;return c;}//Operateint IsOptr(char ch){char ptr[10]={'+','-','*','/','(',')','#'};for(int i=0;i<7;i++){if(ch==ptr[i])return true;}return false;}long result(char *a,SqStack1 *OPND,SqStack2 *OPTR){//求值char theta;int b,d,k=0,i=0,j=0,num2=0;IntInitStack(OPND);CharInitStack(OPTR);CharPush(OPTR,'#');while(a[i]!='='){if(!IsOptr(a[i])){k++;if(k<=j){num2=(int(a[i])-48);i++;}if(k>j){num2=num2*10+(int(a[i])-48);k=j=0;i++;}if(!IsOptr(a[i]))k++;if(k==j)IntPush(OPND,num2);}else if(IsOptr(a[i])){switch(Precede(a[i],CharGetTop(OPTR) )){case'<':CharPush(OPTR,a[i++]);if(a[i]!='('&&a[i]!=')')j++;break;case'=':CharPop(OPTR);i++;break;case'>':theta=CharPop(OPTR);d=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,d));break;}//switch} //else if}//whileprintf("表达式的正确结果为:");printf("%d\n",IntGetTop(OPND));return (IntGetTop(OPND));}//reslutvoid Built_shitiKu(){int i,num;xuanti *pstu;printf("输入试题数目:\n");scanf("%d",&num);fflush(stdin);pstu=(xuanti*)malloc(num*sizeof(xuanti));//动态分配内存if(pstu==NULL){printf("没有足够的内存空间!\n");return;}for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);gets(pstu[i].a);fflush(stdin);printf("\n");}WriteToFile(pstu,num);//将pstu所指向的学生信息写入文件中memset(pstu,0,num*sizeof(xuanti));//将pstu所指向的内存块清0ReadFromFile(pstu,num);//从文件中读取学生信息到pstu所指向的内存块中printf("试题列表:\n");for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);printf("%s",pstu[i].a);printf("\n");}free(pstu);//释放动态分配的内存}void WriteToFile(xuanti *pstu,int num){//将pstu所指向的试题息写入文件shitiku.txt中FILE *fp;fp=fopen("shitiku.txt","at");{printf("不能创建shitiku.txt\n");free(pstu);exit(0);}fwrite(pstu,sizeof(xuanti),num,fp);fclose(fp);}void ReadFromFile(xuanti *pstu,int num){//从试题库中提取试题FILE *fp;fp=fopen("shitiku.txt","rt");if(fp==NULL){printf("不能打开shitiku.txt\n");free(pstu);exit(0);}fread(pstu,sizeof(xuanti),num,fp);fclose(fp);}//******************************************void RecMark(int *m,int num){//把得分记录到markrec.txt中FILE *mp;mp=fopen("markrec.txt","at");{printf("不能创建markrec.txt\n");free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookMark(int *m,int num){//查看得分记录FILE *mp;mp=fopen("markrec.txt","rt");if(mp==NULL){printf("不能打开markrec.txt\n");free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//*************************************void RecN(int *m,int num){//把m的值记录到n_rec.txt中FILE *mp;mp=fopen("n_rec.txt","wt");if(mp==NULL){printf("不能创建n_rec.txt\n");free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookN(int *m,int num){//查看m的值FILE *mp;mp=fopen("n_rec.txt","rt");if(mp==NULL){printf("不能打开n_rec.txt\n");free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//*************************************int excersice_begin(){int i, j, temp, KEY[20];int mark,count=0;int *Mark;char g;SqStack1 s1,*OPND;SqStack2 s2,*OPTR;xuanti *XT;OPND=&s1;OPTR=&s2;Mark=(int*)malloc(20*sizeof(int));XT=(xuanti*)malloc(20*sizeof(xuanti));ReadFromFile(XT,20);do{mark=0;srand((unsigned)time(NULL));KEY[0] = rand()%20;for(i=1;i<20;i++){while(1){temp = rand()%20;for(j=0;j<i;j++){if(KEY[j]==temp)break;}if(j==i){KEY[i]=temp;break;}}}system("cls");printf("随机的10个练习题:\n");for(i=0;i<10;i++){printf("第%d个练习题:",i+1);printf("%s\n",XT[KEY[i]].a);printf("请输入计算结果:");scanf("%ld",&XT[KEY[i]].result);fflush(stdin);if(XT[KEY[i]].result==result(XT[KEY[i]].a ,OPND,OPTR)){mark+=10;printf("答案正确!");printf("\n\n");}else{printf("答案错误!");printf("\n\n");}}printf("****得分情况****\n");printf("最后的得分为:%d\n",mark);if(mark>=90)printf("Very Good!\n");else if(mark>=60)printf("成绩不错。

相关主题