精品c课程设计数据结构文章编辑.docx
《精品c课程设计数据结构文章编辑.docx》由会员分享,可在线阅读,更多相关《精品c课程设计数据结构文章编辑.docx(21页珍藏版)》请在冰豆网上搜索。
精品c课程设计数据结构文章编辑
课程设计报告
课程设计题目:
文章编辑
学院:
姓名:
班级:
学号:
专业:
指导教师:
2012年06月04日
一、需求分析说明
我们编此程序为了便于统计文章中的字数,标点数,以及数字的个数,因此它的功能要求也就应该包含这些。
主要的是如下几点:
1)、分别统计出其中英文字母数和空格数及整篇文章总字数;
2)、统计某一字符串在文章中出现的次数,并输出该次数;
3)、删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能(要求用菜单选择操作);
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"
(3)输出删除某一字符串后的文章;
问题分析:
本次程序我计划利用单链表结构实现对文章编辑的操作,因为,在实际应用中,输入的文章有很大的容量,动辄上万,如果利用顺序表不足以充分利用空间,并且可能造成溢出,使整个系统趋于崩溃,内存的资源是很宝贵的,为了尽可能利用到内存资源,所以,利用链表实现。
为了利用链表控制,必须利用到大量指针,所以,建立了一个LINK类,通过该类,确定不同指针对象,实现操作。
再建立一个类,chuan,中文名“串”的拼音,在当中实现对链表的操作功能,通过对这两个类的操作实现课程设计的要求。
主要功能有:
1.插入字符或者文章
2.删除字符串或文章
3.查找字符串
4.删除文章中出现的单个字符
5.统计文章中数字,大写字母,小写字母以及各种符号的个数
6.显示当前文章内容
二、总体设计
1.存储结构
利用单链表存储,为线性结构,程序总体为链表,通过对链表的插入删除,统计等等实现各类功能。
2.主要功能:
(1)插入字符或者文章
(2)删除字符串或文章
(3)查找字符串
(4)删除文章中出现的单个字符
(5)统计文章中数字,大写字母,小写字母以及各种符号的个数
(6)显示当前文章内容
三、详细设计
1.类:
建立了LINK类,公有成员为指针,因为题目要求利用几个函数实现文章编辑的功能,所以对于文章编辑的功能没有用到类。
classlink//定义关于指针的类
{
public:
chardata;
link*next;
};
classchuan//实现串的各类功能
{
public:
chuan(){};
~chuan(){};
voidinputlink(link*&l);
voidinsert(link*&a);
voiddelete1(link*&c);
link*index(link*&head);
voiddelete2(link*&head,char&x);
voidprint(link*&head);
voidcount1(link*&head);
};
2.对象:
Link:
voidchuan:
:
inputlink函数包括的对象(link*s,*r,*p;)
voidchuan:
:
insert函数包括的对象(link*s,*q,*b;)
voidchuan:
:
delete1函数包括的对象(link*p,*q;)
link*chuan:
:
index函数包括的对象(link*p,*q,*r,*e;)
voidchuan:
:
delete2函数包括的对象(link*p,*q;)
voidchuan:
:
count1函数包括的对象(link*p,*q;)
voidchuan:
:
print函数包括的对象(link*p,*q;)
chuan:
对象:
a
3.结构分析:
UML图
link
public:
chardata;
link*next;
chuan
public:
chuan(){};
~chuan(){};
voidinputlink(link*&l);
voidinsert(link*&a);
voiddelete1(link*&c);
link*index(link*&head);
voiddelete2(link*&head,char&x);
voidprint(link*&head);
voidcount1(link*&head);
4.程序测试
程序运行截图:
系统进入中
跳入注意项目界面
输入文字
插入功能
插入后的结果,输出79个字符
统计得到的结果
由于篇幅有限,剩下的各类功能请自我尝试。
本程序达到了题目要求,并很好的实现了,其中还有几相自我添加的功能,在不断地完善。
但在查找方面有一些不足自出,在今后中还需要不断的自我完善,查找功能通过循环扫描存储进去的字符,实现查找,各类功能都是如此。
空间复杂度为O(n)
所用时间为:
四、总结
得到文本编辑器这一课程设计题目时,自己还比较害怕是制作向windows系统中记事本一样的程序。
看了任务书之后自己有了些欣慰,任务书上要求是对输入的信息进行操作,这是我们经常练习的内容,虽然是比平时练习的更为难,更有深度,但自己毕竟知道该向什么方向去努力,自己应该如何去编写这个程序。
所以自己在整个课程设计过程中还是比较轻松的,编写过程中遇到的困难及问题都通过查阅资料、向老师提问得以解决。
这都是基于对课题有一个明确的了解,清楚向什么方向去写。
所以本次课程设计自己最大的体会就是不管写什么程序,自己首先得对这个问题要分析透彻,要知道自己要干什么,然后才能让自己干什么。
今后我要多读一些关于计算机方面的书,并注重理论与实践的结合,多上机练习编写程序,提高自己的实际动手能力和独立思考的能力,不断充实自己,更好的开始。
在这过程中,还是遇到不少的麻烦事的,起初,我的代码已经完成,可是在这个过程中我运用的是cin输入函数,可是,cin不接受空格字符,该字符直接跳过,不计入文章中,针对这个问题,我不断研究,找了好多这方面的资料,试了getchar(),cin.get()等不同函数,可是均不行,最终,找到了问题所在,是内存读取问题,因此,运用系统函数fflush(stdin)清除内存使程序最终运行。
费了好大功夫。
在这次课程设计中我得到了好多启示与经验,收益匪浅,懂了好多,并且充分练习了单链表,使自己有个好的升华,并明白了不同的输入函数有不同的效果!
以后遇到问题不能轻易放弃,必须细细琢磨不停前进,强化独立制作,独立思考的能力,在今后的学习工作中,更加用心!
源代码附录(采用分页式编写):
//类定义头文件,”链串.h”
classlink//定义关于指针的类
{
public:
chardata;
link*next;
};
classchuan//实现串的各类功能
{
public:
chuan(){};
~chuan(){};
voidinputlink(link*&l);
voidinsert(link*&a);
voiddelete1(link*&c);
link*index(link*&head);
voiddelete2(link*&head,char&x);
voidprint(link*&head);
voidcount1(link*&head);
};
//类功能实现文件,源文件,”文章.cpp”
#include"链串.h"
#include
#include
usingnamespacestd;
intcount=0;//通过全局变量控制链表中的个数
voidchuan:
:
inputlink(link*&head)//通过尾插法建立链表,控制头指针,通过头指针操作链表
{
cout<<"输入文字,输入#结束:
"<inti=0;
link*s,*r,*p;
//link*p=newlink;
p=r=newlink;
p->next=NULL;
head=p;//确定头指针位置
head->data=NULL;
fflush(stdin);
for(;;i++)//尾插法循环建立链表
{
s=newlink;
s->data=getchar();
//cin.get()>>s->data;
if(s->data=='#')
{
cout<<"输入结束!
"<break;
}
r->next=s;
r=s;
}
r->next=NULL;
}
voidchuan:
:
insert(link*&head)//插入功能,通过寻找头指针确定链表
{
intj=0,i=0,k=1;
cout<<"输入想插入的行号:
";
cin>>i;
cout<<"输入想插入的列号:
";
cin>>k;
if(((i-1)*79+k)>count)
{cout<<"插入失败,该篇文章没有这么长!
系统直接退出!
"<exit(0);}
link*s,*q,*b;
s=head;//控制头指针,确定头指针的位置
while((s!
=NULL)&&(j<((i-1)*79+k)))
{j++;
s=s->next;}
inputlink(b);//调用输入函数,再建立一个链表
q=b;
while(q->next!
=NULL)
{
q=q->next;//查找要插入的位置
}
if(s!
=NULL)//去掉头指针,两个指针合并为一个
{
q->next=s->next;
s->next=b->next;//去掉b串头指针
}
else
cout<<"找不到插入位置!
"<}
voidchuan:
:
delete1(link*&c)//删除功能
{
intg=0,j=0,i=0;
cout<<"输入想删除的行位置:
";
cin>>i;
cout<<"输入想删除的列位置:
";
cin>>g;
if(((i-1)*79+g)>count)//判断删除位置是否合法
{
cout<<"删除失败!
文章没有那么长!
"<}
i=(i-1)*79+g;
cout<<"输入想删除字符的个数:
";
cin>>j;
link*p,*q;
intk=0;
p=c;
while((p!
=NULL)&&(k{
k++;p=p->next;
}
q=p;
while((q!
=NULL)&&(k
{
k++;q=q->next;
}
if(p!
=NULL)
{
if(q!
=NULL)
p->next=q;
elsep->next=NULL;
}
elsecout<<"删除错误!
删除的内容不存在!
"<}
link*chuan:
:
index(link*&head)
{
inti=0;
link*p,*q,*r,*e;//假设不同的链串
inputlink(e);
p=head->next;
q=e->next;
r=p;
while((p!
=NULL)&&(q!
=NULL))
{
if(p->data==q->data)
{p=p->next;
q=q->next;
}
else
{r=r->next;//指针回溯
p=r;q=e->next;i=i+1;}
}
if(q==NULL)
{
cout<<"查找成功!
";
cout<<"查找的内容在第"<<((i/79)+1)<<"行;"<<"第"<<(i%79+1)<<"列!
"<returnr;}
else{
cout<<"查找失败!
该文章中没有你所查找的内容!
";
returnNULL;}
}
voidchuan:
:
delete2(link*&head,char&x)//删除链表中一个相同字符
{
cout<<"输入想删除的字符(按回车结束):
";
cin>>x;//输入端口
link*p,*q;
if(head->next==NULL)//判断链表是否为空
cout<<"不能删除!
"<else
{
q=head;
p=head->next;
while(p!
=NULL)//指针前进
{
if(p->data==x)
{
q->next=p->next;
deletep;
p=q->next;
cout<"<}
else
{
q=p;
p=p->next;
}
}
}
}
voidchuan:
:
count1(link*&head)//统计字符功能
{
inti=0;//分不同变量统计字符个数
intj=0;
ints=0;
intk=0;
intl=0;
link*p,*q;
p=head;
q=head->next;
if(q!
=NULL)
{
while(q!
=NULL)
{
if((q->data>=65)&&(q->data<=90))//大写字母
i=i+1;
elseif((q->data>=97)&&(q->data<=122))//小写字母
j=j+1;
elseif((q->data>=48)&&(q->data<=57))//数字
s=s+1;
elseif(q->data==32)//空格
l=l+1;
else//(((q->data>=33)&&(q->data<=47))||((q->data>=58)&&(p->data<=64))||((q->data>=91)&&(q->data<=96))||((q->data>=123)&&(q->data<=127)))//其他字符
{k=k+1;}
q=q->next;
}
cout<<"大写字母的个数为:
"<
cout<<"小写字母的个数为:
"<cout<<"数字字符的个数为:
"<
cout<<"空格字符的个数为:
"<cout<<"其他各类字符数为:
"<cout<<"文章字数统计,总数为:
"<}
}
voidchuan:
:
print(link*&head)//输出功能
{
inti=0,j=0;
link*p,*q;
if(head->next==NULL)//判断文章是否为空
{
cout<<"输入的文章为空!
"<system("pause");
}
else
{
p=head;//确定头结点
q=head->next;//指针前进
}
while(q!
=NULL)
{
i=i+1;
j=j+1;
cout<data;
if(i%79==0)
cout<q=q->next;
}
count=j;//统计文章总字数
cout<}
//主文件,main文件,源文件,”主文件.cpp”
#include"链串.h"
#include
#include
usingnamespacestd;
intmain()
{inti=0,j=0;
chuana;
charx,k;
system("color09");
cout<cout<<"\t\t\t\t欢迎进入文章编辑系统"<cout<<"\t\t\t\t\t请等待";
for(intt=6;t>0;t--)
{
Sleep(1000);
cout<<".";
}
system("cls");
system("color04");
cout<cout<cout<<"警告:
欲用此系统,必先建立自己的文章"<cout<system("pause");
system("cls");
system("color0F");
link*head;
a.inputlink(head);
cout<<"输入的文章为:
"<a.print(head);
do{
cout<cout<<"1.插入字符或者文章"<cout<<"2.删除字符串或文章"<cout<<"3.查找字符串"<cout<<"4.删除文章中出现的单个字符"<cout<<"5.统计文章中数字,大写字母,小写字母以及各种符号的个数"<cout<<"6.显示当前文章内容"<cout<<"0.退出本系统"<cout<<"请输入选择的功能项:
";
cin>>k;
if((k<='0')&&(k>='7'))
{cout<<"输入错误请重新输入!
"<{
switch(k)//实现菜单控制
{
case'1':
a.insert(head);
a.print(head);
system("pause");
system("cls");
break;
case'2':
a.delete1(head);
a.print(head);
system("pause");
system("cls");
break;
case'3':
a.index(head);
a.print(head);
system("pause");
system("cls");
break;
case'4':
a.delete2(head,x);
a.print(head);
system("pause");
system("cls");
break;
case'5':
a.count1(head);
system("pause");
system("cls");
break;
case'6':
a.print(head);
system("pause");
system("cls");
break;
case'0':
exit(0);
}
}
}while(k!
=0);
return0;
}