文本编辑器c++实验报告附源代码.docx
《文本编辑器c++实验报告附源代码.docx》由会员分享,可在线阅读,更多相关《文本编辑器c++实验报告附源代码.docx(12页珍藏版)》请在冰豆网上搜索。
文本编辑器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(iif(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_Lengthreturn0;
inti=0,j=0;
int*next=newint[T_Length];
get_next(T.c_str(),next);
while(iif(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文件进行编辑,可以对文件进行保存
小结
自己在整个课程设计过程中还是比较轻松的,编写过程中遇到的困难及问题都通过查阅资料、向老师提问得以解决。
所以本次课程设计自己最大的体会就是不管写什么程序,自己首先得对这个问题要分析透彻,要知道自己要干什么,然后才能让自己干什么。
指导老师评议
成绩评定:
指导教师签名:
忽略此处..