文本编辑器c++实验报告附源代码.docx

上传人:b****9 文档编号:26188298 上传时间:2023-06-17 格式:DOCX 页数:12 大小:61.98KB
下载 相关 举报
文本编辑器c++实验报告附源代码.docx_第1页
第1页 / 共12页
文本编辑器c++实验报告附源代码.docx_第2页
第2页 / 共12页
文本编辑器c++实验报告附源代码.docx_第3页
第3页 / 共12页
文本编辑器c++实验报告附源代码.docx_第4页
第4页 / 共12页
文本编辑器c++实验报告附源代码.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

文本编辑器c++实验报告附源代码.docx

《文本编辑器c++实验报告附源代码.docx》由会员分享,可在线阅读,更多相关《文本编辑器c++实验报告附源代码.docx(12页珍藏版)》请在冰豆网上搜索。

文本编辑器c++实验报告附源代码.docx

文本编辑器c++实验报告附源代码

四川大学软件学院

实验报告

课程名称

数据结构 

实验课时

8

实验项目

文本编辑器

实验时间

12到14周

实验目的

了解c++类的封装和KMP算法。

实验环境

Windows平台VC6.0++ 

实验内容(算法、程序、步骤和方法)

部分函数创建思想:

创建过程如下:

a、定义LinkList指针变量*temp:

LinkList*temp;

b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;

c、申请动态存储空间:

head->next=(LinkList*)malloc(sizeof(LinkList));

d、首行头指针的前驱指针为空:

head->pre=NULL;

首行指针:

temp=head->next;

首行指针的前驱指针也为空:

temp->pre=NULL;

定义没输入字符时文章长度为0:

temp->length=0;

初始化为字符串结束标志,防止出现乱码:

for(i=0;i<80;i++)

temp->data[i]='\0';

e、利用循环进行文本输入

for(j=0;j

{for(i=0;i<80;i++)//控制一行

{ch=getchar();//接收输入字符

temp->data[i]=ch;//给temp指向的行赋值

····

temp->length++;//行中字符长度加1

if(ch=='#')

{NUM=j;break;//文章结束时,Num来记录整个文章的行数

}}}

在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作:

输入字符数大于80,重新分配空间建立下一行

temp->next=(LinkList*)malloc(sizeof(LinkList));

给temp的前驱指针赋值:

temp->next->pre=temp;

temp指向当前行:

temp=temp->next;

将下一行初始化为字符串结束标志,防止出现乱码:

for(i=0;i<80;i++)

temp->data[i]='\0';

记录整个文章的行数:

temp->row=NUM+1;

返回指向最后一行指针:

returntemp;

文本输入部分到此结束。

 

实验流程图:

程序清单

Headerfile

#include

#include

usingnamespacestd;

int*get_next(char*T,int*next);//声明get_next函数以获取next数组。

intKMP(char*S,char*T);//声明KMP函数调用next函数来进行查找。

intget_choice();//选择要执行的功能。

voidserach(stringS);//定义查找函数,用于进行字符串查找。

voidadd_char(string&S);//定义添加函数,用于进行字符串添加。

voidchange(string&S);//定义替换函数,将修改指定位置上的字符为新指定的字符。

voiddelete_char(string&S);//定义删除函数,将用于删除指定位置上的字符。

voiddisplay(string&S);//显示函数,用于显示当前的字符串。

 C++sourefile

#include"textedit.h"

usingnamespacestd;

int*get_next(constchar*T,int*next){//根据T字符串将所得到的next数组值存在next指针指向的数组中

inti=0,j=-1;

intlength=strlen(T);

int*temp=next;

*next=-1;

while(i

if(j==-1||*(T+i)==*(T+j)){//如果字符串中第i个字符与从头起第j个相同,则i,j分别向后移一位

i++;

j++;

if(*(T+i)!

=*(T+j))//当遇到第一个不相等的字符时,当前的j值就是next数组第i个元素的值

*(next+i)=j;

else

*(next+i)=*(next+j);//如果相等,则从字符串开始第j个元素的next值与当前位置的值相同

}

else

j=*(next+j);//如果遇到第i个元素和从头起第j个元素不相同,则从第j个元素的next值的位置开始比较,即回溯

}

returntemp;

}

intKMP(stringS,stringT){

intS_Length=S.length();

intT_Length=T.length();

if(S_Length

return0;

inti=0,j=0;

int*next=newint[T_Length];

get_next(T.c_str(),next);

while(i

if(j==-1||*(S.c_str()+i)==*(T.c_str()+j)){//如果对应i,j号元素相同,则依次向后错一位,否则通过next函数,将j指针回溯一定距离。

i++;

j++;

}

else

j=*(next+j);

}

if(j>=T_Length)//实际上当j==T_Length时,即意味着查找成功,返回开始字符所在的位置,否则返回失败

returni-T_Length+1;

return0;

}

 

intget_choice()//获取用户输入的选项,以进行相应操作。

{

inttemp;

cout<<"请输入你即将执行的操作:

\n1--查找\t2--添加\t3--替换\n4--删除\t5--显示当前字符串\t6--退出\n你的选择:

";

while(true){

cin>>temp;

if(temp<7&&temp>0)//只有输入1、2、3、4、5、6时候才会返回输入的选项。

returntemp;

else

{

cout<<"你的输入有误,请重新输入\n你的选择:

";

}

}

}

voidserach(stringS)

{

intk;

stringT;

cout<<"请输入要查找的串:

";

cin.sync();//清空缓存区,否则将自动读入输入选项时候按下的回车键。

getline(cin,T);

if(k=KMP(S,T))//KMP的返回值不为0即查找成功时候,if条件判断认为是真。

cout<<"所要查找的字符串从第"<

"<

else

cout<<"查找失败"<

}

voidadd_char(string&S){

intk;

stringm;

cout<<"请输入你想插入的位置:

";

while(true)

{

cin>>k;

if(k>=0&&k<=S.length())//插入的位置不能在字符串外面。

break;

else

cout<<"你输入的位置有误。

请重新输入你想插入的位置:

";

}

cout<<"请输入你要插入的字符串:

";

cin.sync();//同前

getline(cin,m);

S=S.insert(k,m);//将字符串m插到S的第k个位置上。

}

voidchange(string&S){//调用String类中将第k个字符到第m个字符替换为新字符串的函数。

intk,m;

stringtemp;

cout<<"请输入由第几个字符开始替换:

";

while(true){

cin>>k;

if(k=0)//起始位置必须小于长度且不能等于

{

cout<<"替换至第几个字符:

";

while(true){

cin>>m;

if(m<=S.length()&&m>k)//结尾位置必须不能大于字符串长度,并且不能小于起始位置。

break;

else

cout<<"输入有误,请重新输入结尾:

";

}

break;

}

else

cout<<"输入有误,请重新输入开头:

";

}

cout<<"请输入要替换成的字符串:

";

cin.sync();

getline(cin,temp);

S.replace(k,m,temp);//将目标串替换至指定位置。

}

voiddelete_char(string&S){

intk,m;

cout<<"请输入从第几个字符开始删:

";

while(true){

cin>>k;

if(k=0)//若k==S.length(),则下面无法删除0个。

{

cout<<"删除的字符个数为:

";

while(true){

cin>>m;

if((k+m)<=S.length()&&m>0)//同前,删除的最后一个字符的位置不能超出字符串的长度。

break;

else

cout<<"输入有误,请重新输入个数:

";

}

break;

}

else

cout<<"输入有误,请重新输入开始位置:

";

}

S=S.erase(k,m);

}

voiddisplay(string&S)

{

cout<<"当前的字符串为:

"<

cout<

}

voidmain()

{

intchoice;

stringS;

cout<<"请输入一个字符串:

"<

getline(cin,S);

while(true){

choice=get_choice();

switch(choice){

case1:

serach(S);break;

case2:

add_char(S);break;

case3:

change(S);break;

case4:

delete_char(S);break;

case5:

display(S);break;

default:

exit(0);

}

}

}

实验内容(算法、程序、步骤和方法)

数据记录

和计算

 

结论

(结果)

 

基本达到了实验的要求。

可以实现字符串的添加,查找,删除,现实,,,,。

而且可以对txt文件进行编辑。

工作正常。

可以正常的打开txt文件进行编辑,可以对文件进行保存

 

小结

 

自己在整个课程设计过程中还是比较轻松的,编写过程中遇到的困难及问题都通过查阅资料、向老师提问得以解决。

所以本次课程设计自己最大的体会就是不管写什么程序,自己首先得对这个问题要分析透彻,要知道自己要干什么,然后才能让自己干什么。

指导老师评议

 

 

成绩评定:

指导教师签名:

忽略此处..

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1