C++集中上机报告.docx
《C++集中上机报告.docx》由会员分享,可在线阅读,更多相关《C++集中上机报告.docx(20页珍藏版)》请在冰点文库上搜索。
![C++集中上机报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/598b08ec-103d-4f87-81b9-3379e4c0f860/598b08ec-103d-4f87-81b9-3379e4c0f8601.gif)
C++集中上机报告
C++集中上机报告
继承结构
学院:
计算机学院
班级:
xxx
姓名:
xxx
合作者:
指导教师:
xxx
2010年6月2日
目录
一.概述1
二.总体方案设计1
三.详细设计2
四.程序的调试与运行结果说明3
五.课程设计总结3
六.后记3
七.附录3
参考文献3
一概述
1.课程设计的目的
熟练掌握C++语言的基本知识和C++调试技能;
基本掌握面向对象程序设计的基本思路和方法;
能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2.课程设计的要求
要求利用面向对象的方法以及VC++的编程思想来完成系统的设计。
试建立一个继承结构,以栈、队列为派生类,建立它们的抽象基类-Bag类,写出各个类的声明及定义,并实现如下功能:
功能:
统一命名各派生类的插入操作为Add,删除操作为Remove。
统一命名各派生类的存取操作为Get和Put。
统一命名各派生类的初始化操作为MakeEmpty,判空操作为Full,计数操作为Length。
要求能将一个栈或队列的内容存入一个文件中,并可从一个文件中读入一个栈或队列。
3.课程设计的主要设计思想
主要利用面向对象的方法以及VC++的派生、继承的思想。
二总体方案设计
本次设计以C++的面向对象设计方法为主要思路,由抽象类bag派生出栈类Stack和队列类Queue。
2个子类共同的属性和方法在父类中定义,其中方法以纯虚函数方式定义,以实现函数的动态绑定。
在具体实现中,栈使用固定最大长度栈,队列使用固定长度循环队列;文件的读写采用输入输出流的方式。
程序总体难度不大,关键问题有抽象类的定义,和栈、队列操作的实现算法。
具备功能有:
对栈和队列的插入、删除操作;将整个栈或队列写入文件;把文件中的信息依次读入栈或队列;并提供了对栈或队列进行初始化、判断是否满和元素计数的方法。
程序界面采用标准控制台输入输出方式。
文件操作采用输入输出流的方法。
三详细设计
类结构图:
栈结构示意图:
栈顶标识和栈中元素的关系图
循环队列结构示意图:
循环队列头尾标识和元素的关系图:
程序运行流程图
四程序的调试与运行结果说明
功能联合演示:
(控制台输出记录)
字符串栈/队列演示程序
请输入
11-入栈21-入队列
12-出栈22-出队列
13-将栈中内容写入文件23-将队列内容写入文件
14-从文件中加载内容入栈24-从文件中加载内容入队列
5-显示目前状态6-退出
操作-11
输入入栈的字符串:
first
操作-11
输入入栈的字符串:
second
操作-11
输入入栈的字符串:
third
操作-13
输出到文件的文件名:
stack.txt
操作-12
third
操作-11
输入入栈的字符串:
another
操作-12
another
操作-24
输入到队列的文件名:
stack.txt
已导入
操作-21
输入入队列的字符串:
another
操作-22
first
操作-24
输入到队列的文件名:
stack.txt
已导入
操作-24
输入到队列的文件名:
stack.txt
已导入
操作-24
队列已经满了
操作-5
当前状态
栈最大长度:
10队列最大长度:
9
测试栈目前长度:
2,未满
测试队列目前长度:
9,已满
操作-23
输出到文件的文件名:
queue.txt
操作-14
输入到栈的文件名:
queue.txt
由于栈已满未能完全导入
操作-5
当前状态
栈最大长度:
10队列最大长度:
9
测试栈目前长度:
10,已满
测试队列目前长度:
9,已满
操作-12
second
操作-6
Pressanykeytocontinue
stack.txt内容:
firstsecondthird
queue.txt内容:
secondthirdanotherfirstsecondthirdfirstsecondthird
五课程设计总结
本程序已经达到了全部的设计要求,几经修改,已经比较完善。
但是用户界面还不是很友好。
如果需要改进,应该采用图形界面以使得程序更为直观。
本次集中上机遇到的问题和解决办法:
1.栈和队列的添加删除元素的具体算法比较抽象。
解决办法是参考了数据结构的教材,选择了固定长度栈和循环队列2种数据结构。
2.出栈或出队列时,函数难以返回栈空或队列空信息。
最终使用了返回一个空字符串的方式通知空消息。
3.从文件中输入文本时,难以区分各元素间隔。
解决方法是在输出到文件时每个字符串后增加空格。
虽然解决了问题,但是也造成了输入的字符串中不能有空格这个缺点。
4.依然在从文件中输入文本时,读入的第一个字符串第一个字母丢失。
解决方法,在输出时每个字符串之前也增加一个空格。
5.在菜单输入界面中,若输入的不是整数将导致死循环。
解决办法是增加输入处理函数,判断输入是否符合要求。
6.从文件中输入时,判断文件是否存在的办法。
解决方法是判断了get()函数是否等于EOF,若等则表示文件不存在或空文件。
7.由于采用固定长度的栈和队列,因此存在从文件中读取信息时,尚未装入全部文件信息,栈/队列已经满了的情况。
解决办法是给用于读取文件的Get()函数3种返回值,并在主函数中分情况输出提升信息。
8.在上一个问题中,采取了措施后仍未奏效。
原因在于,使用了紧凑的读取循环判断条件,导致难以判断文件是否已经读取完了。
解决办法是增加一个临时字符串,并测试读取文件到这个测试字符串中,若读取失败则说明文件已经读完。
六后记
这次实验使我重新认识了数据结构在编程中的地位,在编写过程中遇到的难以解决的BUG大多是算法方面的,而最终的解决方法也有些盲目的成分,虽然解决了问题,但是今后还必须加强算法方面的训练。
此外由于对MFC不太熟悉,程序仍然使用了控制台界面,不能不说是一个遗憾。
在编写过程中遇到的不能自己解决问题大多通过查阅资料和网上搜索解决了,相对之前的实验降低了对其他同学和老师的依赖,这对培养独立解决问题的能力还是有帮助的。
当然,在此也要感谢帮助过我的同学和老师,我取得的进步离不开同学和老师的支持。
七附录
//题十二:
建立一个继承结构
//xxx
#include
#include
#include
usingnamespacestd;
constintmax=10;
classbag
{
public:
virtualvoidMakeEmpty()=0;
virtualboolAdd(string)=0;
virtualstringRemove()=0;
virtualboolFull()=0;
virtualintLength()=0;
virtualintGet(stringfilename)=0;
virtualvoidPut(stringfilename)=0;
protected:
inttop;
stringdat[max];
};
classStack:
publicbag
{
public:
voidMakeEmpty()
{
top=0;
}
boolAdd(stringadd)
{
if(top>=max)returnfalse;
dat[top]=add;
top++;
returntrue;
}
stringRemove()
{
if(top<=0)return"";
top--;
returndat[top];
}
boolFull()
{
if(top==max)returntrue;
elsereturnfalse;
}
intLength()
{
returntop;
}
intGet(stringfilename)
{
ifstreaminfile;
stringtest;
infile.open(filename.c_str());
if(infile.get()==EOF)return0;
for(;top>dat[top];top++);
if(infile>>test)//仍能读说明文件没有读完
{
infile.close();
return2;
}
infile.close();
return1;
}
voidPut(stringfilename)
{
ofstreamoutfile;
outfile.open(filename.c_str());
for(intp=0;poutfile.close();
}
private:
};
classQueue:
publicbag//采用循环队列
{
public:
voidMakeEmpty()
{
top=0,end=0;
}
boolAdd(stringadd)
{
if((end+1)%max==top)returnfalse;
dat[end]=add;
end=(end+1)%max;
returntrue;
}
stringRemove()
{
if(top==end)return"";
stringrtn=dat[top];
top=(top+1)%max;
returnrtn;
}
boolFull()
{
if((end+1)%max==top)returntrue;
elsereturnfalse;
}
intLength()
{
return(end-top+max)%max;
}
intGet(stringfilename)
{
ifstreaminfile;
stringtest;
infile.open(filename.c_str());
if(infile.get()==EOF)return0;
for(;(end+1)%max!
=top&&infile>>dat[end];end=(end+1)%max);
if(infile>>test)//仍能读说明文件没有读完
{
infile.close();
return2;
}
infile.close();
return1;
}
voidPut(stringfilename)
{
ofstreamoutfile;
outfile.open(filename.c_str());
for(intp=top;p!
=(end)%max&&outfile<<""+dat[p]+"";p=(p+1)%max);
outfile.close();
}
private:
intend;
};
intisinteger(stringstr)//判断是否整数
{
inti(0);
while(i{
if(!
isdigit(str[i]))
{
return-1;
}
i++;
}
returnatoi(str.c_str());
}
voidmain()
{
Stackcstack;
Queuecqueue;
cstack.MakeEmpty();cqueue.MakeEmpty();
stringuserinput;
boolmloop=true;
cout<<"字符串栈/队列演示程序"<cout<<"请输入"<<<"12-出栈"<<"22-出队列"<<<"13-将栈中内容写入文件"<<"23-将队列内容写入文件"<<<"14-从文件中加载内容入栈"<<"24-从文件中加载内容入队列"<<<"5-显示目前状态"<<"6-退出"<while(mloop)
{
cout<cin>>userinput;
switch(isinteger(userinput))
{
case11:
if(cstack.Full())
{
cout<<"栈已经满了"<}
cout<<"输入入栈的字符串:
";
cin>>userinput;
if(cstack.Add(userinput));
elsecout<<"栈满,错误"<break;
case12:
userinput=cstack.Remove();
if(userinput=="")cout<<"栈空"<elsecout<break;
case13:
cout<<"输出到文件的文件名:
";
cin>>userinput;
cstack.Put(userinput);
break;
case14:
if(cstack.Full())
{
cout<<"栈已经满了"<}
cout<<"输入到栈的文件名:
";
cin>>userinput;
switch(cstack.Get(userinput))
{
case0:
cout<<"文件不存在或空文件"<case1:
cout<<"已导入"<case2:
cout<<"由于栈已满未能完全导入"<}
break;
case21:
if(cqueue.Full())
{
cout<<"队列已经满了"<}
cout<<"输入入队列的字符串:
";
cin>>userinput;
if(cqueue.Add(userinput));
elsecout<<"队列满,错误"<break;
case22:
userinput=cqueue.Remove();
if(userinput=="")cout<<"队列空"<elsecout<break;
case23:
cout<<"输出到文件的文件名:
";
cin>>userinput;
cqueue.Put(userinput);
break;
case24:
if(cqueue.Full())
{
cout<<"队列已经满了"<}
cout<<"输入到队列的文件名:
";
cin>>userinput;
switch(cqueue.Get(userinput))
{
case0:
cout<<"文件不存在或空文件"<case1:
cout<<"已导入"<case2:
cout<<"由于队列已满未能完全导入"<}
break;
case5:
cout<<"当前状态"<cout<<"栈最大长度:
"<"<cout<<"测试栈目前长度:
"<if(cstack.Full())cout<<"已满";
elsecout<<"未满";
cout<cout<<"测试队列目前长度:
"<if(cqueue.Full())cout<<"已满";
elsecout<<"未满";
cout<break;
case6:
mloop=false;
break;
default:
break;
}
}
}
参考文献
[1]甘玲石岩李盘林,解析C++面向对象程序设计,北京,清华大学出版社,2008年2月;
[2]严蔚敏吴伟民,数据结构(C语言版),北京,清华大学出版社。
1997年4月。