数据结构课程设计报告利用栈求表达式的值20页docx文档格式.docx
- 文档编号:14411386
- 上传时间:2022-10-22
- 格式:DOCX
- 页数:17
- 大小:302.82KB
数据结构课程设计报告利用栈求表达式的值20页docx文档格式.docx
《数据结构课程设计报告利用栈求表达式的值20页docx文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告利用栈求表达式的值20页docx文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
2.1.4随时退出模块设计方案………………………………………07
2.1.5主程序设计方案………………………………………………07
3.本程序涉及的结构体………………………………………………………08
4.程序演示………………………………………………………………………09
5.课程设计心得………………………………………………………………14
1.摘要
设计一个用于小学生使用的数学表达式求值的系统。
在系统中,充分利用数据结构中栈的知识,并用到了C语言中的文件操作,主要是:
如何从试题库中读取题目以及将试题写入试题库中。
完成了试题库的录入更新,考试,打分,评价和与历史分数的对比评价等功能。
在系统中,充分体现了数据结构这门学科的特色。
其中涉及到的文件主要有:
shitiku.txt——用来存放试题;
markrec.txt——存放历史分数;
n_rec.txt存放测试次数。
2设计方案
2.1整体设计方案
此课题是研究表达式求值的问题,以帮助小学生完成测试。
为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。
整体设计都是以这个要求为轴心进行的。
为了直观和方便,现画出软件整体设计模块图。
如下图:
2.1.1创建试题库模块设计方案
首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。
创建试题库函数:
创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中。
在创建试题库这个模块中,还包含了两个文件操作的函数的调用,分别是将试题信息写入shujuku.txt中的函数voidWriteTo*pstu,intnum)与讲试题信息从shujuku.txt中读出来的函数voidReadFrom*pstu,intnum)。
部分程序如下:
voidBuilt_shitiKu()/*建立试题库文件*/
{
inti,num;
xuanti*pstu;
printf("
请输入试题数目:
\n"
);
/*输入试题数目*/
scanf("
%d"
&
num);
fflush(stdin);
pstu=(xuanti*)malloc(num*sizeof(xuanti));
/*动态分配内存*/
if(pstu==NULL)
{
没有足够的内存空间!
/*没有足够内存空间*/
return;
}
for(i=0;
i<
num;
i++)/*输入试题*/
第%d道题目:
"
i+1);
gets(pstu[i].a);
voidWriteTo*pstu,intnum)/*将pstu所指向的试题息写入文件shitiku.txt中*/
FILE*fp;
fp=fopen("
shitiku.txt"
"
at"
if(fp==NULL)
不能创建试题库!
/*不能创建试题库*/
free(pstu);
exit(0);
fwrite(pstu,sizeof(xuanti),num,fp);
fclose(fp);
}
voidReadFrom*pstu,intnum)/*从试题库中提取试题*/
rt"
不能打开shitiku.txt文件!
/*不能打开shitiku.txt文件*/
fread(pstu,sizeof(xuanti),num,fp);
2.1.2试题测试模块设计方案
试题计算:
建立两个栈,分别存放数字、运算符,建立一个二维数组,存放任意两个运算符之间的优先级关系,通过比较符号栈中后两个运算符的优先级关系,决定数字栈中后两个数据是直接入栈还是运算之后入栈,最后在数字栈中得到最后的运算结果。
通过比较用户输入的结果与程序计算的结果来决定测试者的分数mark是否加分,测试完成时,将分数mark写入记录分数文件markrec.txt中,并将总共的测试次数记录如n_rec.txt中。
现将开始测试(intexcersice_begin())和试题计算(longresult(char*a,SqStack1*OPND,SqStack2*OPTR))的函数附下:
开始测试(intexcersice_begin())函数:
intexcersice_begin()
inti,j,temp,useresult,KEY[20];
intmark,count=0;
int*Mark;
charg;
SqStack1s1,*OPND;
/*数字栈*/
SqStack2s2,*OPTR;
/*运算符栈*/
xuanti*XT;
OPND=&
s1;
OPTR=&
s2;
Mark=(int*)malloc(20*sizeof(int));
XT=(xuanti*)malloc(20*sizeof(xuanti));
ReadFrom);
do
mark=0;
srand((unsigned)time(NULL));
KEY[0]=rand()%20;
for(i=1;
20;
i++)
{
while
(1)
temp=rand()%20;
for(j=0;
j<
i;
j++)
if(KEY[j]==temp)
break;
}
if(j==i)
KEY[i]=temp;
system("
cls"
Random10expressions:
10;
i++)
The%dthexpression:
%s\n"
XT[KEY[i]].a);
Pleaseinputyouranswer:
%ld"
XT[KEY[i]].result);
/*将用户输入的值存入xuanti数据结构的result中*/
if(XT[KEY[i]].result==result(XT[KEY[i]].a,OPND,OPTR))/*将用户输入的值与计算得出的值比较是否相等*/
mark+=10;
Youranswerisright!
\n\n"
}else
Youransweriswrong!
****Scores****\n"
YourlastScoreis:
%d\n"
mark);
if(mark>
=90)/*给出此次测试的评价*/
VeryGood!
elseif(mark>
=60)
Good!
elseprintf("
Needmorepractice!
RecMark(Mark,count);
Mark[count]=mark;
count++;
Continuethetest?
('
y'
-Yes,'
n'
-No):
g=getchar();
if(count>
=20)
count=0;
}while(g=='
returncount;
试题计算(longresult(char*a,SqStack1*OPND,SqStack2*OPTR))函数:
longresult(char*a,SqStack1*OPND,SqStack2*OPTR)/*求表达式的值*/
chartheta;
intb,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=a[i]-48;
i++;
if(k>
j)
num2=num2*10+(a[i]-48);
k=j=0;
IsOptr(a[i]))
k++;
if(k==j)
IntPush(OPND,num2);
}elseif(IsOptr(a[i]))/*判断是否为运算符*/
switch(Precede(a[i],CharGetTop(OPTR)))/*比较栈顶运算符top与当前运算符a[i]的优先级*/
case'
<
'
:
CharPush(OPTR,a[i++]);
/*top优先级小于a[i]时,将a[i]入栈*/
if(a[i]!
&
a[i]!
)'
)
j++;
CharPop(OPTR);
i++;
break;
/*top优先级与a[i]相等时,top出栈*/
>
theta=CharPop(OPTR);
/*top优先级大于a[i]时,将数字栈中后两个数据进行top运算,并将运算后结果入栈*/
d=IntPop(OPND);
b=IntPop(OPND);
IntPush(OPND,Operate(b,theta,d));
if(a[i]=='
)/*将数字栈中剩下的最后两个数据进行top运算,并将结果入栈*/
IntPush(OPND,Opera
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 利用 表达式 20 docx