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

下载本文档

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

文档简介

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

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

3、调用创建试题库函数,将试题存入到试题库文件 shitiku.txt 中,然后将 该调用从主函数中删除。 创建试题库函数: 创建指向 xuanti 类型的指针, 利用循环将输入的测试题该指针的 xuanti 单元中,最后将该指针中的测试题写入试题库文件 shitiku.txt 中。 3.2 核心代码 ( 正文宋体小四号字, 1.5 倍行距 ) #include #include #include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR 0 #define OK 1

4、/ 定义表达式 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 *pstu,int num); void ReadFromFile(xuanti *pstu,int num);

5、void page_title(char *menu_item) / 建立菜单 printf( 数学习题库 base=(int *)malloc(STACK_INIT_SIZE*sizeof(int); if(!S1-base) exit(ERROR); S1-top=S1-base; 51- stacksize=STACK_INIT_SIZE; /IntInitStack void CharInitStack(SqStack2 *S2) 52- base=(char *)malloc(STACK_INIT_SIZE*sizeof(char); if(!S2-base) exit(ERROR)

6、; S2-top=S2-base; S2-stacksize=STACK_INIT_SIZE; /CharInitStack long IntGetTop(SqStack1 *S1) / 取栈顶元素 long e1; if(*S1).top=(*S1).base) return 0; e1=*(*S1).top-1); return e1; /IntGetTop char CharGetTop(SqStack2 *S2) / 取栈顶元素 char e2; if(*S2).top=(*S2).base) return 0; e2=*(*S2).top-1); return e2; /IntGet

7、Top int IntPush(SqStack1 *S1,int e1) / 入栈 *(*S1).top+=e1; return OK; /IntPush int CharPush(SqStack2 *S2,char e2) / 入栈 *(*S2).top+=e2; return OK; /CharPush int IntPop(SqStack1 *S1) / 出栈 int e1; if(*S1).top=(*S1).base) return 0; e1=*-(*S1).top; return e1; /IntPop int CharPop(SqStack2 *S2) / 出栈 char e2

8、; if(*S2).top=(*S2).base) return 0; e2=*-(*S2).top; return e2; /CharPop char Precede(char a,char b) int i,j; char Table88= ,+,-,*,/,(,),#, +, J J J J J J J J -, J J J J J J J J *, J J J J J J J J /, * J J J J J J J J (, , / J J J J J J J J #, ,=, ,f J J J J J J J J ; / 优先级表格 for(i=0;i8;i+) if(Table0

9、i=a) / 纵坐标寻找 break; for(j=0;j8;j+) / 横坐标寻找 if(Tablej0=b) break; return Tableji; /Precede int 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; /Operate int IsOptr(char ch) char ptr10=+,-,*,

10、/,(,),#; for(int i=0;i7;i+) if(ch=ptri) 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(ai!=) if(!IsOptr(ai) k+; if(kj) num2=num2*10+(int(ai)-48); k=j=0; i+; if

11、(!IsOptr(ai) k+; if(k=j) IntPush(OPND,num2); else if(IsOptr(ai) switch(Precede(ai,CharGetTop(OPTR) case :theta=CharPop(OPTR); d=IntPop(OPND); b=IntPop(OPND); IntPush(OPND,Operate(b,theta,d); break; /switch /else if /while printf( 表达式的正确结果为 :); printf(%dn,IntGetTop(OPND); return (IntGetTop(OPND); /re

12、slut void Built_shitiKu() int i,num; xuanti *pstu; printf( 输入试题数目: n); scanf(%d, 动态分配内存 fflush(stdin); pstu=(xuanti *)malloc(num*sizeof(xuanti);/ if(pstu=NULL) printf( 没有足够的内存空间! n); return; for(i=0;inum;i+) / 输入试题 printf(第(:道试题:,i+1); gets(pstui.a); fflush(stdin); printf(n); WriteToFile(pstu,num);/

13、 将 pstu 所指向的学生信息写入文件中 memset(pstu,0,num*sizeof(xuanti);/将 pstu 所指向的内存块清 0 ReadFromFile(pstu,num);/ 从文件中读取学生信息到 pstu 所指向的内存 块中 printf( 试题列表: n); for(i=0;inum;i+) / 输入试题 printf(第(:道试题:,i+1); printf(%s,pstui.a); printf(n); free(pstu);/ 释放动态分配的内存 void WriteToFile(xuanti *pstu,int num) / 将 pstu 所指向的试题息写入

14、文件 shitiku.txt 中 FILE *fp; fp=fopen(shitiku.txt,at); if(fp=NULL) printf(不能创建 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);

15、 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); if(mp=NULL) printf( 不能创建 markrec.txtn); 11 free(m); exit(0); fwrite(m,sizeof(int),num,mp); fclose(mp); /Recmark void LookMark(int *m,int num) / 查看得分记录 F

16、ILE *mp; 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.txtn); free(m); exit(0); fwrite(m,sizeof(int),num,mp)

17、; fclose(mp); /Recmark void 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() int i, j, temp, KEY20; int mark,count=0; int *Mark; char g; SqStack1 s1,*OPND; SqStack2

18、s2,*OPTR; xuanti *XT; OPND= OPTR= 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;i20;i+) while(1) temp = rand()%20; for(j=0;ji;j+) if(KEYj=temp) break; if(j=i) KEYi=temp; break; system(cls

19、); printf( 随机的 10 个练习题 :n); for(i=0;i=90) printf(Very Good!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)/ 超过最大记录次数清 0 count=0; while

20、(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,count); for(i=0;i1) if(Marki-160|Marki-260) if(Marki-1Marki-2) printf(有进步,还要加油

21、哦。 n); else if(Marki-1=Marki-2) printf( 成绩还可以,但没有进步, 还要多多努力呀! n); !n); else printf( 成绩有点下降,要多多练习,不要气馁! else printf( 成绩很不好!要更加努力学习! 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=(in

22、t *)malloc(1*sizeof(int); RN0=0; printf(* 如果是第一次运行 *n); printf(* 请先建立 n_rec.txt*n); printf(* 否则会出错 !*n);printf(y- ch=getchar(); if(ch=y) RecN(RN,1); LookN(RN,1); 创建 * n- 不建)n); RN0+=m; fflush(stdin); printf( 是否向试题库中添加试题 : ); prin tf(y-是,n-否)?n); ch=getchar(); if(ch=y) Built_shitiKu(); menu: page_title( 操作选单 ); printf( 请用数字键选择操作 nn); printf(1开始练习 n); printf(2查看得分记录n);

温馨提示

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

评论

0/150

提交评论