面向对象程序设计实验指导书版.docx
《面向对象程序设计实验指导书版.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验指导书版.docx(83页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计实验指导书版.docx](https://file1.bdocx.com/fileroot1/2022-11/22/0e863246-e49c-4c6b-a591-7911ece6f1e2/0e863246-e49c-4c6b-a591-7911ece6f1e21.gif)
面向对象程序设计实验指导书版
LIAOCHENGUNIVERSITY
面向对象程序设计
实验指导书
聊城大学计算机学院
2011年3月
目 录
《面向对象程序设计》课程实验教学大纲
课程名称:
面向对象程序设计
英文名称:
ObjectOrientedProgramming
设置形式:
非独立设课
课程模块:
专业核心课
实验课性质:
专业基础实验
课程编号:
609324
课程负责人:
王玉亭
大纲主撰人:
王玉亭
大纲审核人:
左风朝
一、学时、学分
课程总学时:
54
实验学时:
16
课程学分:
3
二、适用专业及年级
计算机科学与技术、信息管理与信息系统、电子商务、软件工程、网络工程三年级
三、课程目标与基本要求
《面向对象程序设计》是计算机技术专业的一门必修课程,面向对象软件开发方法是吸收了软件工程领域有益概念和有效的方法而发展起来的一种软件开发方法,它集抽象性、封装性、继承性和多态性于一体,可以帮助人们开发出模块化、数据抽象程度高的,体现信息隐蔽、可复用、易修改、易扩大等特性的程序。
本课程主要介绍面向对象程序设计的方法和C++语言的基本概念以及基本Windows编程技术,其中以C++语言中的面向对象机制为主。
学习者在学习过程中可以通过大量的程序实例和相关练习,逐步掌握C++的面向过程和面向对象的功能,从而掌握面向对象程序设计的基本知识和基本技能。
在学习本课程中,只有通过大量的上机实验,才能使学生更好的掌握面向对象程序设计的方法,提高学生运用C++语言和面向对象思想进行编程来解决实际问题的能力。
课程目标:
使学生把在理论课程中所学知识融会贯通,在培养学生理论联系实际、实际动手能力的同时,着重培养学生思考问题、解决问题的能力和创造能力。
面向对象程序设计实验教学中一贯提倡以学生为主体、教师为主导,充分发挥学生的主观能动性。
基本要求:
本课程实验要求学生通过对各部分实验的具体操作练习,能够熟练的掌握C++的基本内容,包括控制结构、基本数据类型、表达式、函数、指针和引用、类与对象的概念以及封装、继承和多态等面向对象程序设计的基础理论,在这些基础理论的基础上,掌握初步的Windows编程技术,包括消息传递机制、MFC应用程序框架、文档视图结构等。
通过实验还要培养学生实事求是、踏实细致、严肃认真的科学态度和克服困难、坚韧不拔的工作作风,以及科学、良好的实验素质和习惯。
四、主要仪器设备
装有C++集成开发环境的微型计算机。
。
五、实验项目及教学安排
序号
实验项目名称
实验基本方法和内容
项目学时
项目
类型
每组
人数
教学要求
1
C++对C的扩充
使用集成开发环境开发简单C++程序;通过编写求斐波那契数列的第n项和前n项之和等简单程序,学习C++中的各种程序控制结构;通过解决Josephus问题,学习C++中各种运算符的功能、优先级和结合性;编写一个复杂的程序来学习自定义头文件的方法,学会调试多文件程序;分析五子棋游戏程序,学习指针的基本用法;编写简单程序学习动态内存的分配和释放,理解内存泄漏的危害。
2
基础
1
必修
2
类和对象
分析完整的Person类的定义,学习类和对象的概念、定义和使用方法;实现一个带有头结点的单链表,学习用类和对象解决实际问题。
4
基础
1
必修
3
继承和组合
分析完整的Person类和Employee类的定义,学习继承和派生概念;利用继承和组合的概念实现一个计算图形面积的类库。
。
4
基础
1
必修
4
多态、友元、虚函数、模板
利用抽象类设计一个计算图形面积的类库,学习动态联编的概念;分析Complex类的实现,理解重载运算符的意义;实现分数类,学习重载运算符方法,理解C++中的异常处理机制;用类模板实现一个带有头结点的单链表。
4
基础
1
必修
5
课程设计
学习Windows程序的消息处理机制和编程模式,分析设计自动取款机模拟系统,学习面向对象编程方法的思想,练习用面向对象编程方法解决实际问题。
2
综合
1
选修
六、考核方式及成绩评定
根据学生实验出勤情况、实验态度、实验报告成绩、实验考核成绩等评定实验成绩。
实验报告(含实验理论)占实验成绩的30%,实验技能(含实验态度)占实验成绩的30%,实验考核占实验成绩的40%。
最终实验成绩占该课程考核总成绩的20%—30%。
七、实验教科书、参考书
1.实验教科书
自编实验指导书。
2.实验参考书
实验一 C++对C的扩充
基本信息
实验课程:
面向对象程序设计设课形式:
非独立
课程学分:
2实验项目:
C++对C的扩充
项目类型:
基础项目学时:
2
实验预习
实验目的和要求:
1、了解在面向过程程序设计中C++对C语言的扩充与增强,并善于在编写程序过程中应用这些新的功能;
2、熟悉在Eclipse集成开发环境下编辑、编译、连接和运行C++程序的方法;
3、熟悉C++程序的结构和编程方法。
实验内容和原理或涉及的知识点:
1、验证大于等于4小于等于10000的偶数均可分解微量素数之和,并打印分解形式。
2、编写程序进行模拟仿真。
在码头酒馆和游船之间搭了一条长20米,宽4米的跳板,醉酒的船员和游客回艇时必须通过这个跳板。
通过跳板时,有三种可能的结果:
向前走,回到游船上休息,不再出来;转身回到酒馆,重新开始喝酒,不再出来;左右乱晃,落入水中淹死。
果醉酒者每次走一步,一步走1米。
而且他们向前走的概率是0.7,向左走、向右走和向后走的概率各为0.1。
现在假设开始时他们都是站在酒馆的门口,编写程序模拟出若干个醉酒者的最终行为结果。
3、编写程序解决Josephus问题。
Josephus问题是说,一群小孩围坐成一圈,现在任意取一个数n,从当前编号为一的孩子开始数起,依次数到n(因为围成了一圈,所以可以不停的数下去),这时被数到n的孩子离开,然后圈子缩小一点。
如此重复进行,小孩数不断减少,圈子也不断缩小。
最后所剩的那个小孩就是胜利者。
请找出这个胜利者。
4、编写程序实现五子棋棋游戏。
五子棋的规则为:
双方各执一色棋子,轮流下子(将子放在棋盘的任一未下子的点上),直到有一方的棋子有5个排成一线(无论是横、竖还是斜均可),则棋局结束,该方胜利。
实验条件:
1、装有Windows操作系统的微型计算机;
2、Eclipse集成开发环境和CDT插件;
3、MinGW编译环境。
实验设计方案:
1、熟悉在Eclipse集成开发环境下编辑、编译、连接和运行C++程序的方法。
2、借助流程图对程序进行“自顶向下、逐步求精”的结构化分析。
3、熟悉C++中const、引用、new、delete的用法。
4、利用“筛法”生成素数表。
5、实现模拟仿真要利用随机值函数。
实验过程
1、根据实验预习阶段的实验设计方案,编写应用程序。
参考代码如下。
#include
#include
constintM=10001;//定义验证范围
//函数CreatPrimeList():
生成素数表
voidCreatPrimeList(int*PrimeList,intn)
{
inti,j;
//将PrimeList的各元素设置为从0开始的正整数
for(i=0;i{
PrimeList[i]=i;
}
//分别从表中去掉已经确定的各素数的倍数(将其置为0)
i=2;
while(i<=sqrt(n))
{
for(j=i+1;j{
if(PrimeList[j]!
=0&&PrimeList[j]%PrimeList[i]==0)
{
PrimeList[j]=0;
}
}
//确定下一个素数的位置
i=i+1;
while(PrimeList[i]==0)
{
i=i+1;
}
}
}
//函数NextPrimeNumber():
求下一个素数
intNextPrimeNumber(intp,int*PrimeList)
{
p=p+1;
while(PrimeList[p]==0)
{
p=p+1;
}
returnPrimeList[p];
}
//主函数:
在从4到M的范围内验证哥德巴赫猜想
intmain()
{
intPrimeList[M];//说明存放素数表的数组
intx,p;//变量x:
偶数,p:
素数
//建立素数表
CreatPrimeList(PrimeList,M);
//对从4到M的所有偶数验证哥德巴赫猜想
x=4;
while(x{
//检查偶数减去一个素数后的剩余部分是否仍为素数
p=PrimeList[2];
while(p<=x/2&&PrimeList[x-p]==0)
{
p=NextPrimeNumber(p,PrimeList);
}
//输出检查结果
if(p>x/2)//找到了一个不能分解为两个素数和的偶数
{
std:
:
std:
:
cout<<"Greatdiscovery:
Goldbachiswrong!
"<:
endl;
}
else//PrimeList[x-p]≠0,分解成功
{
std:
:
std:
:
cout<<"Theevennumber"<<:
endl;
}
//检查下一个偶数
x=x+2;
}
return0;
}
2、根据实验预习阶段的实验设计方案,编写应用程序。
参考代码如下。
#include
#include
#include
#include
constintSHIP=1;
constintBAR=2;
constintWATER=3;
//一个醉酒者行为的模拟仿真
intdrunkard()
{
intx=-10;//记录醉酒者的x坐标,开始时在酒馆门口
inty=0;//记录醉酒者的y坐标,开始时在跳板的中央
intstep=0;//记录醉酒者一共走了多少步
while(abs(x)<=10&&abs(y)<=2)
{
switch(rand()%10)
{
case0:
//向左走
y=y-1;
break;
case1:
//向右走
y=y+1;
break;
case2:
//向后走
x=x-1;
break;
case3:
//向前走
case4:
case5:
case6:
case7:
case8:
case9:
x=x+1;
}
step=step+1;
}
if(x<-10)
{
std:
:
std:
:
cout<<"After"<<<"steps,themanreturnedtothebaranddrunkagain"
<:
endl;
returnBAR;
}
else
{
if(x>10)
{
std:
:
cout<<"After"<<:
endl;
returnSHIP;
}
else
{
std:
:
cout<<"After"<<:
endl;
returnWATER;
}
}
}
//反映若干个醉酒者最终行为的模拟仿真的主函数
intmain()
{
srand(time(0));//初始化随机种子
intdrunkardnumber;//醉酒者总数
intshipnumber=0;//到达船上的人数
intbarnumber=0;//返回酒馆的人数
intwaternumber=0;//掉进水中的人数
std:
:
cout<<"Pleaseinputthenumberofdrunkard"<:
endl;
std:
:
cin>>drunkardnumber;
for(inti=0;i{
switch(drunkard())
{
caseSHIP:
shipnumber=shipnumber+1;
break;
caseBAR:
barnumber=barnumber+1;
break;
caseWATER:
waternumber=waternumber+1;
break;
}
}
std:
:
cout<<"******************************"<:
endl;
std:
:
cout<<"Ofallthe"<"<:
endl;
std:
:
cout<:
endl;
std:
:
cout<:
endl;
std:
:
cout<:
endl;
return0;
}
3、根据实验预习阶段的实验设计方案,编写应用程序。
参考代码如下。
#include
intmain()
{
constintTotal=7;//小孩总数,可以改动。
intChooseNum;//用户随机选取的数
intboy[Total];//表示小孩的数组
for(inti=0;i{
boy[i]=i+1;//给小孩编号
}
std:
:
cout<<"Pleaseinputthenumberwhichistobeeliminated:
";
std:
:
cin>>ChooseNum;//用户随机输入一个剔除的数
std:
:
cout<<"Beforeeliminating,theboysare:
"<:
endl;
for(i=0;i{
std:
:
cout<}
std:
:
cout<:
endl;
intk=1;//第k个离开的小孩
intn=-1;//数组下标,下一个为0表示从第一个孩子开始数数
while(true)
{
//在圈中开始剔除
for(intj=0;j{
n=(n+1)%Total;
if(boy[n]!
=0)//如果该小孩还在圈中,则参加计数
{
j++;
}
}
if(k==Total)//如果已经全部剔除完成,则跳出循环
{
break;
}
boy[n]=0;
std:
:
cout<<"After"<"
<:
endl;
for(i=0;i{
if(boy[i]!
=0)
{
std:
:
cout<}
}
std:
:
cout<:
endl;
k++;
}
//break语句跳转至此,输出胜利者编号
std:
:
cout<<"TheNo."<:
endl;
return0;
}
4、根据实验预习阶段的实验设计方案,编写应用程序。
参考代码如下。
#include
#include
constintM=7;//规定棋盘大小
constintN=5;//玩几子棋
voidInitChess(char*);
voidHumanMove(char*);
voidComputerMove(char*);
voidShowChess(char*);
charWinCheck(char*);
intmain()
{
char*chess=newchar[M*M];if(NULL==chess)
{
return0;
}
chardone;
std:
:
cout<<"---GameofChess---"<:
endl;
std:
:
cout<<"Humanagainstthestupidcomputer"<:
endl;
done='*';
InitChess(chess);
do
{
ShowChess(chess);
HumanMove(chess);
done=WinCheck(chess);//检查是否有赢家
if(done!
='*')
{
break;//如有赢家,则跳出循环
}
ComputerMove(chess);
done=WinCheck(chess);//检查是否有赢家
}while(done=='*');
ShowChess(chess);//显示棋局最终状态
if(done=='H')
{
std:
:
cout<<"Humanwon!
"<:
endl;
}
else
{
std:
:
cout<<"Computerwon!
!
!
!
"<:
endl;
}
delete[]chess;
return0;
}
//初始化棋盘
voidInitChess(char*chess)
{
for(inti=0;i{
for(intj=0;j{
chess[i+M*j]='*';
}
}
}
//下棋人的落子
voidHumanMove(char*chess)
{
intx,y;
std:
:
cout<<"EnterX,Ycoordinatesforyourmove:
";
std:
:
cin>>x>>y;
std:
:
cout<:
endl;
x--;
y--;
if(chess[x+M*y]!
='*')
{
std:
:
cout<<"Invalidmove,tryagain."<:
endl;
HumanMove(chess);
}
else
chess[x+M*y]='H';
}
//计算机落子
voidComputerMove(char*chess)
{
inti,j;
for(i=0;i{
for(j=0;j{
if(chess[i+M*j]=='*')
{
break;
}
}
if(chess[i+M*j]=='*')
{
break;
}
}
if(i*j==M*M)
{
std:
:
cout<<"Diamondcutdiamond"<:
endl;
exit(0);
}
else
{
chess[i+M*j]='C';
}
}
//在屏幕上显示棋局
voidShowChess(char*chess)
{
for(inti=0;i{
for(intj=0;j{
std:
:
cout<}
std:
:
cout<:
endl<:
endl;
}
}
//检查是否有赢家
charWinCheck(char*chess)
{
for(inti=0;i{
for(intj=0;j{
chart=chess[i+M*j];
intcount=1;
for(inta=i+1,b=j+1;
chess[a+M*b]==t&&a{
count++;
}
if(count>=N)
{
returnt;
}
count=1;
for(a=i,b=j+1;chess[a+M*b]==t&&b{
count++;
}
if(