利用栈求表达式的值可供小学生作业并能给出分数数据结构课程设计说明书格式_第1页
利用栈求表达式的值可供小学生作业并能给出分数数据结构课程设计说明书格式_第2页
利用栈求表达式的值可供小学生作业并能给出分数数据结构课程设计说明书格式_第3页
利用栈求表达式的值可供小学生作业并能给出分数数据结构课程设计说明书格式_第4页
利用栈求表达式的值可供小学生作业并能给出分数数据结构课程设计说明书格式_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、word中北大学数 据 结 构课 程 设 计 说 明 书   学生姓名:刘敏杰学 号:1021011545 学 院:软件学院专 业:软件开发与测试题 目:利用栈求表达式的值,可供小学生作业,并能给出分数指导教师何志英    2011年12月20日1. 设计任务概述包括系统总体框图及功能描述此课题是研究表达式求值的问题,以帮助小学生完成测试。为了到达这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。整体设计都是以这个要求为轴心进行的。为了直观和方便,现画出软件整体设计模块图。利用栈求表达式的值创立试题库试题

2、测试查看历史分数随时退出整体设计模块图可以清晰的看出软件的几大模块。整个系统的操作流程图可以看出操作的整体流程,如下列图开始结束菜单项选择择试题测试查看历史分数输入1 输入2 输入0 2. 本设计所采用的数据结构如:链表、栈、树、图等根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3. 功能模块详细设计在此说明每个局部的算法设计说明可以是描述算法的流程图,每个程序中使用的存储结构设计说明如果指定存储结构请写出该存储结构的定义。3.1 详细设计思想学生要进行测试,首先要有试题。那么我们就要先建立试题库。这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.t

3、xt的文件中。首先在主函数中调用创立试题库函数,将试题存入到试题库文件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 STAC

4、K_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1/定义表达式typedef struct shiti char a20; 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 *

5、pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item)/建立菜单 printf(">>> 数学习题库 <<<nn- %s -nn",menu_item);void return_confirm() printf("n按任意键返回n"); getch();void IntInitStack(SqStack1 *S1) S1->base=(int *)malloc(STACK_INIT_SIZE*si

6、zeof(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;/CharInitSta

7、cklong 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;/

8、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;/CharPop char Preced

9、e(char a,char b) int i,j; char Table88= ' ','+','-','*','/','(',')','#', '+','>','>','<','<','<','>','>', '-','>','>',

10、9;<','<','<','>','>', '*','>','>','>','>','<','>','>', '/','>','>','>','>','<','>','&g

11、t;', '(','<','<','<','<','<','=',' ', ')','>','>','>','>',' ','>','>', '#','<','<','<','&l

12、t;','<',' ','=',; /优先级表格 for(i=0;i<8;i+) if(Table0i=a) /纵坐标寻找 break; for(j=0;j<8;j+) /横坐标寻找 if(Tablej0=b) break; return Tableji;/Precedeint Operate(int a,char theta,int b) /计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值 int c; if(theta='+') c=a+b;else if(theta='-'

13、;) c=a-b; else if(theta='*') c=a*b; else c=a/b; return c;/Operateint IsOptr(char ch)char ptr10='+','-','*','/','(',')','#'for(int i=0;i<7;i+) if(ch=ptri) return true;return false;long result(char *a,SqStack1 *OPND,SqStack2 *OPTR) /求值

14、 char theta; int b,d,k=0,i=0,j=0,num2=0; IntInitStack(OPND); CharInitStack(OPTR); CharPush(OPTR,'#'); while(ai!='=') if(!IsOptr(ai) k+; if(k<=j) num2=(int(ai)-48); i+; if(k>j) num2=num2*10+(int(ai)-48); k=j=0; i+; if(!IsOptr(ai) k+; if(k=j) IntPush(OPND,num2); else if(IsOptr(ai

15、) switch(Precede(ai,CharGetTop(OPTR) case '<':CharPush(OPTR,ai+); if(ai!='('&&ai!=')') 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

16、 if /while printf("表达式的正确结果为:"); printf("%dn",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)

17、printf("没有足够的内存空间!n"); return; for(i=0;i<num;i+)/输入试题 printf("第%d道试题:",i+1); gets(pstui.a); fflush(stdin); printf("n"); WriteToFile(pstu,num);/将pstu所指向的学生信息写入文件中 memset(pstu,0,num*sizeof(xuanti);/将pstu所指向的内存块清0 ReadFromFile(pstu,num);/从文件中读取学生信息到pstu所指向的内存块中 printf(&

18、quot;试题列表:n"); for(i=0;i<num;i+)/输入试题 printf("第%d道试题:",i+1); printf("%s",pstui.a); printf("n"); free(pstu);/释放动态分配的内存void WriteToFile(xuanti *pstu,int num)/将pstu所指向的试题息写入文件shitiku.txt中FILE *fp; fp=fopen("shitiku.txt","at"); if(fp=NULL) printf

19、("不能创立shitiku.txtn"); 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.txtn"); free(pstu); exit(0); fread(pstu,sizeof(x

20、uanti),num,fp); fclose(fp);/*void RecMark(int *m,int num)/把得分记录到markrec.txt中 FILE *mp; mp=fopen("markrec.txt","at"); if(mp=NULL) printf("不能创立markrec.txtn"); free(m); exit(0); fwrite(m,sizeof(int),num,mp); fclose(mp);/Recmarkvoid LookMark(int *m,int num)/查看得分记录 FILE *mp;

21、 mp=fopen("markrec.txt","rt"); if(mp=NULL) printf("不能翻开markrec.txtn"); 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.tx

22、tn"); 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.txtn"); free(m); exit(0); fread(m,sizeof(int),num,mp); fclose(mp);/*int excersice_begin() i

23、nt i, j, temp, KEY20; 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); KEY0 = rand()%20; for(i=1;i<

24、;20;i+) while(1) temp = rand()%20; for(j=0;j<i;j+) if(KEYj=temp) break; if(j=i) KEYi=temp; break; system("cls"); printf("随机的10个练习题 :n"); for(i=0;i<10;i+) printf("第%d个练习题:",i+1); printf("%sn",XTKEYi.a); printf("请输入计算结果:"); scanf("%ld",

25、&XTKEYi.result); fflush(stdin); if(XTKEYi.result=result(XTKEYi.a,OPND,OPTR) mark+=10; printf("答案正确!"); printf("nn"); else printf("答案错误!"); printf("nn"); printf("*得分情况*n"); printf("最后的得分为:%dn",mark); if(mark>=90) printf("Very Goo

26、d!n"); else if(mark>=60) printf("成绩不错。n"); else printf("很遗憾成绩不及格!n"); printf("n"); RecMark(Mark,count); Markcount=mark; count+;/记录次数递增 printf("是否继续做练习('y'是,'n'否):"); g=getchar(); fflush(stdin); printf("n"); if(count>=20)/超过

27、最大记录次数清0 count=0;while(g='y'); RecMark(Mark,count); return count; return_confirm();void Look_Mark(int count)/printf("是否查看历史得分('y'是,'n'否):"); int *Mark; int i; Mark=(int *)malloc(20*sizeof(int); system("cls"); printf("*查询历史得分情况*n"); LookMark(Mark,

28、count); for(i=0;i<count;i+) printf("*第%d次得%d分*n", i+1, Marki);if(i>1) if(Marki-1>60|Marki-2>60) if(Marki-1>Marki-2) printf("有进步,还要加油哦。n"); else if(Marki-1=Marki-2) printf("成绩还可以,但没有进步,还要多多努力呀!n"); else printf("成绩有点下降,要多多练习,不要气馁!n"); else printf(

29、"成绩很不好!要更加努力学习!n");else if(Mark0>=90) printf("Very Good!n"); else if(Mark0>=60) printf("成绩不错。n"); else printf("很遗憾成绩不及格!n"); return_confirm();void main() int m=0; int *RN; char ch; RN=(int *)malloc(1*sizeof(int); RN0=0; printf("*如果是第一次运行*n"); printf("*请先建立 n_rec.txt*n"); printf("*否那么会出错 !*n"); printf("('y'-创立*'n'-不建)n"); ch=getchar(); if(ch='y') RecN(RN,1); LookN(RN,1); RN0+=m; fflush(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论