简单行编辑程序.docx
《简单行编辑程序.docx》由会员分享,可在线阅读,更多相关《简单行编辑程序.docx(27页珍藏版)》请在冰点文库上搜索。
简单行编辑程序
学号09710215
数据结构课程设计
设计说明书
简单行编辑程序
起止日期:
2012年1月1日至2012年1月5日
学生姓名
孙明章
班级
09计算机2班
成绩
指导教师(签字)
电子与信息工程系
2012年1月6日
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系计算机科学与技术专业2班级
课程设计名称:
数据结构课程设计
设计题目:
简单行编辑程序
完成期限:
自2012年1月2日至2012年1月6日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;
(4)认真编写课程设计报告。
三、设计内容
简单行编辑程序
问题描述如下:
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。
一种解决方法是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按照这种方法实现一个简单的行编辑程序。
设文件每行不超过320个字符,很少超过80字符。
具体功能如下:
(1)行插入。
格式:
i<行号><回车><文本><回车>
将<文本>插入活区中第<行号>行之后
(2)行删除。
格式:
d<行号1>[□<行号2>]<回车>
删除活区中第<行号1>行(到第<行号2>行)。
两种格式的例子是:
“d10↙”和“d10□14↙”
(3)活区切换。
格式:
c<回车>
将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。
格式:
p<回车>
逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后各页(如果存在)。
各条命令中的行号均须在活区中各行行号范围之内,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。
目录
一、需求分析-4-
二、总体设计-5-
三、详细设计-7-
四、程序调试-8-
五、核心源程序清单和执行结果-8-
六、感想与体会-24-
一、需求分析
简单行编辑程序,本程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总能实现。
一种解决方法是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按照这种方法实现一个简单的行编辑程序。
设文件每行不超过320个字符,很少超过80字符。
二、总体设计
1.程序设计组成框图
2.程序流程图
图2-1活区类
存储所有活区信息
三、详细设计
ActiveText类的一些重要方法:
voidInsertLine(intlineNum,stringtext);//行插入
voidDeleteLine(intlineNum);//单行删除
voidDeleteLine(intstartLine,intendLine);//多行删除
voidChange();//活区切换
voidDisplay();//活区显示
intLineNum();//活区的实际行数
voidNextPage();//显示下一页
voidLastPage();//显示上一页
主程序中的一些重要方法:
voidDelete(ActiveText&activeText);//单行删除提示并验证输入是否合法
voidMoreLinesDelete(ActiveText&activeText);//多行删除提示并验证输入是否合法
voidInsert(ActiveText&activeText);//插入提示并验证输入是否合法
voidChange(ActiveText&activeText);//活区切换提示(是否为最后分区)
voidRun();//控制程序运行
int_tmain(intargc,_TCHAR*argv[]);//主程序
四、程序调试
调试程序
五、核心源程序清单和执行结果
入口主程序:
//TextEdit.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include"ActiveText.h"
#include
#include
usingnamespacestd;
//当应该输入数字时相应的检查
voidCheckNum(int&number)
{
while(!
cin)
{
cin.clear();
cin.sync();
cout<<"请输入数字\n";
cin>>number;
}
}
voidOutTip(ActiveText&activeText)
{
activeText.Display();
cout<<"各种编辑操作如下所示:
\n";
cout<<"l:
上一页n:
下一页d:
删除i:
插入c:
切换分区e:
退出\n";
cout<<"请输入相应的命令\n";
}
voidDelete(ActiveText&activeText)
{
intlineNum;
charyes;
cout<<"请输入你要删除的行号\n";
do{
intn=1;
if(1!
=n)
{
cout<<"请输入有效数字\n";
}
cin>>lineNum;
CheckNum(lineNum);
n=0;
}while(lineNum<1||lineNum>activeText.LineNum());
cout<<"你确认吗?
y/n\n";
cin>>yes;
while('y'!
=yes&&'n'!
=yes)
{
cout<<"请输入合法命令";
cin>>yes;
}
if('y'==yes)
{
activeText.DeleteLine(lineNum);
OutTip(activeText);
}
}
voidMoreLinesDelete(ActiveText&activeText)
{
intstartLine,endLine;
do{
cout<<"请输入你要删除的起始行\n";
cin>>startLine;
CheckNum(startLine);
while(1>startLine||startLine>activeText.LineNum())
{
cout<<"你的起始行输入不合法\n";
cin>>startLine;
CheckNum(startLine);
}
cout<<"请输入你要删除的终止行\n";
cin>>endLine;
CheckNum(endLine);
while(1>endLine||endLine>activeText.LineNum())
{
cout<<"你的终止行输入不合法\n";
cin>>endLine;
CheckNum(endLine);
}
if(startLine>endLine)
{
cout<<"你输入的起始行小于终止行,请重新输入\n";
}
}while(startLine>endLine);
cout<<"你确认吗?
y/n\n";
charyes;
cin>>yes;
while('y'!
=yes&&'n'!
=yes)
{
cout<<"输入的命令不合法\n";
cin>>yes;
}
if('y'==yes)
{
activeText.DeleteLine(startLine,endLine);
OutTip(activeText);
}
}
voidInsert(ActiveText&activeText)
{
stringtext;
intlineNum;
cout<<"请输入你要插入的文本\n";
cin>>text;
cout<<"请输入你要插入的行号\n";
cin>>lineNum;
CheckNum(lineNum);
while(lineNum<1||lineNum>activeText.LineNum()+1)
{
cout<<"请输入有效数字\n";
cin>>lineNum;
CheckNum(lineNum);
}
try
{
activeText.InsertLine(lineNum,text);
}
catch(int)
{
cout<<"活区已满,不可插入\n";
return;
}
OutTip(activeText);
}
voidChange(ActiveText&activeText)
{
try
{
activeText.Change();
}
catch(char*)
{
cout<<"这已经是最后分区.\n";
return;
}
OutTip(activeText);
}
voidRun()
{
stringinput="input.txt";
stringoutput="output.txt";
ActiveTextactiveText(input,output);
OutTip(activeText);
charchoice;
while(true)
{
cin>>choice;
switch(choice)
{
case'd':
charoneLine;
cout<<"你要删除一行还是多行?
a:
一行b:
多行\n";
cin>>oneLine;
while(oneLine!
='a'&&oneLine!
='b')
{
cout<<"请输入合法命令\n";
cin>>oneLine;
}
if('a'==oneLine)
Delete(activeText);
elseMoreLinesDelete(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;
case'n':
try
{
activeText.NextPage();
OutTip(activeText);
}
catch(char*)
{
cout<<"已经是最后一页\n";
}
break;
default:
cout<<"请输入合法的命令:
\n";
}
}
}
int_tmain(intargc,_TCHAR*argv[])
{
Run();
return0;
}
活区类申明:
#pragmaonce
#include
#include
usingnamespacestd;
classActiveText
{
public:
ActiveText(void);
~ActiveText(void);
ActiveText(stringinputFile,stringoutputFile);
voidInsertLine(intlineNum,stringtext);
voidDeleteLine(intlineNum);
voidDeleteLine(intstartLine,intendLine);
voidChange();
voidDisplay();
intLineNum();
/////////
voidNextPage();
voidLastPage();
/////////////
private:
staticconstintactivemaxlen=120;//活区的最大行块
staticconstintmaxline=60;//最多读入的行数。
staticconstintmaxdisplayline=80;
staticconstintmaxcharnum=321;
staticconstintcharnum=81;
chartext[activemaxlen*charnum];//存编辑的文本。
intlineStart[maxdisplayline];//文本每行在text中的起始位置。
inttextLine;//实际的文本行数
intend;//文本的最后一个字符在text中的位置
ifstreaminput;
ofstreamoutput;
///////
intpage;//当前处于第page页
staticconstintlineofpage=20;//每页的行数
};
活区类定义:
#include"StdAfx.h"
#include"ActiveText.h"
#include
ActiveText:
:
ActiveText(void)
{
}
ActiveText:
:
~ActiveText(void)//析构
{
this->input.close();
this->output.close();
}
ActiveText:
:
ActiveText(stringinputFile,stringoutputFile)
{
this->input.open(inputFile);
this->output.open(outputFile,ios:
:
app);
if(!
input||!
output)
{
std:
:
cout<<"输入输出流异常";
exit
(1);
}
this->page=1;
intlinenum=0;
intstart=0;
for(inti=0;i{
if(input.eof())
break;
input.getline(text+start,maxcharnum);
lineStart[linenum++]=start;
start+=strlen(text+start)+1;
}
textLine=linenum;
end=start-1;
}
voidActiveText:
:
InsertLine(intlineNum,stringtext)
{
if(textLine+1>maxdisplayline)
{
throw(lineNum);
}
//插入行后面的所有行向后移动一行
for(inti=textLine;i>=lineNum;--i)
{
lineStart[i]=lineStart[i-1];
}
lineStart[lineNum-1]=end+1;
//插入文本
for(inti=0;i{
this->text[++end]=text[i];
}
this->text[++end]='\0';
++textLine;
}
voidActiveText:
:
DeleteLine(intlineNum)
{
for(inti=lineNum-1;i{
lineStart[i]=lineStart[i+1];
}
--textLine;
}
voidActiveText:
:
DeleteLine(intstartLine,intendLine)
{
for(inti=startLine-1;i{
lineStart[i]=lineStart[i+endLine-startLine+1];
}
textLine-=(endLine-startLine+1);
}
voidActiveText:
:
Change()
{
if(input.eof())
throw("已无分区");
//写到输出文件
for(inti=0;i{
output<output<<"\n";
}
//保留上个活区中的最后一行数据
inttempend=0;
for(inti=lineStart[textLine-1];i<=end;++i)
{
text[tempend++]=text[i];
}
end=--tempend;
textLine=1;
lineStart[0]=0;
//读入下个活区中的数据
intstart=end+1;
inti;//i+1表示行号
for(i=1;i{
if(input.eof())
break;
input.getline(text+start,maxcharnum);
lineStart[i]=start;
start+=strlen(text+start)+1;
}
textLine=i;
end=start-1;
this->page=1;
}
voidActiveText:
:
Display()
{
for(inti=(this->page-1)*this->lineofpage;ipage*this-
>lineofpage;++i)
{
cout<
}
}
intActiveText:
:
LineNum()
{
returntextLine;
}
voidActiveText:
:
NextPage()
{
intmaxpage=(0==this->textLine%this->lineofpage)?
this->textLine/this-
>lineofpage:
(this->textLine/this->lineofpage+1);
if(this->page==maxpage)
throw("最后一页");
++this->page;
}
voidActiveText:
:
LastPage()
{
if(1==this->page)
throw("第一页");
--this->page;
}
执行结果:
活区显示及下一页:
行删除:
行插入:
活区切换:
如果输入非法命令:
六、感想与体会
经过这一周的课设,我完成了简单行编辑程序,期间虽然遇到了很多问题和困难,但是在老师的指导下和同学的帮助中总算把问题一个一个的解决了。
由于以前在C++课程中文件输入输出功能用的比较少,所以程序中的从文件读和存入文件的模块出现的问题比较多,但是经过查阅课本和相关资料得到了解决。
这次课设的程序比较大,不像以前写的小程序,代码量多是一部分,但最总重要的是相关功能的方法的处理中用的数据结构,以及各个函数中使用的变量的关系。
而且每个功能的实现并不是能一次成功的,要经过反复的测试找出漏洞和不足的地方进行修改。
在程序总体设计中通过画程序流程图和模块图使程序脉络变得更加清晰,写起来更加容易。