1、清华大学出版社Visual C+程序设计-基础与实例分析作者:朱晴婷 等 出版社:数据结构算法实现及解析 作者:高一凡 出版社:西安电子科技大学出版社完 成 期 限: 一周 指导教师签名: 课程负责人签名:2008年 12 月 20 日一、 设计题目(任选其一)二、 需求分析三、 运行环境(软、硬件环境)四、 算法设计的思想五、 算法的流程图六、 算法设计分析七、 源代码八、 运行结果分析九、 收获及体会一. 设计题目设计目的:文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。设计内容:文章编辑功能:输入一页文字
2、,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。 存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出全部字母数、数字个数空格个数文章总字数(3)输出删除某一字符串后的文章;二需求分析随着个人电脑的迅速普及,各种实用的小型软件的开发和设计也变得更要必要了。本软件是为电脑
3、使用者做文本编辑而精心设计的,可以满足文本操作的大部分要求。功能模块描述:1 打开文件:该模块的功能主要是用于打开文本文件用于编辑。用户可直接输入与之在同一个目录下的说有文本文件,也可以实用浏览按钮打开其它任何地方的任何文本文件。默认文件名为me.txt,默认路径为同目录。可使用“打开文件”按钮,也可使用系统菜单中的“文件打开”2显示文本内容: 该模块的功能是显示已经打开的文本文件。可使用“显示文件内容”按钮,也可使用系统菜单中的“编辑显示”3插入行:可使用“插入行”按钮,也可使用系统菜单中的“编辑插入行”或右键菜单中的“插入行”打开插入行数据的对话框。在第一个输入框中输入插入的位置,在第二个
4、输入框中输入插入的总行数。然后可以在弹出的输入框中输入要插入的数据。4.删除行:可使用“删除行”按钮,也可使用系统菜单中的“编辑删除行” 或右键菜单中的“删除行”打开删除行数据的对话框。在第一个输入框中输入删除的起始位置,在第二个输入框中输入删除的总行数。5.拷贝行:可使用“拷贝行”按钮,也可使用系统菜单中的“编辑拷贝行”打开拷贝行数据的对话框。在第一个输入框中输入拷贝的起始位置,在第二个输入框中拷贝删除的总行数.在第三个输入框中输入要吧拷贝的数据插入的位置。6.修改行:可使用“修改行”按钮,也可使用系统菜单中的“编辑修改行”打开修改行数据的对话框。在第一个输入框中输入修改的行位置,在弹出输入
5、框中输入新数据内容。7.查找字符串:可使用“查找字符串”按钮,也可使用系统菜单中的“编辑查找字符串”打开查找字符串数据的对话框。在输入框中输入要查找的字符串。8.替换字符串:可使用“替换字符串”按钮,也可使用系统菜单中的“编辑替换字符串”打开替换字符串数据的对话框。在第一个输入框中输入要替换的字符串,在第二个输入框中输入新数据内容。9.存盘或另存为: 该模块可以保存文本内容到指定的文件。10.统计各种字符的个数: 该模块可以统计出中文、英文、空格、数字及其它字符的个数和总字符数。11.附加功能: 附加功能有游戏、绘图、记事本及查看系统时间。功能分析:本系统主要是用于文本编辑者的文档编辑,文本编
6、辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。三.运行环境VisualC+6.0带MFC基础类库,WindowsXP环境Intel Pentium以上CPU、64MB以上内存推荐使用PIII以上CPU、128MB以上内存四.算法设计的思想 计算机上的非数值处理的对象基本上都是字符串数据,随着语言加工程序的发展,产生了字符串处理的一系列的操作。本软件所使用的基本操作和存储结构为采用串的堆分配存储结构,并定义相应的操作函数。文本编辑的操作函数调用这些方法并结合MFC的库函数实现文本编辑的图形界面。串的堆分配存储: st
7、ruct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度 ; 串的堆分配存储的实现函数: Status StrAssign(HString &T,char *chars); Status StrCopy(HString &T,HString S); Status StrEmpty(HString S); int StrCompare(HString S,HString T); int StrLength(HString S); Status ClearString(HString &S); Status Conca
8、t(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 &S,int pos,HString T); / 算法4.4; Status StrDelete(HString &S,int pos,int len); Status Replace(HS
9、tring &S,HString T,HString V); void DestroyString(); void StrPrint(HString T);现在主要分析一下Index(S,T,pos)和StrInsert的基本思想:Index(S,T,pos):在主串S中取第i(i的初值为pos)个字符起、长度和串T相等的字串和串T比较,若相等,则求出函数值为i,否则i值增1直至串S中不存在和串T相等的子串为止。StrInsert(&S,pos,T):为串S重新分配大小等于串S和串T长度之和的存储空间,然后进行复制。文本编辑的操作函数:void Open(); char* List(); vo
10、id Insert(); void Delete(); void Copy(); void Modify(); void Search(); void Replace(); void Save();五. 算法的流程图主程序的流程图:六. 算法设计分析struct HString;串的堆分配存储的主要实现函数分析:Status StrCopy(HString &T,HString S) / 初始条件: 串S存在。操作结果: 由串S复制得串T int i; if(T.ch) free(T.ch); / 释放T原有空间 T.ch=(char*)malloc(S.length*sizeof(char)
11、; / 分配串空间 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&l for(i=n-1;i=l-1;i-) Ti+m=Ti; n+=m; for(i=l-1;l-1+m;i+) CInsertInforDlg indlg; if(IDOK=indlg.DoModal()/顺序输入待插入内容: s
12、trcpy(str,indlg.m_insertinfor.GetBuffer(0); InitString(Ti); StrAssign(Ti,str); 行超出范围n,MB_OK|MB_ICONEXCLAMATION );上述算法是对插入行数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。先调用输入框的对话框输入插入的起始位置,第二个输入框是插入的总行数,它可以支持插入多行。void Replace() / 替换字符串 int i,k,f=1,count=0; / f为继续替换标志 HString s,t; CReplaceDlg dlg; if(dlg.DoMo
13、dal()=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);n&f;i+) / 逐行查找、替换 k=1; / 由每行第1个字符起查找 while(k) k=Index(Ti,s,k); / 由本行的第k个字符开始查找 if(k) / 找到 count+; CString strS; strS.Format(第%d行:
14、 %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 / 中断查找、替换 f=0; break; else k+=StrLength(t); if(f)没找到n,MB_OK); CString strT; strT.Format(共替换 %d个n,count); strT+=dlg.m_r
15、eplacey; MessageBox(hWnd,strT,替换结果上述算法是对替换数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。先调用输入框的对话框输入要被替换的字符串,第二个输入框是输入新字符串,它可以支持一次替换多行,甚至全部替换。七. 源代码以下为自己添加的头文件程序:/ c1.h (程序名) #includectype.hmalloc.h / malloc()等limits.h / INT_MAX等stdio.h / EOF(=Z或F6),NULLstdlib.h / atoi()io.h / eof()math.h / floor(),ceil(),a
16、bs()process.h / exit()iostream.h / cout,cin / 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 / #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typedef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE/ c4-2.h
17、 串的堆分配存储/ 算法4.1 / 严蔚敏数据结构算法4.4;/textedit.h 文本行编辑 #includec1.hc4_2.h / 采用串的堆分配存储结构,包含串的堆分配基本操作以下为自己添加的源文件程序(即各种函数的实现部分):/c4_2.cpp文件#includeStdAfx.hStatus StrAssign(HString &T,char *chars) / 生成一个其值等于串常量chars的串T int i,j; i=strlen(chars); / 求chars的长度ii) / chars的长度为0 T.ch=NULL; T.length=0; / chars的长度不为0 T.ch=(char*)malloc(i*sizeof(char); for(j=0;jT,则返回值0;若S=T,则返回值=0;若ST,则返回值S.length&T.length;+i) if(S.chi!=T.chi) return S.chi-T.chi; return S.length-T.length; int StrLength(HString S) / 返回S的元素个数,称为串的长度 re
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1