堆栈应用题.docx

上传人:b****8 文档编号:10361681 上传时间:2023-02-10 格式:DOCX 页数:27 大小:1.97MB
下载 相关 举报
堆栈应用题.docx_第1页
第1页 / 共27页
堆栈应用题.docx_第2页
第2页 / 共27页
堆栈应用题.docx_第3页
第3页 / 共27页
堆栈应用题.docx_第4页
第4页 / 共27页
堆栈应用题.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

堆栈应用题.docx

《堆栈应用题.docx》由会员分享,可在线阅读,更多相关《堆栈应用题.docx(27页珍藏版)》请在冰豆网上搜索。

堆栈应用题.docx

堆栈应用题

程序与算法综合设计

课程设计报告

 

设计题目:

堆栈应用题

学生姓名:

专业:

班级:

 

指导老师:

 

完成日期:

2013.7.6

 

合肥工业大学

 

(一)需求和规格说明

堆栈应用题

要求:

一、设计一个堆栈类,实现对于软件操作中常用的撤销/重做

(Undo/Redo)的支持。

二、使用控制台或者图形界面,测试这个堆栈类的使用。

三、创建一个文件并进行编辑

注:

一、二为题目要求,三是自己附加的功能

(二)设计

系统类图

f_stack

intcount;//统计数目

node*top;//头指针

filestack();

~filestack();

boolempty()const;

error_codeget_top(charfileroad[],charfilename[])const;//取出栈顶元素

error_codepush(charfileroad[],charfilename[]);//压栈

error_codepop();//弹栈

error_codepop(charfileroad[],charfilename[]);//将指定元素出栈

boolsearch(charfileroad[],charfilename[]);//寻找指定元素

 

类外的函数

函数名称

返回类型

所含参数

实现功能

in_word()

int

charfileroad[]

charfilename[]

对文件进行输入编辑

copy_word()

int

charfileorignl[]

charfilename[]

charfileroad[]

对文件中的内容进行拷贝

creatfile()

void

charfileroad[]

charfilename[]

filestack&

fstack1

filestack&

fstack3

filestack&

fstack4

创建新文件并备份

deletefile()

void

filestack&fstack

charfileroad[]

charfilename[]

删除文件操作

recoverfile()

void

filestack&fstack,

charfileroad[]

charfilename[]

恢复删除的文件

recoverfileroad()

void

filestack&fstack

charofileroad[]

charfileroad[]

charfilename[]

复制文件路径

undo_moreoperate()

void

filestack&fstack1

filestack&fstack2

filestack&fstack3

filestack&fstack4

char&op

charfroado[]

撤销之前的某步操作

undo_operate()

void

filestack&fstack1

filestack&fstack2

filestack&fstack3

filestack&fstack4

char&op

charfroado[]

撤消操作

searchroad()

void

filestack&fstack4

charofileroad[]

charfilename[]

寻找文件路径

redo_file()

void

filestack&fstack1

filestack&fstack3

filestack&fstack4

重做操作

delete_copyoperate()

void

filestack&fstack

删除副本(及删除“copy”文件夹里的文件)

save()

void

filestack&fstack

对所有操作进行保存,不可恢复

f_operate()

void

对文件进行操作

(三)用户手册

程序运行时,首先提示选择要进行的操作。

对于创建文件时,提示输入文件路径以及文件名

对于撤消操作时,提示进行撤销上一步还是撤销之前的操作;

对于重做操作,提示进行恢复的路径;

对于结束所有操作,提示是否保存所有操作。

(四)调试及测试

运行实例:

(1)创建文件的操作

(2)撤销操作

(3)重做操作

(4)保存所有操作

 

进一步改进

(1)目前程序中,主要以建立文件,删除文件以及恢复文件为主要功能,辅以对文件进行编辑。

以后可以加入打开文件等其他功能。

(2)目前是通过控制台进行操作,并不是很直观,在以后可以借助图形界面(MFC)来实现对文件的操作。

附录源程序

(1)f_stack.h

#include

#include

#include

usingnamespacestd;

enumerror_code{success,underflow};

structnode{

charfroad[50];//存储文件路径

charfname[30];//存储文件名

node*next;

};

classfilestack{

public:

filestack();

~filestack();

boolempty()const;

error_codeget_top(charfileroad[],charfilename[])const;//取出栈顶元素

error_codepush(charfileroad[],charfilename[]);//压栈

error_codepop();//弹栈

error_codepop(charfileroad[],charfilename[]);//将指定元素出栈

boolsearch(charfileroad[],charfilename[]);//寻找指定元素

private:

intcount;

node*top;

};

filestack:

:

filestack(){

count=0;

top=NULL;

}

boolfilestack:

:

empty()const{

returncount==0;

}

error_codefilestack:

:

get_top(charfileroad[],charfilename[])const{

if(empty()){

returnunderflow;

}

else{

strcpy(fileroad,top->froad);

strcpy(filename,top->fname);

returnsuccess;

}

}

error_codefilestack:

:

push(charfileroad[],charfilename[]){

node*s=newnode;

strcpy(s->froad,fileroad);

strcpy(s->fname,filename);

s->next=NULL;

s->next=top;

top=s;

count++;

returnsuccess;

}

error_codefilestack:

:

pop(){

if(empty()){

returnunderflow;

}

else{

node*u=top;

top=top->next;

deleteu;

count--;

returnsuccess;

}

}

error_codefilestack:

:

pop(charfileroad[],charfilename[])

{

charcroad[80];

strcpy(croad,fileroad);

strcat(croad,filename);

filestackf1;

if(empty()){

returnunderflow;

}

else{

charfr[50],frc[50],fn[30];

get_top(fr,fn);

strcpy(frc,fr);

if(strcmp(strcat(frc,fn),croad)==0){

pop();

}

else{

while(strcmp(strcat(frc,fn),croad)!

=0){

f1.push(fr,fn);

pop();

get_top(fr,fn);

strcpy(frc,fr);

}

pop();

while(!

f1.empty()){

f1.get_top(fr,fn);

push(fr,fn);

f1.pop();

}

}

}

returnsuccess;

}

//寻找指定文件

boolfilestack:

:

search(charfileroad[],charfilename[])

{

charcroad[80];

strcpy(croad,fileroad);

strcat(croad,filename);

filestackf1;

if(empty()){

returnfalse;

}

else{

charfr[50],frc[50],fn[30];

get_top(fr,fn);

strcpy(frc,fr);

if(strcmp(strcat(frc,fn),croad)==0){

returntrue;

}

else{

while(strcmp(strcat(frc,fn),croad)!

=0){

f1.push(fr,fn);

pop();

get_top(fr,fn);

strcpy(frc,fr);

}

while(!

f1.empty()){

f1.get_top(fr,fn);

push(fr,fn);

f1.pop();

}

returntrue;

}

}

returnfalse;

}

//析构函数

//对文件进行文字编辑

intin_word(charfileroad[],charfilename[])

{

charc='A';

charfrc[50];

strcpy(frc,fileroad);//拷贝文件路径

charfname[80];

strcpy(fname,strcat(frc,filename));

ofstreamoutfile(fname,ios:

:

out|ios:

:

trunc);//打开相应文件

if(!

outfile){

cerr<<"openerror!

"<

exit

(1);

}

cout<<"enterthewords:

"<

//进行文字的录入

while(c!

='\\'){

cin>>c;

outfile<

}

outfile.close();

return0;

}

//对文件中的内容进行拷贝

intcopy_word(charfileorignl[],charfilename[],charfileroad[])

{

}

//创建新文件并备份

voidcreatfile(charfileroad[],charfilename[],filestack&fstack1,filestack&fstack3,filestack&fstack4){

//指定备份路径

charfr[80]="copy/";

charfrc[80]="copy/";

charcroad[80];

charfrs[80]="redosave/";

charfrsc1[80]="redosave/";

charfrsc2[80]="redosave/";

charfrsr[80]="redosaveroad/";

charfrscr1[80]="redosaveroad/";

charfrscr2[80]="redosaveroad/";

strcpy(croad,fileroad);

//创建文件

ofstreamoutfile1(strcat(croad,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile1){

cerr<<"openerror!

"<

exit

(1);

}

outfile1.close();

//备份到指定路径

ofstreamoutfile2(strcat(fr,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile2){

cerr<<"copyerror!

"<

exit

(1);

}

outfile2.close();

//对所有创建操作建立映像

ofstreamoutfile3(strcat(frs,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile3){

cerr<<"savecopyerror!

"<

exit

(1);

}

outfile3.close();

//对创建文件的路径进行保存

ofstreamoutfile4(strcat(frsr,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile4){

cerr<<"savecopyerror!

"<

exit

(1);

}

charc[50];

inti=0;

while(fileroad[i]!

='\0'){

c[i]=fileroad[i];

i++;

}

c[i]='\0';

i=0;

while(c[i]!

='\0'){

outfile4<

i++;

}

outfile4.close();

cout<

cout<<"————成功建立(更新)"<

cout<

//对已创建的文件进行编辑

charchoice;

fstack1.push(fileroad,filename);

fstack3.push(frsc2,filename);

fstack4.push(frscr2,filename);

cout<<"是否需要对新创建的文件进行编辑?

\n需要,键入Y;不需要,键入N。

\n";

cout<<"请确认是否需要进行编辑:

";

do{

cin>>choice;

switch(choice){

case'N':

cout<<"请选择下一步操作。

"<

break;

case'Y':

in_word(fileroad,filename);

copy_word(croad,filename,frc);

copy_word(croad,filename,frsc1);

cout<<"结束编辑,请选择下一步操作。

"<

break;

default:

cout<<"输入错误!

请确认!

"<

break;

}}while(choice!

='Y'&&choice!

='N');

}

//删除文件操作

//恢复删除的文件

voidrecoverfile(filestack&fstack,charfileroad[],charfilename[])

{

fstack.push(fileroad,filename);

charor[80]="copy/";

strcat(or,filename);

charcroad[80];

strcpy(croad,fileroad);

ofstreamoutfile1(strcat(croad,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile1){

cerr<<"redoerror!

"<

exit

(1);

}copy_word(or,filename,fileroad);

outfile1.close();

}

//复制文件路径

voidrecoverfileroad(filestack&fstack,charofileroad[],charfileroad[],charfilename[])

{

fstack.push(fileroad,filename);

charfrsr[80];

strcpy(frsr,fileroad);

ofstreamoutfile(strcat(frsr,filename),ios:

:

out|ios:

:

trunc);

if(!

outfile){

cerr<<"savecopyerror!

"<

exit

(1);

}

charc[50];

inti=0;

while(ofileroad[i]!

='\0'){

c[i]=ofileroad[i];

i++;

}

c[i]='\0';

i=0;

while(c[i]!

='\0'){

outfile<

i++;

}

outfile.close();

}

//撤销之前的某步操作

voidundo_moreoperate(filestack&fstack1,filestack&fstack2,filestack&fstack3,filestack&fstack4,char&op,charfroado[])

{

charchoice='C';

charfileroad[50];

charfilename[30];

charofile[50]="copy/";

charsfile[50]="redosave/";

charsrfile[50]="redosaveroad/";

cout<<"请确认是恢复之前的删除(C),还是撤销之前的创建(U),请键入:

";

do{

cin>>choice;

switch(choice){

case'U':

cout<<"请输入要撤销之前创建的文件路径:

";

cin>>fileroad;

strcpy(froado,fileroad);

cout<<"请输入要撤销之前创建的文件名:

";

cin>>filename;

deletefile(fstack1,fileroad,filename);

deletefile(fstack3,sfile,filename);

deletefile(fstack4,srfile,filename);

fstack2.push(ofile,filename);

op='U';

break;

case'C':

cout<<"请输入要恢复之前删除的文件路径:

";

cin>>fileroad;

strcpy(froado,fileroad);

cout<<"请输入要恢复之前删除的文件名:

";

cin>>filename;

recoverfile(fstack1,fileroad,filename);

cout<<"已成功恢复文件"<

recoverfile(fstack3,sfile,filename);

recoverfileroad(fstack4,fileroad,srfile,filename);

fstack2.pop(ofile,filename);

op='C';

break;

default:

cout<<"请确认输入编号是否正确";

break;

}

}while(choice!

='C'&&choice!

='U');

}

//撤消操作

voidundo_operate(filestack&fstack1,filestack&fstack2,filestack&fstack3,filestack&fstack4,char&op,charfroado[])

{

charfileroad[50];

charfilename[30];

charchoice='O';

charofile[50]="copy/";

charsfile[50]="redosave/";

charsrfile[50]="redosaveroad/";

cout<<"请确认撤消操作!

撤销上一步键入O,其它请键入M\n";

cout<<"请输入:

";

do{

cin>>choice;

switch(choice){

case'O':

if(op=='C'){

fstack1.get_top(fileroad,filename);

strcpy(froado,fileroad);

deletefile(fstack1,fileroad,filename);

deletefile(fstack3,sfile,filename);

deletefile(fstack4,srfile,filename);

fstack2.push(ofile,filename);

cout<<"成功删除文件"<

\n";

op='U';

}

else{

fstack2.get_top(fileroad,filename);

recoverfile(fstack1,froado,filename);

recoverfile(fstack3,sfile,filename);

recoverfileroad(fstack4,froado,srfile,filename);

fstack2.pop();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1