c++课程设计数据结构文章编辑.docx
- 文档编号:17927320
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:21
- 大小:196.32KB
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< 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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计 数据结构 文章 编辑