数据结构与算法分析课程设计报告
课题名称: A Text Editor Imlementation
提交文档学生姓名: 苟 丁
提交文档学生学号: 0843042229 同组 成 员 名 单: 无 指导 教 师 姓 名: 孙界平
指导教师评阅成绩: 指导教师评阅意见: . .
提交报告时间:2010 年 5 月 7 日
1
A Text Editor Imlementation
1. 实验题目:带括号的算术表达式求值
2. 实验的目的和要求:
1.采用C++的ASCII码文件和串函数实现; 2.熟练掌握串运算的应用;
3.熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序;
4.上机调试程序,掌握查错、排错使程序能正确运行
3. 实验的环境:
1、硬件环境:联想笔记本电脑,Intel(R) Pentium(R) Dual T3400 ,2GB内存
2、软件环境:Windows XP 下的Microsoft Visual Studio 2008
4. 算法描述:
具体操作与函数描述
(1) 编辑一个文本文件,命名为text.txt.
(2) 函数run()提供给用户选择符的输入:w,r,I,d,f,c,q,h,n,p,b,e,g,v.
用户可以选择H选择符寻求帮助,得知操作符分别代表的动作。
(3) R代表函数Read()将文本读入缓冲区,缓冲区以前的任何内容都将将消
失。
(4) W代表函数Write()将缓冲区的内容写入文本文件。
(5) I代表函数Insert()插入新行,用户可以在适当的提示下键入新行并
提供新行。
(6) D代表delete()行数所执行的删除操作,可以删除当前行,并进入下一
行。
(7) F代表函数findChar(),用于查找目标行。
(8) C代表函数changLine(),将用户请求的字符串修改成用户请求的替换
文本,可选择的是仅在当前行中有效。
(9) Q代表函数quit(),用户执行此命令可以退出编辑。 (10)N代表函数next(),用户可以从当前行移到下一行。 (11)P代表函数pre(),用户可以从当前行移到下一行。 (12)E代表end(),可以移到最后一行。 (13)G代表go(),用户可以指定到选择的行。
2
A Text Editor Imlementation
(14)V查看缓冲区的全部内
测试程序说明:
测试main()如下,主要定义了一行的长度,主要是执行run()函数,实现用户输入字符选择执行操作的目的。
#include \"Utility.h\" #include \"MyList.h\" int main(){
const int LG=50; void run(char); char inputCh=NULL; cout<<\"输入目标文本名字:\";
cin>>inputname; cout<<\"输出文本名字:\"; cin>>outputname;
Temp:
ifstream ipf;
ipf.open(inputname,ios::in); if(ipf.fail()) { }
char ch[LG]; while (!ipf.eof()) { }
ipf.close();
countL=List.length(); display();
cout<<\"你要进行什么操作(输入h 获得帮助):\"; char chr=getchar(); do {
chr=getchar();
if(chr=='\\n') continue; ipf.getline(ch,LG-1); List.append(ch);
cout<<\"不能打开文件!!\\n\"; goto Temp; return 0;
run();
if(toupper(chr)!='E') cout<<\"你要进行什么操作(输入h 获得帮助):\"; }while((toupper(chr)!='E')); }
3
A Text Editor Imlementation
流程图如下:
5. 源程序清单: MyLink.h
#ifndef MYLINK_H #define MYLINK_H #include template MyLink(string LString,MyLink MyLink(); void display(); int findChar(char*); void repSubChar(char*,char*); 4 A Text Editor Imlementation }; template MyLink template template int MyLink template void MyLink int temp=LiString.find(old); LiString.replace(temp,sizeof(old)-1,rep); return LiString.find(fin); this->prv=NULL; this->next=NULL; this->LiString=LString; this->prv=pr; this->next=ne; MyLink* prv; MyLink* next; string LiString; MyList.h #ifndef LinkList_H #define LinkList_H #include \"Link.h\" #include template MyLink void removeall(){ while (head!=NULL) 5 fence=tail=head=new MyLink A Text Editor Imlementation }; template bool MyList fence->next=new MyLink 6 fence->next->next->prv=fence->next; } MyList(){ }; ~MyList(){ }; bool insert(const Elem&); bool append(const Elem&); bool replace(const Elem&); bool remove(); void setStart(){fence=head;} void prev(); void next(){ } int length() const{return count;} MyLink if (fence!=tail) fence=fence->next; while (head!=NULL) { }; removeall();init(); fence=head; head= head->next; delete fence; fence=tail=head=new MyLink fence=head; head= head->next; delete fence; public: void clear(){ A Text Editor Imlementation } template bool MyList template bool MyList template bool MyList template MyLink if(count==0) cout<<\"缓冲区为空!!\\n\"; if (pos<=0||pos>count) { cout<<\"输入行号错误!!\\n\"; cout<<\"你想到哪一行-\"< 7 fence=fence->prv; MyLink else tail=fence; fence->next=ltemp->next; delete ltemp; count--; return true; ltemp->next->prv=fence; return true; if (tail==fence) { } tail=fence->next; return true; A Text Editor Imlementation } template template void MyList } 8 ofstream opf; opf.open(outputname,ios::out); MyList::setStart(); do{ fence=fence->next; opf< if (cout==0) { } MyList::setStart(); do{ fence=fence->next; cout<<\"The buffer is empty;\\n\"; } MyList::setStart(); for (int i=0;i fence=fence->next; } cin.putback(ch); cin>>pos; } cout<<\"请输入数字!!\\n\"; cout<<\"你想到哪一行-\"< cout< }while(fence->next!=tail); fence=fence->next; opf< A Text Editor Imlementation #endif Utility.h #include enum Error_code{success,fail,underflow,overflow};//enum bool{false,true}; Editor.cpp #include \"Utility.h\" #include \"MyList.h\" using namespace std; MyList char inputname[20],outputname[20]; int main(){ const int LG=50; void whatToDo(char); char inputCh=NULL; cout<<\"输入目标文本名字:\"; cin>>inputname; cout<<\"输出文本名字:\"; cin>>outputname; 9 Temp: A Text Editor Imlementation ifstream ipf; ipf.open(inputname,ios::in); if(ipf.fail()) { } char ch[LG]; while (!ipf.eof()) { } ipf.close(); countL=List.length(); display(); cout<<\"你要进行什么操作(输入h 获得帮助):\"; char chr=getchar(); do { chr=getchar(); if(chr=='\\n') continue; ipf.getline(ch,LG-1); List.append(ch); cout<<\"不能打开文件!!\\n\"; goto Temp; return 0; whatToDo(toupper(chr)); if(toupper(chr)!='E') cout<<\"你要进行什么操作(输入h 获得帮助):\"; }while((toupper(chr)!='E')); } void whatToDo(char ch){ switch(ch){ case'H':cout< A Text Editor Imlementation case'G':{ cout<<\"你想到哪一行1-\"< while (ch!='\\n') { } ch=getchar(); cout<<\"请输入数字!!\\n\"; cout<<\"你想到哪一行1-\"< goWhichLine(temp); tempLine=temp;}break; case'B':display();break ; case'D':{ if (tempLine==0) { cout<<\"输入你想删除的行号-\"< ch=getchar(); } cout<<\"请输入数字!!\\n\"; cout<<\"输入你想删除的行号-\"< cin.putback(ch); cin>>tempin; cout<<\"被删除的行:\"; goWhichLine(tempin); tempLine=tempin; } delLine(); goWhichLine(tempLine);}break; case'I':{ 11 A Text Editor Imlementation if (tempLine==0) { } insertLine(); int tempol=tempLine+1; goWhichLine(tempol); tempLine++;}break; { } 12 cout<<\"输入你想替换的行号-\"< while (ch!='\\n') { } cout<<\"请输入数字!!\\n\"; cout<<\"输入你想替换的行号-\"< cout<<\"输入你想插入的行号-\"< while (ch!='\\n') { } cout<<\"请输入数字!!\\n\"; cout<<\"输入你想插入的行号-\"< case'R':{if (tempLine==0) A Text Editor Imlementation repLine(); goWhichLine(tempLine); }break; case'C':count();break; case'F':{ if (tempLine==0) { } cout<<\"输入你所要查找的字符串:\"; char temp[20]; goWhichLine(tempLine); findChar(temp); goWhichLine(tempLine);}break; cin>>temp; cout<<\"输入你查找字符串所在的行号-\"< while (ch!='\\n') { } cout<<\"请输入数字!!\\n\"; cout<<\"输入你查找字符串所在的行号-\"< case'P':{ if (tempLine==0) { cout<<\"输入你替换字符串所在的行号-\"< cout<<\"请输入数字!!\\n\"; 13 ch=getchar(); A Text Editor Imlementation } } void goWhichLine(int &lin){ List.fence=List.setPos(lin); cout<<\"Line\"< void delLine(){ List.remove(); countL--; } void insertLine(){ } 14 char temp[20]; cout<<\"输入想要替换的行:\"; cin>>temp; List.insert(temp); countL++; List.print(); } char old[20]; char ne[20]; cout<<\"输入希望被替换掉的字符串:\"; cin>>old; cout< cout<<\"替换前:\";goWhichLine(tempLine); repChar(old,ne); }break; } cin.putback(ch); cin>>tempin; goWhichLine(tempin); tempLine=tempin; cout<<\"输入你替换字符串所在的行号-\"< case'S':output(inputname);break; case'O':output(outputname);break; case'E':break; default:{cout<<\"操作符输入错误!!\\n\";}break; A Text Editor Imlementation void repLine(){ string temp; cout<<\"输入想要替换的元素:\"; cin>>temp; List.replace(temp); } void findChar(char* ch){ } void repChar(char* prch,char* afch){ } void count(){ cout<<\"行数:\"< cout<<\" \"; for (int i=0;i cout< void output(char* chr){ } List.output(chr); cout<<\"文本的总字符: \"< 15 A Text Editor Imlementation 本次测试选择了文件名为text.txt的文本文件,输出文件为out.txt。text.txt文本的内容如下: this is a text book you can use it to do test there is not new word can you do the test right you can try just do it is there any wrong 对文件进行所列符号代表的操作,显示结果如下: b 测试结果分析: 程序能较好的完成任务,由于此程序用单链表编写完成,有些功能的完成 与要求有细微的差别。但此程序能较好的完成文本编辑任务。 7. 实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论): 收获 (1) 通过编译和执行文本编辑器程序,让我收获了文本编辑的知识, 同时通过此过程让我对Microsoft Visual Studio 2008更加熟悉了, 16 A Text Editor Imlementation 对差错也有了更深的了解。 (2) 在编程过程中遇到了许多问题,比如文件的输入、输出等,通过 这个过程的训练,我能更好的利用网上资源,不懂的知道怎么解决。 (3) 由于大二上学期数据结构的学习中,没有深入学习链表,通过此 编程练习,让我对文件、缓冲、链表有了更好的了解与掌握。 特色 (1)(2) 不足 (1)(2) 本程序用单链表实现了文本编辑器的功能,与双链表相比,单链 表更加简便,对于我们刚接触实际编程的新手来说,更容易操作,更适合于学习知识。 此程序用了3个头文件,一个源文件,把测试于动作分开了,可 以更好的实现扩张,而不用修改太多。 由于对缓冲和文件操作不了解和熟悉,所以完成此程序的编程时 参照了许多网上给出的知识。 次文本编译器的功能还不是很强大,有些不足的地方,由于时间 紧张和能力有限,没有好好扩充与改进。 17 因篇幅问题不能全部显示,请点此查看更多更全内容