数据结构课程设计报告整理表达式.docx
《数据结构课程设计报告整理表达式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告整理表达式.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告整理表达式
数据结构课程设计报告
题目:
编程整理表达式方法
班级:
计算机092
姓名:
余海刚
指导教师:
董跃华,井福荣
成绩:
__________________________
2011年6月16日
目录:
摘要2
1.引言………………………………………………………………..2
2.需求分析……………………………………………………………..3
3.概要设计……………………………………………………………..3
4.详细设计……………………………………………………………..6
5.测试结果…………………………………………………………...11
6.调试分析…………………………………………………………….13
7.设计体会…………………………………………………………….14
8.结束语……………………………………………………………….14
附录……………………………………………………………………15
参考文献
摘要(题目):
:
键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余的括号,原表达式中所有变量和运算符相对位置保持不变,并保持与原表达式等价
1.引言
栈,是硬件。
主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。
它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。
栈也称为先进后出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
文件是程序设计中的一个重要概念。
所谓“文件”一般是指存储在外部介质上数据的集合。
一批数据时以文件的形式存放在外部介质(如磁盘)上的。
操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后从该文件中读取数据。
要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。
本报告中所设计的整理表达式,实现了以线性表结构的单向表表示商场所需求的功能,,将文件形式保存的数据恢复成线性表结构的单向表的流程中所需的功能。
。
2.需求分析
输入字母和运算符号,输入数值也可以,但不好看,输出应输入对应。
去掉所有多余的括号时,原表达式中所有变量和运算符相对位置保持不变,不能前移或是退后,并保持与原表达式等价。
输入时也可以输入正确表达式。
3.概要设计
、、、为包含的库函数
除此之外还有结构体和宏定义的应用
系统流程图见图
调用函数h;
4、详细设计
4.1引用库函数及变量的定义
#include/*标准输入/输出头文件*/
#include/*包含绘制图形函数等头文件*/
#include/*包含字符串处理函数头文件*/
#include/*包含动态存储与释放函数头文件*/
#include
#include
#defineMax100/*宏观定义栈的最大容量*/
typedefstructstack/*栈结构定义*/
{
chardata[Max];/*字符串定义,存储元素*/
inttop;/*栈中指针,代表栈的长度*/
}liststack;
4.2输入算法的实现
voidkuanjia1()//大框架
{
system("cls");
printf("╔━━━━━━━━━━━━━━━━━━╗");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("╚━━━━━━━━━━━━━━━━━━╝");
gotoTextPos(4,2);
printf("┏┓");
gotoTextPos(4,3);
printf("整理表达式");
gotoTextPos(4,4);
printf("┗┛");
voidmenu()//主界面
{
kuanjia1();
gotoTextPos(16,8);
printf("1.Start");
gotoTextPos(16,10);
printf("2.Exit");
gotoTextPos(2,14);
printf("Pleaseinputyourchoice:
");
}
4.3输出算法的实现
voidzlbds()
{
kuanjia1();
gotoTextPos(2,7);
printf("Inputtheprimerexpression:
");
gotoTextPos(2,8);
charstr[Max],exp[Max],tran[Max];
scanf("%s",str);
strans(str,exp,tran);
gotoTextPos(2,10);
printf("初步整理表达式:
%s",exp);
gotoTextPos(2,12);
printf("最终整理表达式:
%s\n",tran);
gotoTextPos(2,14);
printf("Pressanykeytoreturn!
");
getch();
menu();
}
intn;
scanf("%d",&n);
switch(n)
{
case1:
zlbds();break;
case2:
return;
default:
gotoTextPos(28,14);printf("Error!
");
gotoTextPos(2,16);printf("Pressanykeytotryagain!
");
getch();
menu();
}
}
}
4.4算法
voidstrans(charstr[],charexp[],chartran[])/*子函数,删除字符串中多余项*/
{
liststackop;/*定义一个栈*/
inti=0,t=0,j=0,k=-1;
op.top=-1;/*栈的初始位置*/
for(i=0;i{
op.top++;/*指针移动*/
op.data[op.top]=str[i];/*第i个字符入栈*/
}
for(i=0;i<=op.top;i++)/*从栈中查找元素*/
{
if(op.data[i]=='(')/*第i个元素若为“(”*/
{
if(op.data[i-1]=='*'||op.data[i-1]=='/')/*如若第i个元素之前有“*
”或“/”.即“(”前面有*或/*/
{
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,即初始整理结
果的存储位置*/
}
elseif(i==0)/*如若第i个元素之前没有“*”或“/”,并且
i=0*/
{
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,也即初始整理
结果的存储位置*/
k=i;/*i的直赋给k,k用于记录当前记录位置*/
}
else/*i!
=0*/
{
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,也即初始整理
结果的存储位置*/
k=i;/*i的值赋给k,k用于记录当前记录位置*/
}
}
elseif(op.data[i]==')')/*第i个元素如不为“(”,而为“)”*/
{
if(op.data[i+1]=='*'||op.data[i+1]=='/'||k==-1)/*如果“)”后
有*或/*/
{
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,即初始整理
结果的存储位置*/
}
elseif(i==op.top&&k==-1)/*“(”后面没有*或/,并且当前位置合法
*/
{
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,也即初始整理
结果的存储位置*/
}
else/*当前位置不合法*/
{
exp[i]='';/*此数组存空*/
exp[k]='';/*此数组存空*/
k=-1;
}
}
else/*第i各元素如若不为’(’,而不为“)”*/
exp[i]=op.data[i];/*那么把第i个元素存在此数组里,也即初始整理
结果的存储位置*/
}
exp[op.top+1]='\0';/*最后一个存/0*/
while(exp[t]!
='\0')
{
if(exp[t]!
='')/*第t个元素不为空*/
{
tran[j]=exp[t];/*把它放在最终整理数组中*/
t++;
j++;
}
elseif(exp[t]==''&&t!
=op.top)/*第t个元素为空,并且当前位置合法
*/
{
tran[j]=exp[t+1];/*把下一个放在最终整理数组中*/
t=t+2;
j++;
}
else
break;/*跳出循环*/
}}
4.5主函数
intmain()
{
system("modecon:
cols=40lines=20");
setConsoleTitle("整理表达式by余海刚");
system("color0A");
menu();
kuanjia1();
gotoTextPos(10,7);
printf("拜");
delayMS(600);
gotoTextPos(19,7);
printf("拜");
delayMS(600);
gotoTextPos(20,9);
printf("b");
delayMS(600);
gotoTextPos(21,9);
printf("y");
delayMS(600);
gotoTextPos(24,9);
printf("余");
delayMS(600);
gotoTextPos(26,9);
printf("海");
delayMS(600);
gotoTextPos(28,9);
printf("刚");
delayMS(600);
return0;
}
5、测试结果
5.1输入界面
5.2..1输出界面输入选择1的运行界面。
见
1.10
图1.10输入程序的运行界面
5.2.2输入选择2的运行界面。
见
5.2.3输入其它选择的运行界面。
见
6、调试分析
编译时,发现有的括号可删可不删时,会自动删除,这样导致程序不够紧密。
刚刚接到这个题目的时候,我发现用栈做会更加的减少时间复杂度和空间复杂度,从而更好的方便使用,于是我的一切出发点都是围绕方便使用者进行。
程序的开始我使用的是宏定义,使程序更加的简洁明了,其中贯穿程序大部分的是字符串和数组。
登陆界面其实是利用判断语句做的,后面的输入输出没有什么特别的,是按照一般线性表的输入输出做的,。
除此之外,我还花了一部分时间到美化界面上,现在的界面是在我的能力范围之内最好的。
7、设计体会
通过这个星期的课程设计,我的收获还是不少的。
刚开始看到这个课程设计题目的时候,我觉得很有信心,因为我认为我的数据结构和C语言中我最喜欢也是学的最好的地方就是线性,但是随着对这个题目的细细探索,我发现这题目还是有一定的难度的,越看我觉得越急躁,但是这样反而更加的阻碍我的思路,直到我碰到一个在C语言方面颇有心得的同学,他帮我解决了很多问题,更主要的是他让我明白了耐性在一个程序中的重要作用,现在,借着这里我想真诚的对他说一声“谢谢!
”我一定会更加的努力培养我的耐性,让我的人生更加的美好而成功!
数据结构的很多算法没能熟练的掌握,以致在调试的时候花了很长时间,而且程序不够工程化,功能不够完善。
程序设计的过程中,代码的编写很不熟练,而且很容易犯一些低级的错误,如:
语句后面的分号忽略了,括号不匹配等等。
8、结束语
该系统我主要做了三个功能选项,,一个主界面。
解决了编程整理表达式问题,当然此系统也可应用到其它表达式系统。
它是利用了C语言实现的。
此系统的作界面,操作员可以对某个指定的库存文件进行选择,文件名自定。
非常感谢老师对我的教导。
参考文献
[1]严蔚敏吴伟名编著,《数据结构》,清华大学出版社,2001年1月
[2]谭浩强编著,《C程序设计》(第三版),新世纪计算机基础教育丛书清华大学出版社,2005年7月第三版
[3]张颖江,胡燕。
《c语言程序设计》[M]。
北京:
科学出版社。
1985年。
[4]裔红艳《数据结构》课程设计报告,计算机师范
[5]知道
[6]李春葆编著,《数据结构习题与解析》(第三版),清华大学出版社,2006年10月20
附录:
#include
#include
#include
#include
#include
#include"strong.cpp"
#defineMax100
voidmenu();
typedefstructstack
{
chardata[Max];
inttop;
}liststack;
voidkuanjia1()//大框架
{
system("cls");
printf("╔━━━━━━━━━━━━━━━━━━╗");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("┃┃");
printf("╚━━━━━━━━━━━━━━━━━━╝");
gotoTextPos(4,2);
printf("┏┓");
gotoTextPos(4,3);
printf("整理表达式");
gotoTextPos(4,4);
printf("┗┛");
}
voidstrans(charstr[],charexp[],chartran[])
{
liststacks;
inti=0,t=0,j=0,k=-1;
s.top=-1;
for(i=0;i{
s.top++;
s.data[s.top]=str[i];
}
for(i=0;i<=s.top;i++)
{
if(s.data[i]=='(')
{
if(s.data[i-1]=='*'||s.data[i-1]=='/')
{
exp[i]=s.data[i];
}
elseif(i==0)
{
exp[i]=s.data[i];
k=i;
}
else
{
exp[i]=s.data[i];
k=i;
}
}
elseif(s.data[i]==')')
{
if(s.data[i+1]=='*'||s.data[i+1]=='/'||k==-1)
{
exp[i]=s.data[i];
}
elseif(i==s.top&&k==-1)
{
exp[i]=s.data[i];
}
else
{
exp[i]='';
exp[k]='';
k=-1;
}
}
else
exp[i]=s.data[i];
}
exp[s.top+1]='\0';
while(exp[t]!
='\0')
{
if(exp[t]!
='')
{
tran[j]=exp[t];
t++;
j++;
}
elseif(exp[t]==''&&t!
=s.top)
{
tran[j]=exp[t+1];
t=t+2;
j++;
}
else
break;
}
}
voidzlbds()
{
kuanjia1();
gotoTextPos(2,7);
printf("Inputtheprimerexpression:
");
gotoTextPos(2,8);
charstr[Max],exp[Max],tran[Max];
scanf("%s",str);
strans(str,exp,tran);
gotoTextPos(2,10);
printf("初步整理表达式:
%s",exp);
gotoTextPos(2,12);
printf("最终整理表达式:
%s\n",tran);
gotoTextPos(2,14);
printf("Pressanykeytoreturn!
");
getch();
menu();
}
voidmenu()//主界面
{
kuanjia1();
gotoTextPos(16,8);
printf("1.Start");
gotoTextPos(16,10);
printf("2.Exit");
gotoTextPos(2,14);
printf("Pleaseinputyourchoice:
");
intn;
scanf("%d",&n);
switch(n)
{
case1:
zlbds();break;
case2:
return;
default:
gotoTextPos(28,14);printf("Error!
");
gotoTextPos(2,16);printf("Pressanykeytotryagain!
");
getch();
menu();
}
}
intmain()
{
system("modecon:
cols=40lines=20");
setConsoleTitle("整理表达式by余海刚");
system("color0A");
menu();
kuanjia1();
gotoTextPos(10,7);
printf("拜");
delayMS(600);
gotoTextPos(19,7);
printf("拜");
delayMS(600);
gotoTextPos(20,9);
printf("b");
delayMS(600);
gotoTextPos(21,9);
printf("y");
delayMS(600);
gotoTextPos(24,9);
printf("余");
delayMS(600);
gotoTextPos(26,9);
printf("海");
delayMS(600);
gotoTextPos(28,9);
printf("刚");
delayMS(600);
return0;
}
#include"pcc32.h"
voiddelayMS(uint32d)
{
Sleep(d);
return;
}
voidclearText(void)
{
system("cls");
return;
}
intsetTextColor(uint8fColor)
{
HANDLEhd=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFOcsbInfo;
GetConsoleScreenBufferInfo(hd,&csbInfo);
returnSetConsoleTextAttribute(hd,fColor|(csbInfo.wAttributes&~0x0F));
}
PCCOLORgetTextColor(void)
{
CONSOLE_SCREEN_BUFFER_INFOcsbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbInfo);
return(PCCOLOR)(csbInfo.wAttributes&0x0F);
}
intsetBackColor(uint8bColor)
{
HANDLEhd=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFOcsbInfo;
GetConsoleScreenBufferInfo(hd,&csbInfo);
returnSetConsoleTextAttribute(hd,(bColor<<4)|(csbInfo.wAttributes&~0xF0));
}
PCCOLORgetBackColor(void)
{
CONSOLE_SCREEN_BUFFER_INFOcsbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbInfo);
return