《面向对象程序设计 C++》实验报告.docx
《《面向对象程序设计 C++》实验报告.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计 C++》实验报告.docx(61页珍藏版)》请在冰豆网上搜索。
《面向对象程序设计C++》实验报告
《面向对象程序设计》实验教学大纲
实验学时:
32
实验个数:
13
实验学分:
1
课程性质:
专业必修课
适用专业:
软件工程
教材及参考书:
1.《C++语言程序设计习题与实验指导》,郑莉、傅仕星编著,北京:
清华大学出版社,2004
2.《C++语言程序设计(第三版)》,郑莉、董渊编著,北京:
清华大学出版社,2005
大纲执笔人:
李晓宁
大纲审定人:
刘芳、苟仕蓉、左友东
一、实验课的性质与任务
本课程实验大纲是面向计算机专业学生开设的《C++程序设计》实验课计划指导大纲,是依据《面向对象程序设计》课程教学计划指导大纲编制。
本课程主要讲述了利用C++进行程序设计的思想和方法,既有面向过程和面向对象的程序设计的理论知识,又包括极强的实践应用能力的培养。
本实验大纲力求结合该课程教学计划大纲的相应内容,由浅入深的指导学生了解和掌握如何利用C++程序设计语言进行程序设计,提高学生的动手能力,做到理论和实践相结合,培养学生理解,分析程序,编写,调试程序的能力,使之能把程序设计应用到今后的专业学习中。
二、实验课程目的与要求
1.实验目的:
通过本课程的学习,使学生掌握面向过程的程序设计思想和编程思路,初步掌握面向对象的程序设计思想,学会调试程序,能独立编写实用的小型程序。
2.实验要求:
1)学生应该自始至终贯彻课程中所介绍的程序设计风格,养成良好的编程习惯;
2)应独立完成所布置习题。
为保证尽量在统一安排的上机时间内编译运行通过程序,学生应事先设计好程序。
三、实验项目及内容提要
面向对象程序设计实验课程
序号
实验项目编号
实验名称
学时
必做
选做
学分数
实验类型
内容提要
基本操作
验证
综合
设计
1
一
VisualC++开发环境入门
2
√
√
熟悉VC++开发环境
2
二
C++简单程序设计
4
√
√
基本算法结构
3
三
函数的应用
2
√
√
函数设计、模板函数
4
四
类与对象
6
√
√
类的设计与使用
5
五
C++程序的结构
2
√
√
作用域与生存期,静态成员
6
六
数组、指针与字符串
4
√
√
三种常见编程元素的使用
7
七
继承与派生
6
√
√
派生类的设计与使用
8
八
多态性
2
√
√
运算符重载、动态多态
9
九
群体类和群体数据的组织
4
√
√
群体类的设计
10
十
泛型程序设计与C++标准模板库
2
√
√
STL库的使用
11
十一
流内库与输入、输出
2
√
√
常用输入输出方法
12
十二
异常处理
2
√
√
异常处理机制的设计
13
十三
Windows应用程序框架
2
√
√
VC开发Windows程序方法
四、实验内容安排:
实验一VisualC++6.0开发环境应用入门
(验证性实验2学时)
1.目的要求:
了解VisualC++6.0的特点,熟悉了解VisualC++6.0的开发环境,学习使用VisualC++6.0编写标准的C++控制台应用程序。
2.实验内容:
使用VisualC++来建立一个非图形化的标准C++程序,编译、运行教材中的例3-3,用公式法求解PI的数值,并尝试利用其他方法求解并获得相同的结果。
π=16arctan(1/5)-4arctan(1/239)
arctan(x)=x-x³/3+x5/5-x7/7+…求π=?
#include
usingnamespacestd;
intmain()
{
doublea,b;
doublearctan(doublex);
a=16.0*arctan(1/5.0);
b=4.o*aarctan(1/239.0);
cout<<”PI=”<}
doublearctan(doublex)
{
inti;
doubler,ef,sqr;
sqr=x*x;
r=0;
e=x;
i=1;
while(e/i>1e-15)
{
f=e/I;
r=(i%4==1)?
r+f:
r-f;
e=e*sqr;
I+=2;
}
returnr;
}
#include
#include
main()
{
ints=1;
floatn=1,t=1,pi=0;
while(fabs(t)1e-4)
{
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("%d",pi);
}
1
3.主要仪器设备及软件:
PC+Windows2000+VC6.0
实验二C++简单程序设计实验
(验证性实验4学时)
4.目的要求:
会编写简单的C++程序;复习基本数据类型变量和常量的应用;复习运算符与表达式的应用;复习结构化程序设计基本控制结构的应用;复习自定义数据类型的应用;练习使用简单的输入输出;观察头文件的作用;学会使用VC6.0开发环境中的debug调试功能;熟练程序设计中的技巧;
5.实验内容:
3)给定一个字符变量输出其二进制形式。
例如chara=’a’;其二进制为00100001。
#include
usingnamespacestd;
intmain()
{
charch;
intj,k[8]={0};
cout<<"请输入一个字符:
"<cin>>ch;
for(j=0;j<=7;j++)
{
if(ch)
{
if(ch%2==0)
k[j]=0;
else
k[j]=1;
ch=(ch-(ch%2))/2;
}
}
for(j=7;j>=0;j--)
{
cout<}
cout<}
4)给定一个字符变量输出其二进制反转形式。
例如chara=’a’;其二进制为00100001,反转形式为10000100。
(提示:
使用位运算)
#include
usingnamespacestd;
intmain()
{
charch;
intj,k[8]={0};
cout<<"请输入一个字符:
"<cin>>ch;
for(j=0;j<=7;j++)
{
if(ch)
{
if(ch%2==0)
k[j]=0;
else
k[j]=1;
ch=(ch-(ch%2))/2;
}
}
cout<";
for(j=7;j>=0;j--)
{
cout<}
cout<for(j=0;j<=7;j++)
{
k[j]=k[j]^1;
}
cout<<"二进制反码是:
";
for(j=7;j>=0;j--)
{
cout<}
cout<}
5)袋子里有红,黄,蓝,绿,黑五种不同颜色的球若干个,从中取出三个不同颜色的球,编程输出每种取法及统计不同取法的总数(提示:
使用枚举)
#include
enumcolor{red=0,yellow,blue,green,black};
boolisNum(inti)
{
intj=0;
for(intk=0;k<6;k++)if(i>>k&1==1)j++;
returnj==3?
true:
false;
}
voidprintResult(inti)
{
for(intk=0;k<5;k++)
{
if(i>>k&1==1)
switch(k)
{
casered:
printf("red");
break;
caseyellow:
printf("yellow");
break;
caseblue:
printf("blue");
break;
casegreen:
printf("green");
break;
caseblack:
printf("black");
break;
default:
printf("error!
!
");
break;
}
}
printf("\n");
}
voidmain()
{
intj=0;
printf("可能的方案有:
\n");
for(inti=0;i<=32;i++)
{
if(isNum(i))
{
printResult(i);
j++;
}
}
6)(选做)给定一个整型变量输出其二进制形式。
6.主要仪器设备及软件:
PC+Windows2000+VC6.0
实验三函数的应用实验
(设计性实验2学时)
7.目的要求:
掌握函数的定义和调用方法;练习重载函数的使用;练习使用系统函数;学习使用VC++的debug调试功能,使用stepinto追踪到函数内部。
8.实验内容:
7)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。
#include
usingnamespacestd;
intFibonacci(inti)
{
if(i==1)
return0;
else
{
if(i==2)
return1;
else
returnFibonacci(i-1)+Fibonacci(i-2);
}
}
intmain()
{
intn,j,i;
cin>>n;
for(i=1;i<=n;i++)
{
j=Fibonacci(i);
cout<}
}
8)编写重载函数Max1可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。
#include
usingnamespacestd;
intMAX1(inta,intb)
{
if(a>=b)
returna;
else
returnb;
}
intMAX1(inta,intb,intc)
{
if(a>=b)
{
if(a<=c)
returnc;
else
returna;
}
else
{
if(b<=c)
returnc;
else
returnb;
}
}
doubleMAX1(doublea,doubleb)
{
if(a>=b)
returna;
else
returnb;
}
doubleMAX1(doublea,doubleb,doublec)
{
if(a>=b)
{
if(a<=c)
returnc;
else
returna;
}
else
{
if(b<=c)
returnc;
else
returnb;
}
}
intmain()
{
inta,b,c;
doublei,j,k;
cout<<"请输入两个整数"<cin>>a>>b;
cout<<"最大的数"<cout<<"请输入三个整数"<cin>>a>>b>>c;
cout<<"最大的数是"<cout<<"请输入两个小数"<cin>>i>>j;
cout<<"最大的数是"<cout<<"请输入三个小数"<cin>>i>>j>>k;
cout<<"最大的数是"<
}
9)写一个函数,能够接收身高、体重等数据,能够根据身高、体重检测身体状况,胖,瘦等。
#include
usingnamespacestd;
voidSHENGC(doublei,doublej)
{
if(icout<<"这个人偏胖"<else
{if(i=j*32)
cout<<"这个人适中"<else
cout<<"这个人偏瘦"<}
}
intmain()
{
doublei,j;
cout<<"请输入身高(cm)和体重(kg)"<cin>>i>>j;
SHENGC(i,j);
}
9.主要仪器设备及软件:
PC+Windows2000+VC6.0
实验四类与对象实验
(设计性实验4学时)
10.目的要求:
掌握类的定义和使用;掌握类对象的声明;复习具有不同访问属性的成员的访问方式;观察构造函数和析构函数的执行过程;学习类组合使用方法;使用VC++的debug调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。
11.实验内容:
10)定义一个CPU类,包含等级(Rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。
其中,rank为枚举类型CPU__Rank,定义为enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。
观察构造函数和析构函数的调用顺序。
#include
usingnamespacestd;
enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};
classCPU
{
public:
CPU();
~CPU();
voidrun(enumCPU_Rankr,intf,doublev);
voidstop();
private:
enumCPU_RankRank;
intfrequency;
doublevoltage;
};
CPU:
:
CPU()
{
cout<<"调用构造函数"<}
CPU:
:
~CPU()
{
cout<<"调研析构函数"<}
voidCPU:
:
run(enumCPU_Rankr,intf,doublev)
{
Rank=r;
frequency=f;
voltage=v;
}
voidCPU:
:
stop()
{
cout<cout<cout<}
intmain()
{
enumCPU_Rankt=P1;
CPUc;
c.run(t,2,4.865);
c.stop();
}
11)定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。
cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类,观察这些类的构造函数和析构函数的调用顺序。
#include
usingnamespacestd;
classCPU
{
public:
CPU()
{
cout<<"CPU构造函数被调用"<}
~CPU()
{
cout<<"CPU析构函数被调用"<}
};
classRAM
{
public:
RAM()
{
cout<<"RAM构造函数被调用”<}
~RAM()
{
cout<<"RAM析构函数被调用"<}
};
classCDROM
{
public:
CDROM()
{
cout<<"CDROM构造函数被调用"<}
~CDROM()
{
cout<<"CDROM析构函数被调用"<}
};
classComputer
{
private:
CPUcpu;
RAMram;
CDROMcdrom;
public:
Computer()
{
cout<<"Computer构造函数被调用"<}
~Computer()
{
cout<<"Computer析构函数被调用"<}
voidrun();
voidstop();
};
intmain()
{
ComputerC;
}
12)定义一个Body类,拥有身高、体重等数据,能够根据身高、体重检测身体状况,要求设计相应的函数成员和构造函数。
#include
usingnamespacestd;
classbody
{
public:
body()
{
cout<<"构造函数被调用"<}
~body()
{
cout<<"析构函数被调用"<}
voidset(doubleh,doublew)
{
HIGH=h;
WEIGHT=w;
}
voidshow()
{
cout<<"HIGH="<cout<<"WEIGHT="<}
private:
doubleHIGH;
doubleWEIGHT;
};
intmain()
{
doublei,j;
bodya;
cout<<"请输入身高(cm)和体重(kg)"<cin>>i>>j;
a.set(i,j);
a.show();
}
13)(选做)设计一个用于人事管理的People(人员)类。
考虑到通用性,这里只抽象出所有类型人员都具有的属性:
number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。
其中“出生日期”定义一个“日期”类内嵌子对象。
用成员函数实现对人员信息录入和显示。
要求包括:
构造函数和析构函数、拷贝构造函数、内联成员函数、类组合。
12.主要仪器设备及软件:
PC+Windows2000+VC6.0
实验五C++程序的结构实验
(设计性实验2学时)
13.目的要求:
观察程序运行中变量的作用域、生存期和可见性;学习类的静态成员的使用;学习多文件结构在C++程序中的使用。
14.实验内容:
14)运行下面的程序,观察变量X、Y的值。
(删除)
//lab5_1.cpp
#include
voidfnl();
intx=1,y=2;
intmain()
{
cout<<”Begin…”<cout<<”x=”<cout<<”y=”<cout<<”Evaluatexandyinmain()…”<intx=10,y=20;
cout<<”x=”<cout<<”y=”<cout<<”Stepintofnl()…”<fnl();
cout<<”Backinmain”<cout<<”x=”<cout<<”y=”<return0;
}
voidfnl()
{
inty=200;
cout<<”x=”<cout<<”y=”<}
15)实现客户机(CLIENT)类。
定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。
在头文件client.h中定义类,在文件client.cpp中实现,在文件test.cpp中测试这个类,观察相应的成员变量取值的变化情况。
(需要给出main函数代码和运行结果)
//cilent.h
#include
usingnamespacestd;
classClient
{
private:
staticcharSeverName[10];
staticintClientnum;
public:
Client()
{
cout<<"Client构造函数被调用"<Clientnum++;
}
~Client()
{
cout<<"Client析构函数被调用"<Clientnum--;
}
staticvoidChangeServername()
{
inti;
cout<<"请输入服务器的名字:
"<cin>>SeverName;
}
voidshow();
};
intClient:
:
Clientnum=0;
charClient:
:
SeverName[10]="abcd";
//Client.cpp
voidClient:
:
show()
{
cout<<"该用户机的服务器端名字是:
"<cout<cout<<"用户数量有:
"<cout<}
//Client.exe
voidmain()
{
Client:
:
ChangeServername();
Client