总任务.docx
《总任务.docx》由会员分享,可在线阅读,更多相关《总任务.docx(33页珍藏版)》请在冰豆网上搜索。
总任务
面向对象程序设计实验说明
1.时间安排:
共72学时,18次课(4课时计1次)。
2.评分:
6次阶段考试,各占总分的10%,平时成绩占40%。
平时成绩由5次实验报告和现场提交的代码组成,五次实验报告占20分,提交的代码共计20分。
3.阶段考试:
共计6次,老师随机选择一道进行考试。
4.实验要求:
每次实验内容要求在课内时间段进行提交,超时拒绝接受。
代码相同者均计0分。
5.实验报告:
共5次实验报告,提供报告模版,由学生添加关键代码。
实验报告需要进行评分。
6.实验时间安排如下:
周
学时
内容
实验报告
备注
1
4
VisualC++环境
2
4
数组
3
4
指针和字符串
实验报告一
需要提交实验报告
4
4
阶段测试一
5
8
第11章类与数据抽象
6
7
4
第12章类
实验报告二
需要提交实验报告
8
4
阶段测试二
9
4
第13章运算符重载
10
4
第14章继承
实验报告三
需要提交实验报告
11
4
阶段测试三
12
4
第15章虚函数与多态性
13
4
阶段测试四
14
4
第16章C++流输入与流输出
15
4
第17章模版
实验报告四
需要提交实验报告
16
4
阶段测试五
17
4
第18章异常处理
实验报告五
需要提交实验报告
18
4
阶段测试六
第19章可视化编程
可选
合计
72
6次阶段测试
5次实验报告
实验1VisualC++开发环境
一、实验目的
1.熟悉VC++6.0编程环境,编制简单的C++程序并运行,熟悉C++的编辑、编译、连接和运行过程。
2.掌握C++数据类型,熟悉如何定义和使用常量和变量,以及对它们赋值的方法。
3.目的是为了使学生对《程序设计基础》课程内容进行复习,为面向对象程序设计进行编程能力的训练。
二、实验要求
1.熟悉VC++6.0编程环境,编制简单C++程序并运行,熟悉C++的编辑、编译、连接和运行过程。
2.掌握循环结构和选择结构
3.掌握函数的定义及调用
4.掌握递归函数的定义及调用及特点
三、实验内容
1.使用VisualC++建立一个非图形化标准C++程序,编译、运行以下程序:
#include
voidmain()
{
cout<<"Hello!
\n";
cout<<"Welcometoc++!
\n";
}
具体实验步骤:
(1)启动VisualC++6.0开发环境
从“开始”菜单中选择“程序”|MicrosoftVisualStudio6.0|Microsoft
VisualC++6.0,显示VisualC++6.0开发环境主窗口。
(2)创建一个项目
单击File菜单中的New选项显示New(新建)对话框(如图1-1所示)。
图1-1新建窗口
单击Projects标签,在Projects(项目)选项卡中,选择Win32Console
Application(Win32控制台应用程序)。
在Location(位置)文本框中指定一个
路径d:
\c++lab,在PrejectName(项目名称)文本框中为项目输入一个名字
“test”,单击OK(确定)按钮。
在弹出的Win32ConsoleApplication-Step1of1对话框中选择AnEmpty
Project单选项,然后单击Finish(完成)按钮(如图1-2所示)。
最后在NewProjectInformation对话框中单击OK按钮,完成项目的建立。
图1-2创建控制台应用程序第一步
(3)建立C++源程序文件
选择菜单命令Project|AddtoProject|New,弹出New对话框。
如图1-3
所示,在new对话框的Files选项卡中选择C++SourceFile,并填入文件名称
“test”,单击OK按钮,完成新建C++源程序文件。
图1-3添加新的源程序文件
(4)编辑C++源程序文件内容
图1-4在文件编辑窗口中输入代码
在文件编辑窗口中输入代码(如图1-4所示)。
选择菜单命令File|Save保存这个文件。
(5)建立并运行可执行程序
选择菜单命令Build->Buildtest.exe建立可执行程序。
如果你正确输入了源程序,此时便成功地生成了可执行程序test.exe。
如果程序有语法错误,则屏幕下方的状态窗口中会显示错误信息。
根据这些错误信息对源程序进行修改后,重新选择菜单命令Build|Buildtest.exe,建立可执行程序。
选择菜单命令Build|Executetest.exe运行程序,观察屏幕的显示内容。
(6)关闭工作空间
选择菜单命令File|CloseWorkspace关闭工作空间。
2.编写一个函数intsum(intn),计算从1+2+3+……+n的和并返回,并在主函数中调用。
3.编写一个函数intisprime(intn),判断n是否是素数,如果是则函数返回1,否则函数返回0,并在主函数调用该函数以检查该函数是否能正常工作。
4.调用isprime()输出1000以内的所有素数,每五个一行。
5.从键盘输入一个整数n,把n分解成两个素数l和m,并输出n=l+m的等式。
6.编写非递归函数intFibonacci(intn),返回斐波那契数列的第n项,已知斐波那契数列为:
1,1,2,3,5,8,13……
7.编写递归函数intFibonacci_digui(intn),返回斐波那契数列的第n项。
8.在主函数中设计对Fibonacci和Fibonacci_digui的调用方案,以判断两个函数在效率上的区别
四、实验步骤
五、实验代码
六、心得体会
1.代码
2.实验报告:
按照实验报告要求完成完整的实验报告。
实验2数组
一、实验目的
1.熟悉基本数据类型,及表示形式和取值范围;
2.掌握一维数组和二维数组的定义、赋值和输入输出方法;
3.掌握字符数组和字符串数组的使用;
4.掌握与数组有关的算法(特别是排序算法)。
5.对《程序设计基础》课程内容进行复习,为面向对象程序设计进行编程能力的训练。
二、实验要求
1.熟悉VC++6.0编程环境,编制简单C++程序并运行,熟悉C++的编辑、编译、连接和运行过程。
2.掌握数组作为函数参数的编程方法
3.掌握如何利用循环操作数组
三、实验内容
1.定义一个大小为10的整形数组,数组的元素值由初始化得到,分别计算求出该数组的和,最小值以及最大值并输出。
2.修改以上程序,要求首先由键盘输入数组元素数目n(n<10),然后输入这n个数组元素,其它要求不变。
3.修改以上程序,要求,均分别编写相应的函数来实现求和、求最大值以及最小值等四个功能,并在主函数中进行调用。
4.编写一个排序函数voidsort(inta[],intn),将数组a中的n个元素按照从小到大的顺序进行排序,主函数中要求输出排序前后的数组内容。
5.编写一个函数voidreverse(inta[],intn),将数组a中的n个元素进行逆置,主函数中要求输出逆置前后的数组内容。
6.编写函数voidarray_sum(inta[3][3],b[3][3]),功能是:
实现B=A+A’,即把矩阵A加上A的转置存放在B中,主函数调用该数组,要求,二维数组的元素值由初始化得到,并输出分别输出二维数组a和b的值。
例如:
矩阵a:
其转置矩阵为a’:
矩阵b为:
1231472610
45625861014
789369101418
7.编写一个函数voidstrcat(chara[],charb[]),将字符串b连接到字符串a的后面,主函数调用该函数,分别输出调用该函数前后字符串a和b的内容,要求主函数中的字符串a的值由初始化得到,b的值由键盘输入,且b中的第一个字符是空格。
8.编写一个函数voidstring_sort(charname[][18],intn),对字符串数组name中的n个字符串按照字典顺序进行排序,主函数调用该函数,字符串数组的值可由初始化得到,要求输出排序前后的字符串数组。
四、实验步骤
五、实验代码
六、心得体会
1.代码
2.实验报告:
按照实验报告要求完成完整的实验报告。
实验3指针和字符串
一、实验目的
1.进一步熟悉编程环境。
2.掌握指针的基本使用方法。
3.掌握指针作为函数参数的使用方法。
4.掌握字符指针的使用方法。
二、实验要求
1.熟悉VC++6.0编程环境,编制简单C++程序并运行,熟悉C++的编辑、编译、连接和运行过程。
2.熟悉指针作为函数参数的编程方法。
3.熟悉使用指针操作数组。
三、实验内容
1.定义两个整型数x和y,定义整型指针*p1和*p2分别指向x和y,使用指针交换x和y的值。
2.建立数组
建立一个含10个整数的数组。
3.输入数组的元素
编写一个函数voidinput(int*a,intn),在主函数中调用该函数输入数组的元素。
4.输出数组元素
编写一个函数voidoutput(int*a,intn),在主函数中调用该函数输出数组的元素。
5.数组排序
编写一个函数voidsort(int*a,intn),在主函数中调用该函数对该数组排序。
6.生成字符串
在主函数中定义一个字符指针*ptr,并用字符串常量给它赋值。
7.判断回文
编写一个函数boolisPalindrome(char*s),判断参数是否是回文,如果是返回1,否则返回0。
在主函数中调用它,判断ptr是否是回文。
8.构造回文
编写一个函数char*palindrome(char*s),根据参数给出的字符串构造一个回文。
在主函数中将ptr作为参数调用它生成回文。
9.查找字符串
编写一个函数intfind(char*s,char*t),该函数在字符串s中查找字符串t,如果找到,则返回字符串t在字符串s中的位置(整数值);否则返回-1。
在主函数中调用它:
find(ptr,“the”)。
四、提交的资料
本次实验提交的实验报告中,要求提供源程序清单以及实验结果的截屏。
实验4类的定义
一、实验目的
1.掌握类的定义
2.了解如何根据描述发现类及其成员,具备初步的面向对象分析与设计能力
二、实验概述
现在有一个奥特曼打怪兽的角色扮演游戏。
请你根据下面的描述,定义两个类:
奥特曼类和怪兽类。
在奥特曼的世界,打怪兽就是全部。
现在人人都有机会成为奥特曼,加入到与怪兽无止境的战斗中。
可惜,并非人人生来就是英雄,革命尚未成功,同志仍需努力啊。
每一个奥特曼都要从零开始,辛勤劳动,打怪升级,最终才能成为举世瞩目的大英雄。
奥特曼的等级(rank)从第一级开始,随着它打怪兽经验(exp)的增加,等级将不断攀升。
随着等级的升高,奥特曼的生命值(hp)上限和攻击力(damage)也将大大增强。
在与怪兽的战斗中,奥特曼收获的不仅仅是经验。
有时,运气好的话,还能从怪兽身上弄到点小钱(money)。
不要小看这些钱,关键时刻,它能给奥特曼买药补血呀。
奥特曼没有金刚不坏之身,在与怪兽的战斗中,奥特曼会受到伤害。
一旦奥特曼的生命值降到0,它英雄的一生就结束了。
好了,了解了奥特曼的基本情况,现在可以开始战斗了。
首先,我们需要一位全新的奥特曼,我们给它赋予一定的初始实力(initial)。
让它投入战斗吧!
在与怪兽的战斗中要讲究策略。
所谓知己知彼,百战不殆,一旦碰到怪兽,我们首先要查看自己和对方的实力(display),包括双方的等级、生命值、攻击力、经验和所拥有的钱财。
所谓打得赢就打,打不赢就跑。
如果对手太强大,逃跑吧(escape)!
偶尔逃跑无伤颜面,但会耗费一点生命值。
如果总是逃跑,生命被虚耗,那英雄就当不成了。
所以该出手时就出手,勇敢地战斗(attack)吧!
每一回合的战斗中,怪兽会受到攻击(attacked),怪兽也会反击(fightback),让奥特曼受到攻击(attacked)。
每一回合结束,只要奥特曼还活着(isalive),而且怪兽也还活着,战斗就要继续。
如果奥特曼的生命值太低,也许抵挡不了下一轮的进攻,那么别财迷了,掏钱出来给它补血(restore)吧。
当然,如果形势确实不妙,奥特曼也可以中途逃跑。
但如果获得了最终的胜利(win),不仅能赢得战斗经验,夺取怪兽身上的钱财,足够多的经验也许能让奥特曼升级(upgrade)。
三、实验内容
根据以上描述,利用C++语言,定义奥特曼(Ultraman)和怪兽(Monster)两个类。
四、提交材料
1.代码:
两个类的定义代码(成员函数暂时无需给出具体实现)及注释
2.实验报告:
按照实验报告要求完成完整的实验报告。
五、评分标准
1.类定义正确:
10%
2.类属性的正确和完整定义:
20%
3.类方法的正确和完整定义:
20%
4.实验报告各部分完整,无错漏,填写详细,有分析有说明:
50%
实验5:
类的实现
一、实验目的
1.掌握类的实现
2.理解类界面和类实现的分离
二、实验概述
在上一个实验的基础,采用类界面和类实现分离的方式,根据以下描述,改进并实现游戏中的两个类:
奥特曼类和怪兽类。
奥特曼类的方法说明:
1.为每个属性设置get方法。
2.初始化方法将一次性初始化各个属性的取值。
(等级从1开始,生命值为10,攻击力为1,经验值为0,拥有的钱数为0)
3.逃跑将损失1点生命值。
4.攻击将使对方受到自身攻击力大小的伤害,但对方也会采取反击,导致自己受到攻击。
同时,如果对方所剩下的钱数为奇数,可抢夺对方一个钱财。
另外,每攻击一次,可增加一点经验值。
5.受到攻击时,将受到攻击方攻击力值二分之一大小的伤害(即损失相应的生命值)。
即:
受到伤害点数=攻击方攻击力值/2。
6.如果赢得了战斗,将获得攻击方所有经验值。
如果对方身上还有钱财,将全部抢得。
7.如果体力不支,可以用钱恢复一些生命值。
每10个钱可恢复1点生命值。
只要有足够的钱,可以一直恢复,直到达到生命值上限(等级值的10倍)。
8.如果达到升级条件,可以升级。
每次升级需要有等级值的10倍的经验值。
每次升级所使用的经验值都将被扣除,不可重复用于下次升级。
升级将提高生命值上限至新等级值的10倍,生命值将恢复为满血状态,并提升战斗力为新等级值。
怪兽类的方法说明:
1.为每个属性设置get方法。
2.怪兽的初始属性值将随机生成(注意在程序开头包括此处用到两个库:
和)。
该方法已实现如下:
voidsetX(){
srand(time(NULL));
rank=rand()%10+1;
hp=(rand()%rank+1)*5;
exp=rand()%rank+1;
damage=rand()%rank+1;
money=rand()%rank+1;
}
3.受到攻击时,将受到攻击方攻击力值大小的伤害(即损失相应的生命值)。
即:
受到伤害点数=攻击方攻击力值。
同时,如果所剩下的钱数为奇数,会被攻击方抢走一个钱财。
4.受到攻击可以反击,将使对方受到自身攻击力二分之一大小的伤害。
三、实验内容
根据以上描述,利用C++语言,采用类界面和类实现分离的方式,首先改进上一实验所设计的奥特曼类和怪兽类。
然后实现两个类的方法。
四、提交材料
1.代码:
两个类的代码及注释
2.实验报告:
按照实验报告要求完成完整的实验报告。
五、评分标准
1.类定义正确:
20%
2.类实现正确:
30%
3.实验报告各部分完整,无错漏,填写详细,有分析有说明:
50%
实验6:
对象的生成与使用
一、实验目的
1.掌握对象的生成和初始化
2.掌握构造函数、拷贝构造函数和析构函数的定义和实现
3.掌握类成员函数调用的方法
4.阅读并理解程序代码
5.编程工具的使用
二、实验内容
1.在已有奥特曼和怪兽类的定义与实现的基础上,对其进行修改,为他们各自添加构造函数、拷贝构造函数和析构函数,实现对象的初始化和析构行为。
2.完成游戏框架,从而形成一个完整的游戏。
请你在以往实验的基础上,阅读main.cpp程序,在画横线的地方加入一句或几句对象生成或类成员函数调用的代码,使得main.cpp程序能够正确运行起来。
#include
#include
usingnamespacestd;
#include"Ultraman.h"
intmain(){
cout<<"欢迎来到奥特曼的世界!
在奥特曼的世界,打怪兽就是全部!
"<cout<<"现在人人都有机会成为奥特曼,加入到与怪兽无止境的战斗中。
"<cout<<"可惜,并非人人生来就是英雄,革命尚未成功,同志仍需努力啊。
"<cout<<"每一个奥特曼都要从零开始,辛勤劳动,打怪升级,最终才能成为举世瞩目的大英雄。
"<charch1='',ch2='',ch3='';
(1)\\生成奥特曼对象并初始化
while(ch1!
='Y'&&ch1!
='y'&&ch1!
='N'&&ch1!
='n'){
cout<<"输入Y,打怪升级!
"<cout<<"输入N,退出游戏!
"<cin>>ch1;
cout<}
if(ch1=='N'||ch1=='n')
{
cout<<"游戏结束!
"<exit(0);
}
(2)\\生成怪兽对象并对其属性进行初始化
while(ch1=='y'||ch1=='Y'){
ch1='';
ch2='';
ch3='';
while(ch2!
='u'&&ch2!
='U'&&ch2!
='m'&&ch2!
='M'&&ch2!
='f'&&ch2!
='F'&&ch2!
='e'&&ch2!
='E'){
cout<<"请选择:
"<cout<<"u:
查看自身状态;";
cout<<"m:
查看对手状态;";
cout<<"f:
打怪兽;";
cout<<"e:
逃跑(将损失一定的生命值)。
"<cin>>ch2;
cout<if(ch2=='u'||ch2=='U'){
(3)\\成员函数调用
ch2='';
}
elseif(ch2=='m'||ch2=='M'){
(4)\\成员函数调用
ch2='';
}
elseif(ch2=='e'||ch2=='E'){
(5)\\成员函数调用
if((6)){\\成员函数调用,注意调用形式
cout<<"您英雄的一生结束了!
"<exit(0);
}
}
elseif(ch2=='f'||ch2=='F'){
(7)\\成员函数调用,怪兽和奥特曼均受到攻击
if((8)){\\成员函数调用,注意调用形式
cout<<"您英雄的一生结束了!
"<exit(0);
}
if((9)){\\成员函数调用,注意调用形式
cout<<"可...恶...,我还会再来的......"<cout<<"恭喜你,打败了怪兽!
"<(10)\\奥特曼获胜,成员函数调用
}
elsech2='';
}
}
(11)\\奥特曼升级,成员函数调用
while(ch3!
='u'&&ch3!
='U'&&ch3!
='y'&&ch3!
='Y'&&ch3!
='n'&&ch3!
='N'){
cout<<"是否用钱补血?
查看自身状态请输入U,补血请输入Y,否则请输入N。
"<cin>>ch3;
cout<if(ch3=='u'||ch3=='U'){
(12)\\成员函数调用
ch3='';
}
if(ch3=='y'||ch3=='Y'){
if((13)<10)cout<<"对不起,您钱不够,无法补血!
"<else(14)\\成员函数调用;
break;
}
if(ch3=='n'||ch3=='N')break;
}
while(ch1!
='y'&&ch1!
='Y'&&ch1!
='n'&&ch1!
='N'){
cout<<"继续打怪升级请输入Y,退出游戏请输入N。
"<cin>>ch1;
cout<}
if(ch1=='N'||ch1=='n'){
cout<<"游戏结束!
"<exit(0);
}
}
}
3.(选做)利用MFC控件设计一个图形化游戏框架,从而形成一个完整的游戏。
三、提交材料
1.代码:
两个类的添加构造和析构函数,主程序框架代码完整,无错误。
2.可执行程序:
利用编程工具,生成可执行程序。
3.实验报告:
按照实验报告要求完成完整的实验报告。
四、评分标准
1.构造和析构函数正确:
20%
2.主程序代码完整正确:
20%
3.程序可以正确执行:
20%
4.实验报告各部分完整,无错漏,填写详细,有分析有说明:
40%
5.完成图形化游戏框架:
+20%
实验7运算符重载
一、实验目的
1.掌握运算符重载的定义和使用
2.理解成员访问运算符和非成员运算符、前缀式运算符和后缀式运算符。
二、实验内容
每个奥特曼和怪兽都有自己的生命值、攻击力、经验和钱财。
在游戏场景中,还会随机产生各种魔法袋,奥特曼可以捡起这些魔法袋,对自己施加不同的魔法。
魔法袋的种类和功能描述如下:
1.“好事成双”魔法袋:
使自己的生命值、攻击力、经验和钱财翻倍。
2.“祸不单行”魔法袋:
使自己的生命值、攻击力、经验和钱财缩减为原来的一半。
3.“吸星大法”魔法袋:
随机选择游戏中比等级、生命值、攻击力、经验和钱财均比自己低的某个奥特曼,将其生命值、攻击力、经验和钱财吸收一半。
4.“有缘相会”魔法袋:
若