《郑州轻工业学院本科数据结构课程设计总结报告.doc》由会员分享,可在线阅读,更多相关《郑州轻工业学院本科数据结构课程设计总结报告.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、郑州轻工业学院本科数据结构课程设计总结报告设计题目:文本编辑器学生姓名:罗启福系 别:计算机科学与工程专 业:计算机科学与技术班 级:06-1学 号:6指导教师:金保华2008 年 12 月 20 日郑州轻工业学院课 程 设 计 任 务 书题目 文本编辑器 专业、班级 计科06-1 学号 26 姓名 罗启福 主要内容:(1)打开文本文件(2)显示文本内容(3)插入文本行(可一次性插入多行)(4)删除指定文本行(可一次性删除多行)(5)拷贝指定的多行(6)修改行(7)查找指定的字符串 (8)替换指定的字符串(支持全部替换) (9) 统计字数 (10) 存盘 (11)另存为 (12)系统菜单、右键
2、菜单(右击显示框或其它地方)(13)附带功能(游戏、系统时间、绘图、记事本)基本要求:要求完成:输出整篇文章内容;在文章尾部追加一行;在文章指定行插入新行;修改文章指定行;删除文章指定行;统计某一字符串在文章中出现的次数;统计文章的全部字母数;统计文章的数字个数;保存文章到磁盘指定文件;加载磁盘文章文件。运行环境:WindowsXP, 带有MFC基础类库的VC+6.0操作数据:打开与应用程序在同目录下的me.txt 或file.dat,也可使用浏览功能打开任意文本文件,然后进行各种操作。主要参考资料等:数据结构(C语言版) 作者:严蔚敏 吴伟民 出版社:清华大学出版社Visual C+程序设计
3、-基础与实例分析作者:朱晴婷 等 出版社:清华大学出版社数据结构算法实现及解析 作者:高一凡 出版社:西安电子科技大学出版社完 成 期 限: 一周 指导教师签名: 课程负责人签名: 2008年 12 月 20 日目录一、 设计题目(任选其一)二、 需求分析三、 运行环境(软、硬件环境)四、 算法设计的思想五、 算法的流程图六、 算法设计分析七、 源代码八、 运行结果分析九、 收获及体会一. 设计题目设计目的:文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。设计内容:文章编辑功能:输入一页文字,程序可以统计出文字
4、、数字、空格的个数。静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。 存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出全部字母数、数字个数、空格个数、文章总字数(3)输出删除某一字符串后的文章;要求完成:输出整篇文章内容;在文章尾部追加一行;在文章指定行插入新行;修改文章指定行;删除文章指定行;统计某一字
5、符串在文章中出现的次数;统计文章的全部字母数;统计文章的数字个数;保存文章到磁盘指定文件;加载磁盘文章文件。二需求分析随着个人电脑的迅速普及,各种实用的小型软件的开发和设计也变得更要必要了。本软件是为电脑使用者做文本编辑而精心设计的,可以满足文本操作的大部分要求。文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。功能模块描述:1 打开文件:该模块的功能主要是用于打开文本文件用于编辑。用户可直接输入与之在同一个目录下的说有文本文件,也可以实用浏览按钮打开其它任何地方的任何文本文件。默认文件名为me.txt,默认路径
6、为同目录。可使用“打开文件”按钮,也可使用系统菜单中的“文件打开”2显示文本内容:该模块的功能是显示已经打开的文本文件。可使用“显示文件内容”按钮,也可使用系统菜单中的“编辑显示”3插入行:可使用“插入行”按钮,也可使用系统菜单中的“编辑插入行”或右键菜单中的“插入行”打开插入行数据的对话框。在第一个输入框中输入插入的位置,在第二个输入框中输入插入的总行数。然后可以在弹出的输入框中输入要插入的数据。4.删除行:可使用“删除行”按钮,也可使用系统菜单中的“编辑删除行” 或右键菜单中的“删除行”打开删除行数据的对话框。在第一个输入框中输入删除的起始位置,在第二个输入框中输入删除的总行数。5.拷贝行
7、:可使用“拷贝行”按钮,也可使用系统菜单中的“编辑拷贝行”打开拷贝行数据的对话框。在第一个输入框中输入拷贝的起始位置,在第二个输入框中拷贝删除的总行数.在第三个输入框中输入要吧拷贝的数据插入的位置。6.修改行:可使用“修改行”按钮,也可使用系统菜单中的“编辑修改行”打开修改行数据的对话框。在第一个输入框中输入修改的行位置,在弹出输入框中输入新数据内容。7.查找字符串:可使用“查找字符串”按钮,也可使用系统菜单中的“编辑查找字符串”打开查找字符串数据的对话框。在输入框中输入要查找的字符串。8.替换字符串:可使用“替换字符串”按钮,也可使用系统菜单中的“编辑替换字符串”打开替换字符串数据的对话框。
8、在第一个输入框中输入要替换的字符串,在第二个输入框中输入新数据内容。9.存盘或另存为:该模块可以保存文本内容到指定的文件。10.统计各种字符的个数:该模块可以统计出中文、英文、空格、数字及其它字符的个数和总字符数。11.附加功能:附加功能有游戏、绘图、记事本及查看系统时间。功能分析:本系统主要是用于文本编辑者的文档编辑,文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。三.运行环境VisualC+6.0带MFC基础类库,WindowsXP环境Intel Pentium以上CPU、64MB以上内存推荐使用PIII以
9、上CPU、128MB以上内存四.算法设计的思想 计算机上的非数值处理的对象基本上都是字符串数据,随着语言加工程序的发展,产生了字符串处理的一系列的操作。本软件所使用的基本操作和存储结构为采用串的堆分配存储结构,并定义相应的操作函数。文本编辑的操作函数调用这些方法并结合MFC的库函数实现文本编辑的图形界面。串的堆分配存储: struct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度 ; 串的堆分配存储的实现函数: Status StrAssign(HString &T,char *chars); Status St
10、rCopy(HString &T,HString S); Status StrEmpty(HString S); int StrCompare(HString S,HString T); int StrLength(HString S); Status ClearString(HString &S); Status Concat(HString &T,HString S1,HString S2); Status SubString(HString &Sub, HString S,int pos,int len); void InitString(HString &T); int Index(H
11、String S,HString T,int pos) ;/ 严蔚敏数据结构算法4.1 Status StrInsert(HString &S,int pos,HString T); / 算法4.4; Status StrDelete(HString &S,int pos,int len); Status Replace(HString &S,HString T,HString V); void DestroyString(); void StrPrint(HString T);现在主要分析一下Index(S,T,pos)和StrInsert的基本思想:Index(S,T,pos):在主串S中
12、取第i(i的初值为pos)个字符起、长度和串T相等的字串和串T比较,若相等,则求出函数值为i,否则i值增1直至串S中不存在和串T相等的子串为止。StrInsert(&S,pos,T):为串S重新分配大小等于串S和串T长度之和的存储空间,然后进行复制。文本编辑的操作函数:void Open(); char* List(); void Insert(); void Delete(); void Copy(); void Modify(); void Search(); void Replace(); void Save();五. 算法的流程图主程序的流程图:文本编辑器系统使用“打开文件”按钮或“文
13、件打开”打开文本文件“显示文本内容”按钮 或“编辑显示”显示文本内容选择各种操作其它操作拷贝删除插入修改查找删除行操作拷贝行操作修改行操作查找字符串操作插入行操作其它操作其它操作其它操作其它操作输入删除行起始位置和删除的总行数输入拷贝行起始位置、总行数和插入的位置输入要修改的行号输入待查找的字符串输入插入行位置和插入的总行数继续查找Yes输入修改内容输入插入内容NY查找结束查找继续拷贝结束修改结束输入插入内容插入结束其它各种操作另存附加功能存盘统计替换替换字符串操作统计字符个数操作保存完成输入另存名附加功能操作选择继续替换继续替换Y输入待替换的字符串和替换字符串附加功能操作略结束替换N六. 算
14、法设计分析本软件所使用的基本操作和存储结构为采用串的堆分配存储结构,并定义相应的操作函数。文本编辑的操作函数调用这些方法并结合MFC的库函数实现文本编辑的图形界面。串的堆分配存储:struct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度;串的堆分配存储的主要实现函数分析:Status StrCopy(HString &T,HString S) / 初始条件: 串S存在。操作结果: 由串S复制得串T int i; if(T.ch) free(T.ch); / 释放T原有空间 T.ch=(char*)malloc(
15、S.length*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(i=0;i0) n=StrLength(S); m=StrLength(T); i=pos; while(iMAX_LEN)MessageBox(hWnd,插入行太多n,提示,MB_OK|MB_ICONEXCLAMATION );return;if(n=l-1&l0)for(i=n-1;i=l-1;i-)Ti+m=Ti;n+=m;for(i=l-1;il-1+m;i+)CInsertInforDlg indlg;if(IDOK=indlg.DoModal
16、()/顺序输入待插入内容:strcpy(str,indlg.m_insertinfor.GetBuffer(0);InitString(Ti);StrAssign(Ti,str);elseMessageBox(hWnd,行超出范围n,提示,MB_OK|MB_ICONEXCLAMATION );上述算法是对插入行数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。先调用输入框的对话框输入插入的起始位置,第二个输入框是插入的总行数,它可以支持插入多行。void Replace() / 替换字符串int i,k,f=1,count=0; / f为继续替换标志HString s
17、,t;CReplaceDlg dlg;if(dlg.DoModal()=IDOK)/ 输入待替换的字符串:strcpy(str,dlg.m_replacey.GetBuffer(0);strcpy(strr,dlg.m_replaceh.GetBuffer(0);InitString(s);StrAssign(s,str);InitString(t);StrAssign(t,strr);for(i=0;in&f;i+) / 逐行查找、替换k=1; / 由每行第1个字符起查找while(k)k=Index(Ti,s,k); / 由本行的第k个字符开始查找if(k) / 找到count+;CStr
18、ing strS;strS.Format(第%d行: %sn第%d个字符处找到。是否替换(Y/N)? ,i+1,Ti.ch,k);if(IDYES=MessageBox(hWnd,strS,提示,MB_YESNO|MB_ICONQUESTION )StrDelete(Ti,k,StrLength(s);StrInsert(Ti,k,t);if(IDNO=MessageBox(hWnd,继续替换吗(Y/N)?n,提示,MB_YESNO|MB_ICONQUESTION )/ 中断查找、替换f=0;break;elsek+=StrLength(t);if(f)MessageBox(hWnd,没找到n
19、,提示,MB_OK);CString strT;strT.Format(共替换 %d个n,count);strT+=dlg.m_replacey;MessageBox(hWnd,strT,替换结果,MB_OK|MB_ICONEXCLAMATION );上述算法是对替换数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。先调用输入框的对话框输入要被替换的字符串,第二个输入框是输入新字符串,它可以支持一次替换多行,甚至全部替换。七. 源代码以下为自己添加的头文件程序:/ c1.h (程序名) #include #include #include / malloc()等 #i
20、nclude / INT_MAX等 #include / EOF(=Z或F6),NULL #include / atoi() #include / eof() #include / floor(),ceil(),abs() #include / exit() #include / cout,cin / 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 / #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typ
21、edef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE/ c4-2.h 串的堆分配存储 struct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度 ; Status StrAssign(HString &T,char *chars); Status StrCopy(HString &T,HString S); Status StrEmpty(HString S); int
22、StrCompare(HString S,HString T); int StrLength(HString S); Status ClearString(HString &S); Status Concat(HString &T,HString S1,HString S2); Status SubString(HString &Sub, HString S,int pos,int len); void InitString(HString &T); int Index(HString S,HString T,int pos) ;/ 算法4.1 Status StrInsert(HString
23、 &S,int pos,HString T); / 严蔚敏数据结构算法4.4; Status StrDelete(HString &S,int pos,int len); Status Replace(HString &S,HString T,HString V); void DestroyString(); void StrPrint(HString T);/textedit.h 文本行编辑 #includec1.h #includec4_2.h / 采用串的堆分配存储结构,包含串的堆分配基本操作 #define MAX_LEN 200 / 文件最大行数 #define LINE_LEN 2
24、00 / 每行字符数最大值+1 #define NAME_LEN 50 / 文件名最大长度(包括盘符、路径)+1 void Open(); char* List(); void Insert(); void Delete(); void Copy(); void Modify(); void Search(); void Replace(); void Save();以下为自己添加的源文件程序(即各种函数的实现部分):/c4_2.cpp文件#includeStdAfx.h#includec4_2.hStatus StrAssign(HString &T,char *chars) / 生成一个其
25、值等于串常量chars的串T int i,j; if(T.ch) free(T.ch); / 释放T原有空间 i=strlen(chars); / 求chars的长度i if(!i) / chars的长度为0 T.ch=NULL; T.length=0; else / chars的长度不为0 T.ch=(char*)malloc(i*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(j=0;ji;j+) / 拷贝串 T.chj=charsj; T.length=i; return OK; Status StrCopy(H
26、String &T,HString S) / 初始条件: 串S存在。操作结果: 由串S复制得串T int i; if(T.ch) free(T.ch); / 释放T原有空间 T.ch=(char*)malloc(S.length*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(i=0;iT,则返回值0;若S=T,则返回值=0;若ST,则返回值0 int i; for(i=0;iS.length&iT.length;+i) if(S.chi!=T.chi) return S.chi-T.chi; return S.len
27、gth-T.length; int StrLength(HString S) / 返回S的元素个数,称为串的长度 return S.length; Status ClearString(HString &S) / 将S清为空串 if(S.ch) free(S.ch); S.ch=NULL; S.length=0; return OK; Status Concat(HString &T,HString S1,HString S2) / 用T返回由S1和S2联接而成的新串 int i; if(T.ch) free(T.ch); / 释放旧空间 T.length=S1.length+S2.lengt
28、h; T.ch=(char *)malloc(T.length*sizeof(char); if(!T.ch) exit(OVERFLOW); for(i=0;iS1.length;i+) T.chi=S1.chi; for(i=0;iS2.length;i+) T.chS1.length+i=S2.chi; return OK; Status SubString(HString &Sub, HString S,int pos,int len) / 用Sub返回串S的第pos个字符起长度为len的子串。 / 其中,1posStrLength(S)且0lenStrLength(S)-pos+1
29、int i; if(posS.length|lenS.length-pos+1) return ERROR; if(Sub.ch) free(Sub.ch); / 释放旧空间 if(!len) / 空子串 Sub.ch=NULL; Sub.length=0; else / 完整子串 Sub.ch=(char*)malloc(len*sizeof(char); if(!Sub.ch) exit(OVERFLOW); for(i=0;i0) n=StrLength(S); m=StrLength(T); i=pos; while(i=n-m+1) SubString(sub,S,i,m); if(
30、StrCompare(sub,T)!=0) +i; else return i; return 0; Status StrInsert(HString &S,int pos,HString T) / 算法4.4 / 1posStrLength(S)+1。在串S的第pos个字符之前插入串T int i; if(posS.length+1) / pos不合法 return ERROR; if(T.length) / T非空,则重新分配空间,插入T S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char); if(!S.ch) exit(OV
31、ERFLOW); for(i=S.length-1;i=pos-1;-i) / 为插入T而腾出位置 S.chi+T.length=S.chi; for(i=0;iT.length;i+) S.chpos-1+i=T.chi; / 插入T S.length+=T.length; return OK; Status StrDelete(HString &S,int pos,int len) / 从串S中删除第pos个字符起长度为len的子串 int i; if(S.lengthpos+len-1) exit(ERROR); for(i=pos-1;i=S.length-len;i+) S.chi=
32、S.chi+len; S.length-=len; S.ch=(char*)realloc(S.ch,S.length*sizeof(char); return OK; Status Replace(HString &S,HString T,HString V) / 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) / 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 int i=1; / 从串S的第一个字符起查找串T if(StrEmpty(T) / T是空串 return ERROR; do i=Index(S,T,i); / 结果i为从上一个i之后找到的子
33、串T的位置 if(i) / 串S中存在串T StrDelete(S,i,StrLength(T); / 删除该串T StrInsert(S,i,V); / 在原串T的位置插入串V i+=StrLength(V); / 在插入的串V后面继续查找串T while(i); return OK; void DestroyString() / 堆分配类型的字符串无法销毁 void StrPrint(HString T) / 输出T字符串。另加 int i; for(i=0;iT.length;i+) printf(%c,T.chi); printf(n); /textedit.cpp/ algo4-3.
34、cpp 文本行编辑#includeStdAfx.h#include kecheng.h#include openDlg.h#include InsertDlg.h#include InsertInforDlg.h#include DeleteDlg.h#include CopyDlg.h#include ModifyDlg.h#include ModifyInforDlg.h#include SearchDlg.h#include ReplaceDlg.h#include windows.h#includetextedit.h#includec1.h#includec4_2.h / 采用串的堆
35、分配存储结构#define MAX_LEN 200 / 文件最大行数#define LINE_LEN 200 / 每行字符数最大值+1#define NAME_LEN 50 / 文件名最大长度(包括盘符、路径)+1/ 全局变量HString TMAX_LEN;char strLINE_LEN,strrLINE_LEN,filenameNAME_LEN=;FILE *fp;int n=0; / 文件行数HWND hWnd;void Open() / 打开文件(新或旧)int i;if(filename0) / 文件已打开MessageBox(hWnd,已存在打开的文件n,提示,MB_OK|MB_ICONINFORMATION );elseCopenDlg dlg;if(IDOK=dlg.DoModal()/filename=dlg.m_filename;strcpy(char*)filename,dlg.m_filename.GetBuffer(0);/strcpy拷贝字符串,遇到0就结束拷贝;el