1、简单行编辑程序学 号 09710215数据结构课程设计设计说明书简单行编辑程序起止日期: 2012 年 1月 1 日 至 2012 年 1 月 5 日 学生姓名孙明章班级09计算机2班成绩指导教师(签字)电子与信息工程系2012年1月6日天津城市建设学院课程设计任务书20112012学年第1学期 电子与信息工程 系 计算机科学与技术 专业 2 班级课程设计名称: 数据结构课程设计 设计题目: 简单行编辑程序 完成期限:自 2012 年 1 月 2 日至 2012 年 1 月 6 日共 1 周设计依据、要求及主要内容(可另加附页):一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决
2、一些实际问题。二、设计要求 (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;(4)认真编写课程设计报告。三、设计内容简单行编辑程序问题描述如下:文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部
3、读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。一种解决方法是逐段地编辑。任何时刻只把待编辑文件的一段放在内存,称为活区。试按照这种方法实现一个简单的行编辑程序。设文件每行不超过320个字符,很少超过80字符。具体功能如下:(1) 行插入。格式:i将插入活区中第行之后(2)行删除。格式:d删除活区中第行(到第行)。两种格式的例子是:“d10”和“d1014”(3)活区切换。格式:c将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后各页(如果存在)。各条命令中的行号均须在活区中
4、各行行号范围之内,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。目录一、需求分析 - 4 -二、总体设计 - 5 -三、详细设计 - 7 -四、程序调试 - 8 -五、核心源程序清单和执行结果 - 8 -六、感想与体会 - 24 -一、需求分析简单行编辑程序,本程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。一种解决方法是逐段地编辑。任何时刻只把待编辑文件的一段放在内存,称
5、为活区。试按照这种方法实现一个简单的行编辑程序。设文件每行不超过320个字符,很少超过80字符。二、总体设计1.程序设计组成框图2.程序流程图 图2-1活区类 存储所有活区信息 三、详细设计ActiveText类的一些重要方法:void InsertLine(int lineNum,string text);/行插入void DeleteLine(int lineNum);/单行删除void DeleteLine(int startLine,int endLine);/多行删除void Change();/活区切换void Display();/活区显示int LineNum();/活区的实际
6、行数void NextPage();/显示下一页void LastPage();/显示上一页主程序中的一些重要方法:void Delete(ActiveText &activeText);/单行删除提示并验证输入是否合法void MoreLinesDelete(ActiveText &activeText);/多行删除提示并验证输入是否合法void Insert(ActiveText &activeText);/插入提示并验证输入是否合法void Change(ActiveText &activeText);/活区切换提示(是否为最后分区)void Run();/控制程序运行int _tmai
7、n(int argc, _TCHAR* argv);/主程序四、程序调试调试程序五、核心源程序清单和执行结果入口主程序:/ TextEdit.cpp : 定义控制台应用程序的入口点。#include stdafx.h#includeActiveText.h#include #include using namespace std;/当应该输入数字时相应的检查void CheckNum(int &number) while(!cin) cin.clear (); cin.sync(); coutnumber; void OutTip(ActiveText &activeText) activeT
8、ext.Display (); cout各种编辑操作如下所示:n; coutl:上一页n:下一页d:删除i:插入c:切换分区e:退出n; cout请输入相应的命令n;void Delete(ActiveText &activeText) int lineNum; char yes; cout请输入你要删除的行号n; do int n=1; if(1!=n) coutlineNum; CheckNum(lineNum); n=0; while(lineNumactiveText.LineNum (); coutyes; while(y!=yes&n!=yes) coutyes; if(y=yes
9、) activeText.DeleteLine (lineNum); OutTip(activeText); void MoreLinesDelete(ActiveText &activeText) int startLine,endLine; do coutstartLine; CheckNum(startLine); while(1startLine|startLineactiveText.LineNum () coutstartLine; CheckNum(startLine); coutendLine; CheckNum(endLine); while(1endLine|endLine
10、activeText.LineNum () coutendLine; CheckNum(endLine); if(startLineendLine) coutendLine); coutyes; while(y!=yes&n!=yes) coutyes; if(y=yes) activeText.DeleteLine (startLine,endLine); OutTip(activeText); void Insert(ActiveText &activeText) string text; int lineNum; couttext; coutlineNum; CheckNum(lineN
11、um); while(lineNumactiveText.LineNum ()+1) coutlineNum; CheckNum(lineNum); try activeText.InsertLine(lineNum,text); catch(int) cout活区已满,不可插入n; return; OutTip(activeText);void Change(ActiveText &activeText) try activeText.Change (); catch(char*) coutchoice; switch(choice) case d: char oneLine; couton
12、eLine; while(oneLine!=a&oneLine!=b) coutoneLine; if(a=oneLine) Delete(activeText); else MoreLinesDelete(activeText); break; case i: Insert(activeText);break; case c: Change(activeText);break; case e: exit(1); case l: try activeText.LastPage(); OutTip(activeText); catch(char*) cout已经是第一页n; break; cas
13、e n: try activeText.NextPage(); OutTip(activeText); catch(char*) cout已经是最后一页n; break; default: cout请输入合法的命令:n; int _tmain(int argc, _TCHAR* argv) Run(); return 0;活区类申明:#pragma once#include #include using namespace std;class ActiveTextpublic: ActiveText(void); ActiveText(void); ActiveText(string inpu
14、tFile,string outputFile); void InsertLine(int lineNum,string text); void DeleteLine(int lineNum); void DeleteLine(int startLine,int endLine); void Change(); void Display(); int LineNum(); / void NextPage(); void LastPage(); /private: static const int activemaxlen=120;/活区的最大行块 static const int maxlin
15、e=60;/最多读入的行数。 static const int maxdisplayline=80; static const int maxcharnum=321; static const int charnum=81; char textactivemaxlen*charnum;/存编辑的文本。 int lineStartmaxdisplayline;/文本每行在text中的起始位置。 int textLine;/实际的文本行数 int end;/文本的最后一个字符在text中的位置 ifstream input; ofstream output; / int page;/当前处于第pa
16、ge页 static const int lineofpage=20;/每页的行数;活区类定义:#include StdAfx.h#include ActiveText.h#includeActiveText:ActiveText(void)ActiveText:ActiveText(void)/析构 this-input .close(); this-output.close();ActiveText:ActiveText(string inputFile,string outputFile) this-input.open(inputFile); this-output.open(outp
17、utFile,ios:app); if(!input|!output) std:coutpage=1; int linenum=0; int start=0; for(int i=0;imaxdisplayline) throw(lineNum); /插入行后面的所有行向后移动一行 for(int i=textLine;i=lineNum;-i) lineStarti=lineStarti-1; lineStartlineNum-1=end+1; /插入文本 for(int i=0;itext+end=texti; this-text+end=0; +textLine;void ActiveT
18、ext:DeleteLine(int lineNum) for(int i=lineNum-1;itextLine-1;+i) lineStarti=lineStarti+1; -textLine;void ActiveText:DeleteLine(int startLine,int endLine) for(int i=startLine-1;itextLine-1;+i) lineStarti=lineStarti+endLine-startLine+1; textLine-=(endLine-startLine+1);void ActiveText:Change() if(input.
19、eof() throw(已无分区); /写到输出文件 for(int i=0;itextLine;+i) outputtext+lineStarti; outputn; /保留上个活区中的最后一行数据 int tempend=0; for(int i=lineStarttextLine-1;i=end;+i) texttempend+=texti; end=-tempend; textLine=1; lineStart0=0; /读入下个活区中的数据 int start=end+1; int i;/i+1表示行号 for(i=1;ipage=1;void ActiveText:Display(
20、) for(int i=(this-page-1)*this-lineofpage;itextLine&ipage*this-lineofpage;+i) couti+1 text+lineStartitextLine%this-lineofpage)?this-textLine/this-lineofpage:(this-textLine/this-lineofpage+1); if(this-page=maxpage) throw(最后一页); +this-page;void ActiveText:LastPage() if(1=this-page) throw(第一页); -this-p
21、age ;执行结果:活区显示及下一页:行删除:行插入:活区切换:如果输入非法命令:六、感想与体会 经过这一周的课设,我完成了简单行编辑程序,期间虽然遇到了很多问题和困难,但是在老师的指导下和同学的帮助中总算把问题一个一个的解决了。由于以前在C+课程中文件输入输出功能用的比较少,所以程序中的从文件读和存入文件的模块出现的问题比较多,但是经过查阅课本和相关资料得到了解决。这次课设的程序比较大,不像以前写的小程序,代码量多是一部分,但最总重要的是相关功能的方法的处理中用的数据结构,以及各个函数中使用的变量的关系。而且每个功能的实现并不是能一次成功的,要经过反复的测试找出漏洞和不足的地方进行修改。在程序总体设计中通过画程序流程图和模块图使程序脉络变得更加清晰,写起来更加容易。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1