数据结构课程设计文章编辑器报告.docx
《数据结构课程设计文章编辑器报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计文章编辑器报告.docx(23页珍藏版)》请在冰点文库上搜索。
数据结构课程设计文章编辑器报告
学号
天津城市建设学院
数据结构课程设计
设计说明书
文章编辑
起止日期:
2012年1月2日至2012年1月6日
学生姓名
班级
09计算机一班
成绩
指导教师(签字)
电子与信息工程系
2012年1月6日
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系计算机科学与技术专业09级1班级
课程设计名称:
数据结构课程设计
设计题目:
文章编辑
完成期限:
自2012年1月2日至2012年1月6日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;
(4)认真编写课程设计报告。
三、设计内容
文章编辑程序
静态存储一页文章,每行最多不超过80个字符,共N行,要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
文章编辑程序
一、需求分析
文章编辑,顾名思义就是对文章进行读写、统计、修改等操作。
首先我们需要通过函数读取或者录入文章,然后设计模块统计需要分类统计各类字符的个数,当然有时候我们也需要查询某个字符或者字符串在文章中出现的次数,对于某个字符或者字符串,后来经过改进需要删除,就要设计函数实现,并且为了保证文本的页面一致性,我们需要实现分行输出,并且在删除子串以后后续字符前移。
为此,我设计了文章编辑程序。
二、总体设计
程序组成框图
程序流程图
三、详细设计
程序主要包括六个模块
第一个模块是是文本获取模块,由三个函数组成,getdata分别调用getdata1、getdata2,实现读取文件和键盘输入两种文本获取方式
函数伪代码如下
Voidgetdata()
{
Case1:
getadata1();
Case2:
getdata2();
}
Voidgetdata1()
{
f1=fopen(filename,"r");//以文件名打开文件
while((a=getc(f1))!
=EOF)
{
if(j==79){s[i++][j]='\n';j=0;}
if(a!
='\n'){s[i][j++]=a;}
elses[i++][j]=a;
}
}
Voidgetdata2()
{
while((a=getchar())!
='#')//键盘输入文本
{
if(j==79){s[i++][j]='\n';j=0;}
if(a!
='\n'){s[i][j++]=a;}
elses[i++][j]=a;
}
}
第二个模块是文本输出模块,通过函数show_text()实现,伪代码如下:
voidText:
:
show_text()
{
cout<<"文本如下:
"<}
第三个模块是指令集显示模块,便于随时查看命令,进行新的操作
函数伪代码”
voidText:
:
help()
{cout<<"请选择操作指令"<cout<<"================================================================================"<cout<<"--------☆count:
分别统计各类字符总数☆--------"<cout<<"--------☆search:
统计所查字符☆--------"<cout<<"--------☆delete:
删除特定字符☆--------"<cout<<"--------☆help:
查看程序指令集合☆--------"<cout<<"--------☆return:
返回选择文件☆--------"<cout<<"--------☆exit:
退出文本编辑程序☆--------"<cout<<"================================================================================"<}
第四个模块是分类统计字符模块,用来统计各类字符信息并传递到终端。
通过voidText:
:
count()函数实现,函数伪代码:
voidText:
:
count()//分别统计各类字符个数
{
intcc,cp,cn,co,sum;
cc=cp=cn=co=sum=0;
for(inti=0;ifor(intj=0;j<80;j++)
{
扫描并分类统计字符信息
}
cout<<"文章字符统计如下"<cout<<"字母个数为:
"<cout<<"空格个数为:
"<cout<<"数字个数为:
"<cout<<"文章总字数:
"<}
第五个模块是子串查找模块,该模块对用户在终端输入的子串在目标串中运用顺序查找进行检索,统计匹配次数,并将结果反馈给用户,由voidText:
:
search_str()函数实现
函数伪代码:
voidText:
:
search_str()
{
charstr[80],*p;intq,count=0;
cout<<"请输入一个字符子串:
"<cin>>str;
p=str;/
匹配…..
cout<"<}
第六个模块是子串删除模块,该模块对用户输入的子串在目标串中运用顺序查找进行检索并删除,后续字符前移,通过voidText:
:
delete_str()函数实现
函数伪代码:
voidText:
:
search_str()
{
charstr[80],*p;intq,count=0;
cout<<"请输入一个字符子串:
"<cin>>str;
p=str;
匹配并删除
cout<<"删除字符"<"<show_text();
}
四、调试与测试
修改程序能够正确编译执行后出现的问题及解决方法:
1、文本输出部分正确,后面出现乱码。
查找资料说是没有对数组内存初始化,可以通过memset函数实现,在获取文本的时候同时对数组内存初始化,解决问题。
加上memset函数之后
2、分类统计字符的时候输出异常。
具体是文章总字数sum不正确,仔细检查是for循环的过程中,sum每次都自增,没有设置自增条件,通过对sum++加上if条件后解决问题。
加上自增if条件后
3、删除子串时如果遇见同一子串连续出现数次,只能删除一半
这是因为每次匹配时j的值变化,需要还原,然后J++如果不删除前面匹配过直接还原即可,删除的话后续子串前移,自增后前移的第一个值将不会匹配,通过设置不同的j值还原解决
五、源程序及运行结果
程序源代码:
#include
#include//输入输出文件流类头文件
usingnamespacestd;
constintN=800;
classText//定义Text类
{
private:
chars[N][80];
charfilename[30];
charstr[90];
intlen;
voidgetdata1();
voidgetdata2();
voidgetdata();
voidshow_text();
voidcount();
voidsearch_str();
voiddelete_str();
voidhelp();
public:
Text()
{
cout<<"★---您好,欢迎使用文本编辑程序!
---★"<cout<<"================================================================================"<cout<<"================================================================================"<}
voidMain_Work();
};
voidText:
:
getdata()
{
intchose;//选择文本
cout<<"请选择文件来源"<cout<<"1、打开文件"<cout<<"2、手动输入"<cin>>chose;
switch(chose)
{
case1:
getdata1();break;
case2:
getdata2();break;
}
}
voidText:
:
getdata1()
{
cout<<"请输入文本名:
"<cin>>filename;
cout<FILE*f1;chara;inti=0,j=0;
f1=fopen(filename,"r");//通过文件名与文件流关联
cout<<"正在读取数据......"<len=0;
memset(s,0,sizeof(s));
while((a=getc(f1))!
=EOF)//从文件逐个读取字符并传递a直到文件结束
{
if(j==79){s[i++][j]='\n';j=0;}//每行不超过80个字符
if(a!
='\n'){s[i][j++]=a;}//如果没有回车就一直传递
elses[i++][j]=a;//如果遇见回车换行输入
}
len=i+1;//计算行数
cout<<"数据读取完毕:
"<}
voidText:
:
getdata2()//从键盘输入字符
{
cout<<"请输入一段字符,以#号结束"<memset(s,0,sizeof(s));
chara;inti=0,j=0;
while((a=getchar())!
='#')//以#号结束
{
if(j==79){s[i++][j]='\n';j=0;}
if(a!
='\n'){s[i][j++]=a;}
elses[i++][j]=a;
}
len=i+1;
}
voidText:
:
show_text()
{
cout<<"文本如下:
"<for(inti=0;ifor(intj=0;j<80;j++)
{
if(s[i][j]!
='\0')
cout<
}
cout<}
voidText:
:
help()
{cout<<"请选择操作指令"<cout<<"================================================================================"<cout<<"--------☆count:
分别统计各类字符总数☆--------"<cout<<"--------☆search:
统计所查字符☆--------"<cout<<"--------☆delete:
删除特定字符☆--------"<cout<<"--------☆help:
查看程序指令集合☆--------"<cout<<"--------☆return:
返回选择文件☆--------"<cout<<"--------☆exit:
退出文本编辑程序☆--------"<cout<<"================================================================================"<}
voidText:
:
count()//分别统计各类字符个数
{
intcc,cp,cn,co,sum;
cc=cp=cn=co=sum=0;
for(inti=0;ifor(intj=0;j<80;j++)
{
if(s[i][j]>='0'&&s[i][j]<='9')cn++;
if(s[i][j]>='A'&&s[i][j]<='Z'||s[i][j]>='a'&&s[i][j]<='z')cc++;
if(s[i][j]=='')cp++;
if(s[i][j]!
='\0')sum++;//只要字符不为空,就计入总数
}
cout<<"文章字符统计如下"<cout<<"字母个数为:
"<cout<<"空格个数为:
"<cout<<"数字个数为:
"<cout<<"文章总字数:
"<}
voidText:
:
search_str()
{
charstr[80],*p;intq,count=0;//定义子串指针
cout<<"请输入一个字符子串:
"<cin>>str;
p=str;//从键盘输入子串
for(inti=0;ifor(intj=0;j<80;j++)
{
q=j;//保存j的初值
while(*p!
='\0')//匹配直至子串最后一个字符
if(*p==s[i][j]){j++;p++;}//如果字符匹配,目标串和子串同时右移
elsebreak;//如果字符不匹配跳出循环
if(*p=='\0')count++;//完全匹配时count加1
p=str;//子串还原
j=q;//还原j的值
}
cout<"<}
voidText:
:
delete_str()
{
charstr[80],*p;
intq,m;
cout<<"请输入一个字符子串:
"<cin>>str;
p=str;
for(inti=0;ifor(intj=0;j<80;j++)
{
q=j;
while(*p!
='\0')
if(*p==s[i][j]){j++;p++;}
elsebreak;
m=j-q;//删除子串后移动的距离(子串长度)
if(*p=='\0')
{
for(j=q;s[i][j+m]!
='\0';j++)s[i][j]=s[i][j+m];//字符前移
s[i][j]='\0';//前移之后末尾长度为子串长度的字符设为结束符
j=q-1;//删除一次子串,目标串前移之后,j++(再次匹配需要-1)
}
elsej=q;//不删除子串,前面的已经匹配过,所以不需要-1
p=str;//子串还原
}
cout<<"删除字符"<"<show_text();
}
voidText:
:
Main_Work()
{
charorder[10];
getdata();
show_text();
cout<help();
cout<<"请输入指令:
";
while(cin>>order)
{
cout<if(strcmp(order,"exit")==0)return;
if(strcmp(order,"count")==0)count();
else
if(strcmp(order,"search")==0)search_str();
else
if(strcmp(order,"delete")==0)delete_str();
else
if(strcmp(order,"return")==0)Main_Work();
else
if(strcmp(order,"help")==0)help();
elsecout<<"指令错误,请重新输入"<cout<<"请输入指令:
";
}
}
intmain()
{
Texttext;
text.Main_Work();
return0;
}
运行结果:
读取文件以及分类统计
查询子串:
删除子串
六、心得体会
经过前些周的准备,和这几天的努力终于完成了此次数据结构课程设计。
我个人认为数据结构课程设计是C++程序设计,数据结构,算法设计与分析这三门我们目前学过的专业课程的综合设计。
由于C++学习完已经两年了,虽然一直在用,但还是有些知识点需要复习,课设期间重温了一下课本,数据结构上学期学的不是很好,对于一些数据结构基本的特点着重看了一下,我的课设是文本编辑主要用的是二维数组,程序的基本功能通过一些函数实现。
课程设计虽然说已经完成了,但是我也发现一些问题,有些如调试过程中解决的,还有一个不尽完美的地方需要以后更加的努力学习去完善。
七、参考文献
1.王红梅.数据结构.清华大学出版社
2.王红梅.数据结构学习辅导与实验指导.清华大学出版社
3.谭浩强.C++程序设计.清华大学出版社
4.