数据结构与算法分析实验报告川大Word格式文档下载.docx
《数据结构与算法分析实验报告川大Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构与算法分析实验报告川大Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
![数据结构与算法分析实验报告川大Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/28/58b6447f-ecd5-400e-a1f0-d92f83221e9c/58b6447f-ecd5-400e-a1f0-d92f83221e9c1.gif)
编译系统的版本的特点:
Dev-C++是一套用于开发C/C++的自由的集成开发环境(IDE),并以GPL作为散布可。
使用
MinGW
及
GDB
作为编译系统与除错系统。
Dev-C++的IDE是利用Delphi开发的。
编辑软件特点:
包含强大的类和嵌WinAPI的MFC,具有可视化的编程界面。
四、算法描述:
1、用户可以选择自己输入文本或者直接使用程序以初始化的文本,用switchcase语句就可以根据用户不同的选择执行相应的代码。
相应代码:
cout<
<
"
a代表自己输入文本,b代表使用电脑设置的文本"
endl;
请输入你的选择:
charch;
cin>
>
ch;
switch(ch)//对用户的不同选择执行不同的代码
{
case'
a'
:
//当用户选择自行输入文本时
·
break;
b'
//当用户选择使用电脑设置的文本时
}
2、当用户选择自己输入文本时,就需要写一些函数来存储这些信息,可以将这些函数封装在一个模板类中,只要定义一个之歌类的对象(bianji)就可以在需要的时候调用类的函数。
在这个时候需要调用的函数有:
bianji.Sethang(h);
//设置文本的行数
bianji.Setlie(l);
//设置文本的列数
bianji.Setwenben();
//输入文本
bianji.Showwenben();
//显示文本
3、单用户选择使用程序初始化的文本时,只要显示文本即可。
这个时候需要的函数有:
4、该文本编辑器有插入,移除,替换,查找,显示和重置的功能,通过输出语句告知用户文本编辑器的功能,并询问用户要使用哪个功能。
charch='
s'
;
//初始化ch
while(ch!
='
q'
)//当ch!
时,就不会退出循环
cout<
i代表插入文本"
R代表移除文本"
r代表替换文本"
f代表查找文本"
s代表显示当前文本"
n代表重新建立一个文本"
q代表退出"
cin>
5、当用户选择插入(insert)功能时,就只需要将当前行数加1,将要插入的行及其后面的行的文本往后移一行,在输入要插入的行的文本即可,相应代码:
while(h0>
bianji.Gethang()||h0<
1)//如果要插入的行大于已有的//最大行或者小于第一行就会要求重新输入一个
输入错误,请重输:
h0;
bianji.Sethang(bianji.Gethang()+1);
//当前行数加1
inti,j;
for(i=bianji.Gethang()-1;
i>
=h0;
i--)//把要插入行及后面的行的//文本往后一次移一行
for(j=0;
j<
bianji.Getlie();
j++)
bianji.Xiugaiwenben(i,j,i-1,j);
}
for(i=0;
i<
i++)//输入要插入的那一行的文本
请输入第"
h0<
行第"
i+1<
个字符:
bianji.Fuzhiwenben(h0-1,i);
6、当用户选择移除(remove)功能时,只需要将要移除的行的后面的文本依次往前移一行,就会顺便把要移除行的文本覆盖了,相当于达到了移除的效果,相应代码:
while(h1>
bianji.Gethang()||h1<
1)//如果要移除的行大于已有的//最大行或者小于第一行就会要求重新输入一个
输入有误,请重输:
h1;
bianji.Sethang(bianji.Gethang()-1);
//将当前行数减1
inti1,j1;
for(i1=h1-1;
i1<
bianji.Gethang();
i1++)//把要移除的行的后面的//行一次往前移一行就顺便把要移除的那一行给覆盖
{//了,从而达到移除的效果
for(j1=0;
j1<
j1++)
bianji.Xiugaiwenben(i1,j1,i1+1,j1);
7、当用户选择替换(replace)功能时,只需要重新输入要替换行的文本即可,其他行的文本不变,相应代码:
for(i2=0;
i2<
i2++)//得到要替换的那一行的列//数,然后输入新的文本
h2<
i2+1<
bianji.Fuzhiwenben(h2-1,i2);
8、当用户选择查找(find)功能时,只要用户输入相应列数的文本,然后将其与每一行的文本进行比较,如果完全相同,则会输出相应的行号,通过循环语句来进行匹配,相应代码:
for(i3=0;
i3<
i3++)//根据当前文本的列数来输入//要查找的文本
i3+1<
列的字符:
bianji.Fuzhiwenben(bianji.Gethang(),i3);
//将输入的文本放//到当前的最后一行,只是暂时的
}//在这个功能完了后就会//消失,因为没有改变文本的行列
i3++)//根据输入的文本,一行一行//的搜,将每一行的文本域输入的文本进行匹配{//如果匹配成功就会输出相应的行数
j3=0;
while(bianji.Findwenben(i3,j3)==bianji.Findwenben(bianji.Gethang(),j3)&
&
j3<
bianji.Getlie())
{
j3++;
//相同就会在查下一列的字符是否相同,直到这一完//了
if(j3==bianji.Getlie())
cout<
你要找的文本在第"
行"
count+=1;
if(count==0)
你要找的文本不在现有文本中"
9、当用户选择显示(show)功能时,只需要调用模板类中的显示函数即可,相应代码:
与初始化的部分相同,也只是要调用模板类中的相应函数即可,相应代码:
请输入新的行数:
h4;
bianji.Sethang(h4);
//新行
请输入新的列数:
l4;
bianji.Setlie(l4);
//新列
//新文本
10、当用户选择重置(new)功能时,
五、源程序清单:
该程序代码分为3部分,分别是:
1、模板类的代码,文件名“linklist.h”,相应代码:
#ifndefLINKLIST_H_
#defineLINKLIST_H_
#include<
iostream>
usingnamespacestd;
template<
classElemType>
//队列的模板类
classLinkList
private:
ElemTypewenben[256][256];
//创立一个二维数组作为存储文本的空间
inthang;
//数组的行
intlie;
//数组的列
public:
LinkList()//构造函数
hang=1;
//初始化行数为1
lie=1;
//初始化列数为1
wenben[0][0]='
//初始化文本为'
~LinkList(){}//析构函数
voidXiugaiwenben(inth1,intl1,inth2,intl2)//修改文本,将文本中h2行l2列的
{//字符赋给h1行l1列
wenben[h1][l1]=wenben[h2][l2];
voidFuzhiwenben(inth,intl)//给文本中h行l列赋一个字符
cin>
wenben[h][l];
ElemTypeFindwenben(inth,intl)//返回h行l列的字符
returnwenben[h][l];
voidSethang(inth)//设定数组的行数
hang=h;
intGethang()//得到数组的行数
returnhang;
voidSetlie(intl)//设定数组的列数
lie=l;
intGetlie()//得到数组的列数
returnlie;
voidSetwenben()//设立一个文本
inti,j;
for(i=0;
hang;
i++)
{
cout<
行的文本:
for(j=0;
lie;
{
cout<
j+1<
列的字符"
cin>
wenben[i][j];
}
}
voidShowwenben()//显示当前文本
当前文本是:
};
#endif
2、编辑类的代码,文件名是“editor.h”,相应代码:
#include"
linklist.h"
classEditor
LinkList<
char>
bianji;
//模板类的char型对象,用来调用模板类中的函数
intcount;
//在使用查找功能时用来判断是否要查找的文本在当前文本中
voidChushihua()//设置文本的函数
charch;
switch(ch)//对用户的不同选择执行不同的代码
case'
请输入文本的行数:
inth;
h;
请输入文本的列数:
intl;
cin>
l;
bianji.Sethang(h);
bianji.Setlie(l);
bianji.Setwenben();
bianji.Showwenben();
break;
//显示初始化的文本
voidEdite()//编辑文本的函数
charch='
while(ch!
switch(ch)//根据用户的不同选择执行不同的代码
case'
i'
//选择插入(insert)功能
bianji.Showwenben();
//显示当前文本
请问要插入到第几行?
:
inth0;
while(h0>
1)//如果要插入的行大于已有的最大行或者小于第一行就会要求重新输入一个
{
cout<
cin>
}
bianji.Sethang(bianji.Gethang()+1);
inti,j;
for(i=bianji.Gethang()-1;
i--)//把要插入行及后面的行的文本往后一次移一行
for(j=0;
{
bianji.Xiugaiwenben(i,j,i-1,j);
}
for(i=0;
bianji.Fuzhiwenben(h0-1,i);
break;
R'
//选择移除(remove)功能
请问要移除哪一行?
inth1;
while(h1>
1)//如果要移除的行大于已有的最大行或者小于第一行就会要求重新输入一个
bianji.Sethang(bianji.Gethang()-1);
inti1,j1;
for(i1=h1-1;
i1++)//把要移除的行的后面的行一次往前移一行就顺便把要移除的那一行给覆盖
{//了,从而达到移除的效果
for(j1=0;
bianji.Xiugaiwenben(i1,j1,i1+1,j1);
r'
//选择替换(replace)功能
要替换哪一行?
inth2;
h2;
inti2;
for(i2=0;
i2++)//得到要替换的那一行的列数,然后输入新的文本
bianji.Fuzhiwenben(h2-1,i2);
f'
//选择查找(find)功能
请输入要查找的文件:
inti3,j3;
count=0;
for(i3=0;
i3++)//根据当前文本的列数来输入要查找的文本
bianji.Fuzhiwenben(bianji.Gethang(),i3);
//将输入的文本放到当前的最后一行,只是暂时的
}//在这个功能完了后就会消失,因为没有改变文本的行列
/*cout<
第"
h3<
行的文本是:
//输入行数就会将当前文本中那一行的文本输出
i3++)
bianji.Findwenben(h3-1,i3);
}*/
i3++)//根据输入的文本,一行一行的搜,将每一行的文本域输入的文本进行匹配
{//如果匹配成功就会输出相应的行数
j3=0;
while(bianji.Findwenben(i3,j3)==bianji.Findwenben(bianji.Gethang(),j3)&
j3++;
//相同就会在查下一列的字符是否相同,直到这一行完了
if(j3==bianji.Getlie())
cout<
count+=1;
if(count==0)
//选择显示当前文本
n'
//选择重置(new)功能
inth4,l4;
bianji.Sethang(h4);
bianji.Setlie(l4);
bianji.Setwenben();
3、主函数的代码,文件名是“main.cpp”,相应代码:
editor.h"
intmain()
Editore;
//编辑类的对象,用来调用类中的函数
e.Chushihua();
//调用设置文本的函数
e.Edite();
//调用编辑文本的函数
return0;
六、运行结果:
1、选择自己输入文本(a),输入文本为(3行2列):
qw
er
ty
进行插入操作(i),插入文本as到第2行:
进行移除操作(R),移除第3行文本:
进行替换操作(t),将第一行文本qw替换为df:
进行查找操作(f),查找文本as和qw:
进行显示操作(s):
进行重置操作(n):
重置操作和自己输入文本是一样的,在这里就不演示了,有兴趣可以自己尝试。
2、使用程序本身置的文本(b):
置的文本是一行一列的文本a:
其他操作和前面的操作时一样的,在这里就不一一演示了,有兴趣的话可以自己尝试。
七、实验运行情况分析(包括算法、运行结果、运行环境等问题的讨论)。
1、算法难点分析:
该程序的难点不是算法有多难,而是它要求的功能比较多,会让人觉得比较难,而不愿意去做,其实我们只要把它要求的功能写成一个一个的函数,然后将这些函数封装在一个类里面就行了,在我们需要的时候就可以随时调用。
2.该程序代码的缺陷:
一是需要用户输入文本的行数和列数,并且每一行文本的字数要相同,灵活性较低,而且没有报错功能,用户输错后不会报错,不是很人性化,还有就是界面不太美观,不过这些都可以改进,希望在以后的实验中做得更好。
3、运行环境分析:
改程序的实现环境是Dev-C++,有些函数库可能没有,比如说<
algorithm.h>
,不过这都不是大问题,没有的函数可以自己写。
参考文献
[1]唐宁九,游洪跃,宏,秋辉.数据结构与算法分析(C++版).清华大学出版社,2009.2