完整版郑州轻工业学院本科数据结构毕业课程设计总结报告Word文件下载.docx
《完整版郑州轻工业学院本科数据结构毕业课程设计总结报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《完整版郑州轻工业学院本科数据结构毕业课程设计总结报告Word文件下载.docx(30页珍藏版)》请在冰豆网上搜索。
清华大学出版社
《VisualC++程序设计--基础与实例分析》作者:
朱晴婷等出版社:
《数据结构算法实现及解析》作者:
高一凡出版社:
西安电子科技大学出版社
完成期限:
一周
指导教师签名:
课程负责人签名:
2008年12月20日
一、设计题目(任选其一)
二、需求分析
三、运行环境(软、硬件环境)
四、算法设计的思想
五、算法的流程图
六、算法设计分析
七、源代码
八、运行结果分析
九、收获及体会
一.设计题目
设计目的:
文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。
设计内容:
文章编辑
功能:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
要求
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"
全部字母数"
、"
数字个数"
空格个数"
文章总字数"
(3)输出删除某一字符串后的文章;
二.需求分析
随着个人电脑的迅速普及,各种实用的小型软件的开发和设计也变得更要必要了。
本软件是为电脑使用者做文本编辑而精心设计的,可以满足文本操作的大部分要求。
功能模块描述:
1打开文件:
该模块的功能主要是用于打开文本文件用于编辑。
用户可直接输入与之在同一个目录下的说有文本文件,也可以实用浏览按钮打开其它任何地方的任何文本文件。
默认文件名为me.txt,默认路径为同目录。
可使用“打开文件”按钮,也可使用系统菜单中的“文件\打开”
2.显示文本内容:
该模块的功能是显示已经打开的文本文件。
可使用“显示文件内容”按钮,也可使用系统菜单中的“编辑\显示”
3.插入行:
可使用“插入行”按钮,也可使用系统菜单中的“编辑\插入行”或右键菜单中的“插入行”打开插入行数据的对话框。
在第一个输入框中输入插入的位置,在第二个输入框中输入插入的总行数。
然后可以在弹出的输入框中输入要插入的数据。
4.删除行:
可使用“删除行”按钮,也可使用系统菜单中的“编辑\删除行”或右键菜单中的“删除行”打开删除行数据的对话框。
在第一个输入框中输入删除的起始位置,在第二个输入框中输入删除的总行数。
5.拷贝行:
可使用“拷贝行”按钮,也可使用系统菜单中的“编辑\拷贝行”打开拷贝行数据的对话框。
在第一个输入框中输入拷贝的起始位置,在第二个输入框中拷贝删除的总行数.在第三个输入框中输入要吧拷贝的数据插入的位置。
6.修改行:
可使用“修改行”按钮,也可使用系统菜单中的“编辑\修改行”打开修改行数据的对话框。
在第一个输入框中输入修改的行位置,在弹出输入框中输入新数据内容。
7.查找字符串:
可使用“查找字符串”按钮,也可使用系统菜单中的“编辑\查找字符串”打开查找字符串数据的对话框。
在输入框中输入要查找的字符串。
8.替换字符串:
可使用“替换字符串”按钮,也可使用系统菜单中的“编辑\替换字符串”打开替换字符串数据的对话框。
在第一个输入框中输入要替换的字符串,在第二个输入框中输入新数据内容。
9.存盘或另存为:
该模块可以保存文本内容到指定的文件。
10.统计各种字符的个数:
该模块可以统计出中文、英文、空格、数字及其它字符的个数和总字符数。
11.附加功能:
附加功能有游戏、绘图、记事本及查看系统时间。
功能分析:
本系统主要是用于文本编辑者的文档编辑,文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。
三.运行环境
×
VisualC++6.0带MFC基础类库,WindowsXP环境
IntelPentium以上CPU、64MB以上内存
推荐使用PIII以上CPU、128MB以上内存
四.算法设计的思想
计算机上的非数值处理的对象基本上都是字符串数据,随着语言加工程序的发展,产生了字符串处理的一系列的操作。
本软件所使用的基本操作和存储结构为采用串的堆分配存储结构,并定义相应的操作函数。
文本编辑的操作函数调用这些方法并结合MFC的库函数实现文本编辑的图形界面。
串的堆分配存储:
structHString
{
char*ch;
//若是非空串,则按串长分配存储区,否则ch为NULL
intlength;
//串长度
};
串的堆分配存储的实现函数:
StatusStrAssign(HString&
T,char*chars);
StatusStrCopy(HString&
T,HStringS);
StatusStrEmpty(HStringS);
intStrCompare(HStringS,HStringT);
intStrLength(HStringS);
StatusClearString(HString&
S);
StatusConcat(HString&
T,HStringS1,HStringS2);
StatusSubString(HString&
Sub,HStringS,intpos,intlen);
voidInitString(HString&
T);
intIndex(HStringS,HStringT,intpos);
//严蔚敏《数据结构》算法4.1
StatusStrInsert(HString&
S,intpos,HStringT);
//算法4.4;
StatusStrDelete(HString&
S,intpos,intlen);
StatusReplace(HString&
S,HStringT,HStringV);
voidDestroyString();
voidStrPrint(HStringT);
现在主要分析一下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长度之和的存储空间,然后进行复制。
文本编辑的操作函数:
voidOpen();
char*List();
voidInsert();
voidDelete();
voidCopy();
voidModify();
voidSearch();
voidReplace();
voidSave();
五.算法的流程图
主程序的流程图:
六.算法设计分析
structHString
{
};
串的堆分配存储的主要实现函数分析:
StatusStrCopy(HString&
T,HStringS)
{//初始条件:
串S存在。
操作结果:
由串S复制得串T
inti;
if(T.ch)
free(T.ch);
//释放T原有空间
T.ch=(char*)malloc(S.length*sizeof(char));
//分配串空间
if(!
T.ch)//分配串空间失败
exit(OVERFLOW);
for(i=0;
i<
S.length;
i++)//拷贝串
T.ch[i]=S.ch[i];
T.length=S.length;
returnOK;
}
此函数可以把一个串T释放,然后吧串S复制到T,得到新串。
时间复杂度为O(S.length);
intIndex(HStringS,HStringT,intpos)//严蔚敏《数据结构》算法4.1
{//T为非空串。
若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
intn,m,i;
HStringsub;
InitString(sub);
if(pos>
0)
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<
=n-m+1)
SubString(sub,S,i,m);
if(StrCompare(sub,T)!
=0)
++i;
else
returni;
return0;
利用判等、求串长和求子串的操作可以实现求子串位置定位函数Index(HStringS,HStringT,intpos),T为非空串。
若主串S中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0,时间复杂度为O(
);
文本编辑器的主要功能函数的基本操作:
#defineMAX_LEN200//文件最大行数
#defineLINE_LEN200//每行字符数最大值+1
#defineNAME_LEN50//文件名最大长度(包括盘符、路径)+1
voidOpen();
文本编辑器的主要功能函数算法分析:
voidInsert()
{//插入行
inti,l,m;
CInsertDlgdlg;
if(IDOK==dlg.DoModal())//在第l行前插m行,请输入lm:
l=dlg.m_insertl;
m=dlg.m_insertm;
if(n+m>
MAX_LEN)
MessageBox(hWnd,"
插入行太多\n"
"
提示"
MB_OK|MB_ICONEXCLAMATION);
return;
if(n>
=l-1&
&
l>
for(i=n-1;
i>
=l-1;
i--)
T[i+m]=T[i];
n+=m;
for(i=l-1;
l-1+m;
i++)
{
CInsertInforDlgindlg;
if(IDOK==indlg.DoModal())//顺序输入待插入内容:
{
strcpy(str,indlg.m_insertinfor.GetBuffer(0));
}
InitString(T[i]);
StrAssign(T[i],str);
}
行超出范围\n"
"
MB_OK|MB_ICONEXCLAMATION);
}
上述算法是对插入行数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。
先调用输入框的对话框输入插入的起始位置,第二个输入框是插入的总行数,它可以支持插入多行。
voidReplace()
{//替换字符串
inti,k,f=1,count=0;
//f为继续替换标志
HStrings,t;
CReplaceDlgdlg;
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);
n&
f;
i++)//逐行查找、替换
k=1;
//由每行第1个字符起查找
while(k)
k=Index(T[i],s,k);
//由本行的第k个字符开始查找
if(k)//找到
count++;
CStringstrS;
strS.Format("
第%d行:
%s\n第%d个字符处找到。
是否替换(Y/N)?
"
i+1,T[i].ch,k);
if(IDYES==MessageBox(hWnd,strS,"
MB_YESNO|MB_ICONQUESTION))
{
StrDelete(T[i],k,StrLength(s));
StrInsert(T[i],k,t);
}
if(IDNO==MessageBox(hWnd,"
继续替换吗(Y/N)?
\n"
{//中断查找、替换
f=0;
break;
else
k+=StrLength(t);
if(f)
没找到\n"
MB_OK);
CStringstrT;
strT.Format("
共替换%d个\n"
count);
strT+=dlg.m_replacey;
MessageBox(hWnd,strT,"
替换结果"
上述算法是对替换数据函数的定义,它和MFC的一些库函数有很多的嵌套调用,需要包含很多头文件。
先调用输入框的对话框输入要被替换的字符串,第二个输入框是输入新字符串,它可以支持一次替换多行,甚至全部替换。
七.源代码
以下为自己添加的头文件程序:
//c1.h(程序名)
#include<
string.h>
ctype.h>
malloc.h>
//malloc()等
limits.h>
//INT_MAX等
stdio.h>
//EOF(=^Z或F6),NULL
stdlib.h>
//atoi()
io.h>
//eof()
math.h>
//floor(),ceil(),abs()
process.h>
//exit()
iostream.h>
//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedefintStatus;
//Status是函数的类型,其值是函数结果状态代码,如OK等
typedefintBoolean;
//Boolean是布尔类型,其值是TRUE或FALSE
//c4-2.h串的堆分配存储
//算法4.1
//严蔚敏《数据结构》算法4.4;
//textedit.h文本行编辑
#include"
c1.h"
c4_2.h"
//采用串的堆分配存储结构,包含串的堆分配基本操作
以下为自己添加的源文件程序(即各种函数的实现部分):
//c4_2.cpp文件
#include"
StdAfx.h"
StatusStrAssign(HString&
T,char*chars)
{//生成一个其值等于串常量chars的串T
inti,j;
i=strlen(chars);
//求chars的长度i
i)
{//chars的长度为0
T.ch=NULL;
T.length=0;
{//chars的长度不为0
T.ch=(char*)malloc(i*sizeof(char));
for(j=0;
j<
i;
j++)//拷贝串
T.ch[j]=chars[j];
T.length=i;
StatusStrEmpty(HStringS)
若S为空串,则返回TRUE,否则返回FALSE
if(S.length==0&
S.ch==NULL)
returnTRUE;
returnFALSE;
intStrCompare(HStringS,HStringT)
{//若S>
T,则返回值>
0;
若S=T,则返回值=0;
若S<
T,则返回值<
S.length&
T.length;
++i)
if(S.ch[i]!
=T.ch[i])
returnS.ch[i]-T.ch[i];
returnS.length-T.length;
intStrLength(HStringS)
{//返回S的元素个数,称为串的长度
re