括号匹配实验报告.doc_第1页
括号匹配实验报告.doc_第2页
括号匹配实验报告.doc_第3页
括号匹配实验报告.doc_第4页
括号匹配实验报告.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

实验报告1. 需求和规格说明2.l 通过MFC实现可视化界面的操作,并且能在VC6.0上运行通过;l 用户输入一个带括号(小括号、中括号、大括号均可)的表达式,并以“#”作为结束符,可判断出此表达式中的括号是否匹配;l 若括号匹配则显示出入栈出栈情况;若不匹配,则为用户提示出错误位置。l 若用户输入为空,则弹出窗口,提示用户重新输入;若用户输入的表达式没有以“#”作为结束符,则提示用户未以“#”结尾。2设计2.1设计思想n 定义一个堆栈SignStack,存储表达式中的括号元素,并分别给出定义栈初始化函数(InitStack(SignStack &s))、压栈函数(PushStack(SignStack &s,elem e))、出栈函数(PopStack(SignStack &s,elem &e))、栈清空函数(EmptyStack(SignStack &s));n 定义一个字符型指针*p指向字符串的首地址p=m_input.GetBuffer(100);定义出错的位置 int errorpoint=0;定义一个缓冲区 elem Buff;n 若输入为空或者没有以“#”作为结束符,则给出用户相应提示;while(*p!=#)如果p指向的是“(”“”“”则使其入栈;如果p指向的是“)”“”“”,则分别判断栈顶元素是否为对应的“(”“”“”,对应则出栈,否则定位错误位置,并提示用户括号匹配失败的错误位置序号。指针移动到下一个元素。判断此时栈是否为空,空则提示用户表达式中括号匹配成功,否则提示匹配失败并提示错误位置建议用户修改。2.2设计表示(1)存储结构struct SignStack elem *base; /指向栈底 elem *top; /指向栈顶 int stacksize; /栈空间大小;/定义一个栈的结构体(2)涉及的操作栈处理函数:Status InitStack(SignStack &s)/堆栈的初始化Status PushStack(SignStack &s,elem e) /压栈函数Status PopStack(SignStack &s,elem &e) /出栈函数Status EmptyStack(SignStack &s) /堆栈清空函数各个按钮控件相对应的事件处理函数:void CSignmatchDlg:OnOkButton()/匹配按钮“OK“的事件处理函数void CSignmatchDlg:OnExitButton() /退出按钮“EXIT“的事件处理函数void CSignmatchDlg:OnClearButton()/清空按钮“CLEAR“的事件处理函数其他关键函数:UpdateData(TRUE);/更新数据函数MessageBox(); /弹出窗口函数2.3实现注释UpdateData(TRUE);/更新编辑框类数据p=m_input.GetBuffer(100);/将P指向字符串的首地址更新编辑框数据,将指针p指向用户输入字符串的首地址;m_input.IsEmpty() /判断用户输入是否为空判断用户输入是否为空,空则使用MessageBox弹出提示重新输入;SignStack sign; /定义堆栈Status InitStack(sign) /初始化堆栈定义一个栈用来存储表达式中的括号元素;初始化栈,若初始化失败则使用MessageBox弹出提示;Buff.e=#; /将“#”放到栈底Buff.count=errorpoint; /将出错的位置指向缓冲区PushStack(sign,Buff); /缓冲区进栈初始化工作完成;Buff.e=*p;Buff.count=errorpoint;PushStack(sign,Buff);strcat(showBuffer,入栈 );遇到左括号,移动错误位置的指针,将左括号进栈,并显示入栈,然后使指针P指向下一位字符;PopStack(sign,Buff);if(Buff.e!=)goto lebel;strcat(showBuffer,出栈 )遇到右括号,判断栈顶元素是否为相匹配的左括号,是则令其出栈,并显示出栈,否则跳到lebel执行,然后使指针p指向下一位字符;lebel: CString str; str.Format(_T( %d ),errorpoint); p=str.GetBuffer(10); strcat(p,号位置有误,建议修改); MessageBox(p); m_SHOW.SetWindowText(showBuffer); return ;lebel:指出错误的位置序号,并使用MessageBox显示出来;if(!EmptyStack(sign)/判断堆栈是否为空判断栈是否为空,空则弹出匹配成功,否则指出错误位置;void CSignmatchDlg:OnClearButton() m_SHOW.SetWindowText(); m_Input.SetWindowText();UpdateData(TRUE);return ;清空按钮“CLEAR”的事件处理函数,清空上次结果,进行下次匹配。2.4详细设计表示 3用户手册(1)输入数据的方式在下图所示红色箭头所指的编辑框中输入包含括号的表达式,并以“#”作为结束符。(2)实现各种功能的操作方式 点击下图所示紫色箭头所指的“OK”按钮,则可以弹出匹配结果是否成功,若成功点击确定后会在黑色箭头所指的显示区域中列出堆栈出入过程。点击红色箭头所指的“CLEAR”按钮,则可以清空上次操作的结果进入下次匹配;点击绿色箭头所指的“EXIT”按钮则可以退出程序。4调试报告输入输出无输入弹出“输入为空,重新输入”。()()弹出提示没有以“#”结尾。()()#匹配成功并显示出堆栈出入过程。()#匹配成功并显示出堆栈出入过程。()#匹配失败,提示3号位置有误,建议修改,依次按照提示修改之后匹配成功。()(# )#提示3号位置输入有误 目前的问题:只可以判断相对应的括号位置是否匹配,没有考虑、()的优先级,无法识别例如“()”的错误;另外无法判别表达式的合法性,例如含有非法字符或者运算符号使用错误时:(3+),另外输入“()(# )#”时,依然会提示3号位置有误建议修改。5总结 通过进行此次实验,首先熟悉了MFC的基本使用,学会了在对话框视图中对一些控件添加事件处理函数;其次对堆栈的存储结构有了进一步的认识和了解,学习了栈定义以及与栈相关的基本操作函数的定义,例如初始化一个栈,进栈,出栈,以及判断栈满,栈空的条件;掌握了括号匹配的原理和方法,在程序运行过程中出现问题时,通过设置断点逐步调试程序,提高了效率。6源程序关键代码和结果 6.1 源程序关键代码 /“stack.h”#ifndef STACK_H#define STACK_H#include #include #define OK 1#define ERROR 0typedef int Status;struct elemchar e;int count;struct SignStack elem *base; elem *top; int stacksize;/定义堆栈Status InitStack(SignStack &s)/堆栈的初始化 s.base=(elem *)malloc(100*sizeof(elem); if(!s.base) return ERROR; s.top=s.base; s.stacksize=50; return OK;/压入堆栈的函数Status PushStack(SignStack &s,elem e) if(s.top-s.base=s.stacksize) s.base=(elem *)realloc(s.base,(s.stacksize+5)*sizeof(elem); s.top=s.base+s.stacksize; s.stacksize+=5; if(!s.base) return ERROR; *s.top=e; s.top+; return OK;/出栈函数Status PopStack(SignStack &s,elem &e) if(s.base=s.top) return ERROR; e=*(s.top-1); s.top-; return OK;/堆栈清空函数Status EmptyStack(SignStack &s) if(s.base=s.top) return OK; else return ERROR;#endif STACK_H/”signmathDlg.cpp”关键代码void CSignmatchDlg:OnOkButton() char *p;/定义一个字符型指针 elem Buff;/定义一个缓冲区 int errorpoint=0;/定义出错的位置 char showBuffer200;/显示缓冲区 strcpy(showBuffer,过程如下:n); UpdateData(TRUE);/更新编辑框类数据 p=m_input.GetBuffer(100);/将P指向字符串的首地址 if(m_input.IsEmpty() MessageBox(输入为空,重新输入); return ; if(*(p+strlen(p)-1)!=#) MessageBox(没有以#结尾); return ; SignStack sign; if(!InitStack(sign) MessageBox(堆栈初始化错误);return ; Buff.e=#; Buff.count=errorpoint; PushStack(sign,Buff);while(*p!=#) errorpoint+; switch(*p) case :Buff.e=*p; Buff.count=errorpoint; PushStack(sign,Buff); strcat(showBuffer,入栈 ); break; case (:Buff.e=*p; Buff.count=errorpoint; PushStack(sign,Buff); strcat(showBuffer,(入栈 ); break; case :Buff.e=*p; Buff.count=errorpoint; PushStack(sign,Buff); strcat(showBuffer,入栈 ); break; case :PopStack(sign,Buff); if(Buff.e!=) goto lebel; strcat(showBuffer,出栈 ); ;break;case :PopStack(sign,Buff); if(Buff.e!=) goto lebel; strcat(showBuffer,出栈 ); ;break; case ):PopStack(sign,Buff); if(Buff.e!=() goto lebel; strcat(showBuffer,)出栈 ); ;break; default: break; p+;/指针指向下一位 if(!EmptyStack(sign)/判断堆栈是否为空 PopStack(sign,Buff); if(Buff.e=#) MessageBox(括号匹配成功); else CString str; str.Format(_T( %d ),Buff.count); p=str.GetBuffer(10); strcat(p,号位置符号有误,建议修改); MessageBox(p); m_SHOW.SetWindowText(showBuffer); return ; m_SHOW.SetDlgItemText(1,dfdfsddsfs); UpdateData(TRUE);lebel: CString str; str.Format(_T( %d ),errorpoint); p=str.GetBuffer(10); strcat(p,号位置有误,建议修改); MessageBox(p); m_SHOW.SetWindowText(showBuffer); return ;/ TODO: Add your control notification handler code herevoid CSignmatchDlg:OnExitButton() exit(0);/正常退出/ TODO: Add your control notification handler code herevoid CSignmatchDlg:OnClearButton() m_SHOW.SetWindowTex

温馨提示

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

评论

0/150

提交评论