面向对象程序设计实验指导书版Word文档下载推荐.docx
《面向对象程序设计实验指导书版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验指导书版Word文档下载推荐.docx(83页珍藏版)》请在冰豆网上搜索。
四、主要仪器设备
装有C++集成开发环境的微型计算机。
。
五、实验项目及教学安排
序号
实验项目名称
实验基本方法和内容
项目学时
项目
类型
每组
人数
教学要求
1
C++对C的扩充
使用集成开发环境开发简单C++程序;
通过编写求斐波那契数列的第n项和前n项之和等简单程序,学习C++中的各种程序控制结构;
通过解决Josephus问题,学习C++中各种运算符的功能、优先级和结合性;
编写一个复杂的程序来学习自定义头文件的方法,学会调试多文件程序;
分析五子棋游戏程序,学习指针的基本用法;
编写简单程序学习动态内存的分配和释放,理解内存泄漏的危害。
2
基础
必修
类和对象
分析完整的Person类的定义,学习类和对象的概念、定义和使用方法;
实现一个带有头结点的单链表,学习用类和对象解决实际问题。
4
继承和组合
分析完整的Person类和Employee类的定义,学习继承和派生概念;
利用继承和组合的概念实现一个计算图形面积的类库。
多态、友元、虚函数、模板
利用抽象类设计一个计算图形面积的类库,学习动态联编的概念;
分析Complex类的实现,理解重载运算符的意义;
实现分数类,学习重载运算符方法,理解C++中的异常处理机制;
用类模板实现一个带有头结点的单链表。
5
课程设计
学习Windows程序的消息处理机制和编程模式,分析设计自动取款机模拟系统,学习面向对象编程方法的思想,练习用面向对象编程方法解决实际问题。
综合
选修
六、考核方式及成绩评定
根据学生实验出勤情况、实验态度、实验报告成绩、实验考核成绩等评定实验成绩。
实验报告(含实验理论)占实验成绩的30%,实验技能(含实验态度)占实验成绩的30%,实验考核占实验成绩的40%。
最终实验成绩占该课程考核总成绩的20%—30%。
七、实验教科书、参考书
1.实验教科书
自编实验指导书。
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<
iostream>
cmath>
constintM=10001;
//定义验证范围
//函数CreatPrimeList():
生成素数表
voidCreatPrimeList(int*PrimeList,intn)
{
inti,j;
//将PrimeList的各元素设置为从0开始的正整数
for(i=0;
i<
n;
i=i+1)
{
PrimeList[i]=i;
}
//分别从表中去掉已经确定的各素数的倍数(将其置为0)
i=2;
while(i<
=sqrt(n))
for(j=i+1;
j<
j=j+1)
{
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<
M)
//检查偶数减去一个素数后的剩余部分是否仍为素数
p=PrimeList[2];
while(p<
=x/2&
PrimeList[x-p]==0)
p=NextPrimeNumber(p,PrimeList);
//输出检查结果
if(p>
x/2)//找到了一个不能分解为两个素数和的偶数
std:
:
std:
cout<
<
"
Greatdiscovery:
Goldbachiswrong!
"
<
std:
endl;
else//PrimeList[x-p]≠0,分解成功
Theevennumber"
x<
="
p<
+"
x-p
<
//检查下一个偶数
x=x+2;
return0;
2、根据实验预习阶段的实验设计方案,编写应用程序。
ctime>
cstdlib>
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;
case2:
//向后走
x=x-1;
case3:
//向前走
case4:
case5:
case6:
case7:
case8:
case9:
x=x+1;
step=step+1;
if(x<
-10)
std:
After"
step
<
steps,themanreturnedtothebaranddrunkagain"
returnBAR;
else
if(x>
10)
step<
steps,themanreturnedtotheship"
returnSHIP;
else
steps,themandroppedintothewater"
returnWATER;
//反映若干个醉酒者最终行为的模拟仿真的主函数
srand(time(0));
//初始化随机种子
intdrunkardnumber;
//醉酒者总数
intshipnumber=0;
//到达船上的人数
intbarnumber=0;
//返回酒馆的人数
intwaternumber=0;
//掉进水中的人数
Pleaseinputthenumberofdrunkard"
cin>
>
drunkardnumber;
for(inti=0;
switch(drunkard())
caseSHIP:
shipnumber=shipnumber+1;
caseBAR:
barnumber=barnumber+1;
caseWATER:
waternumber=waternumber+1;
******************************"
Ofallthe"
drunkardnumber<
drunkards:
shipnumber<
returnedtotheship"
barnumber<
wenttothebaranddrunkagain"
waternumber<
droppedintothewater"
3、根据实验预习阶段的实验设计方案,编写应用程序。
constintTotal=7;
//小孩总数,可以改动。
intChooseNum;
//用户随机选取的数
intboy[Total];
//表示小孩的数组
Total;
i++)
boy[i]=i+1;
//给小孩编号
Pleaseinputthenumberwhichistobeeliminated:
;
ChooseNum;
//用户随机输入一个剔除的数
Beforeeliminating,theboysare:
boy[i]<
\t"
intk=1;
//第k个离开的小孩
intn=-1;
//数组下标,下一个为0表示从第一个孩子开始数数
while(true)
//在圈中开始剔除
for(intj=0;
)
n=(n+1)%Total;
if(boy[n]!
=0)//如果该小孩还在圈中,则参加计数
j++;
if(k==Total)//如果已经全部剔除完成,则跳出循环
boy[n]=0;
k<
timeselimination,theboysleftare:
for(i=0;
if(boy[i]!
=0)
std:
k++;
//break语句跳转至此,输出胜利者编号
TheNo."
boy[n]<
boyisthewinner."
4、根据实验预习阶段的实验设计方案,编写应用程序。
constintM=7;
//规定棋盘大小
constintN=5;
//玩几子棋
voidInitChess(char*);
voidHumanMove(char*);
voidComputerMove(char*);
voidShowChess(char*);
charWinCheck(char*);
char*chess=newchar[M*M];
if(NULL==chess)
return0;
chardone;
cout<
---GameofChess---"
Humanagainstthestupidcomputer"
done='
*'
InitChess(chess);
do
ShowChess(chess);
HumanMove(chess);
done=WinCheck(chess);
//检查是否有赢家
if(done!
='
break;
//如有赢家,则跳出循环
ComputerMove(chess);
done=WinCheck(chess);
}while(done=='
);
//显示棋局最终状态
if(done=='
H'
Humanwon!
Computerwon!
!
delete[]chess;
//初始化棋盘
voidInitChess(char*chess)
M;
j++)
chess[i+M*j]='
//下棋人的落子
voidHumanMove(char*chess)
intx,y;
EnterX,Ycoordinatesforyourmove:
x>
y;
x--;
y--;
if(chess[x+M*y]!
Invalidmove,tryagain."
chess[x+M*y]='
//计算机落子
voidComputerMove(char*chess)
for(j=0;
if(chess[i+M*j]=='
if(chess[i+M*j]=='
if(i*j==M*M)
Diamondcutdiamond"
exit(0);
chess[i+M*j]='
C'
//在屏幕上显示棋局
voidShowChess(char*chess)
chess[i+M*j]<
endl<
//检查是否有赢家
charWinCheck(char*chess)
chart=chess[i+M*j];
intcount=1;
for(inta=i+1,b=j+1;
chess[a+M*b]==t&
a<
M&
b<
a++,b++)
{
count++;
if(count>
=N)
returnt;
count=1;
for(a=i,b=j+1;
chess[a+M*b]==t&
b++)
if(