}
三、实验总结
程序编写不难,但中间小错误不容易发现,需要仔细认真,并且注意题目要求,不会的多于同学,老师沟通。
实验二
一、实验目的
1.学会函数的定义格式和说明方法,掌握返回值的用法以及调用方法,区别传递变量值与传递变量地址、传递变量引用三种调用方式的不同;
2.练习函数模板的使用;
3.练习使用系统函数;
4.学习标准C++库的使用;
5.学习字符串数据的组织和处理
二、具体实验任务
任务1:
调试教材程序
1.上机调试教材中例4.3、4.4和4.5程序,注意三个程序之间在函数调用方式上的区别。
回答下列问题:
(1)传值调用时,形参和实参有何要求?
形参可以改变,实参不变。
(2)传址调用时,形参和实参有何要求?
通过改变形参来改变实参。
(3)引用调用与传值调用比较有什么不同?
引用可以直接对实参进行操作,而且不用返回值,效率高。
传值调用有返回值时只能返回一个值,有些时候不能满足需要,而且会产生临时对象,效率低一些。
(4)引用调用与传址调用比较有什么不同?
传址调用把变量在内存中的地址传给函数,这样在函数中修改地址上的值,会使主函数中的值也跟着改变,因为改变的是该地址上的值,而主函数也是通过地址访问的。
所以更改之后,主函数的值跟着变。
引用调用,也能改变主函数的的值,其做法也是获得该变量所在内存中的地址。
(5)三种函数调用方式的特点是什么?
传值调用只把变量的值传入函数,在函数中修改后,在主函数中值还是不变,相当于函数只是复制了变量的副本,不会改变原来的值。
传址调用把变量在内存中的地址传给函数(有地址信息可以轻易得出给地址上的值),这样在函数中修改地址上的值,会使主函数中的值也跟着改变,因为改变的是该地址上的值,而主函数也是通过地址访问的。
所以更改之后,主函数的值跟着变。
引用调用,也能改变主函数的的值,其做法也是获得该变量所在内存中的地址。
2.调试教材中例4.8程序,回答以下问题:
(1)函数设置默认参数时的注意事项有哪些?
验证如果不按其规定做时,会出现什么现象?
1.默认参数是严格按照从左至右的顺序使用。
2.参数默认值只能在声明或定义中一处指定.不能同时指定。
如果右面的参数不能用默认值,那么它左边的统统不能用默认值。
(2)函数设置了默认参数后,调用函数中出现实参值与默认形参值不等时,怎么办?
调用实参。
(3)在程序中有函数定义和函数说明时,设置默认参数在定义时还是在说明时?
在说明中。
3.上机调试教材中例4.16程序,熟悉函数嵌套调用的方法,将程序改写为只有一个主函数,并调试出正确结果。
#include
intpowers(intm,intn)
{
inti,product
(1);
for(i=1;i<=n;i++)
product*=m;
returnproduct;
}
intsum_of_powers(intk,intn)
{
intsum(0);
for(inti
(1);i<=n;i++)
sum+=powers(i,k);
returnsum;
}
voidmain()
{
intk(4),n(6);
sum_of_powers(k,n);
cout<<"sumof"<cout<}
任务2:
1.编写一个函数把华氏温度转换为摄氏温度,转换公式为:
C=(F-32)*5/9;F-32)*5/9。
#include
voidmain()
{
doublei,C;
cout<<"华氏温度为:
";
cin>>i;
C=(i-32)*5/9;
cout<<"摄氏温度为:
"<}
2.编写重载函数Max,可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。
#include
intmax(int,int);
doublemax(double,double);
voidmain()
{
cout<cout<}
intmax(intx,inty)
{
returnx+y;
}
doublemax(doublea,doubleb)
{
returna+b;
}
3.使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
#include
#include
voidmain()
{
doublex,y,z;
cout<<"pleaseinputxandy:
";
cin>>x>>y;
z=pow(x,y);
cout<"<}
4.用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。
#include
longfibo(intn);
voidmain()
{
intN;
cout<<"输入N值:
";
cin>>N;
longf=fibo(N);
cout<}
longfibo(intn)
{
if(n==1)return0;
elseif(n==2)return1;
else
returnfibo(n-1)+fibo(n-2);
}
任务3:
编程实现两字符串的连接。
要求使用字符数组保存字符串,不使用系统函数。
使用string类定义字符串对象,重新实现连个字符串的连接。
#include
#include
intmain()
{stringstr1,str2,str3;
cin>>str1;
cin>>str2;
str3=str1+str2;
cout<return0;
}
三、实验总结
教材上的程序要认真学习,尤其是函数调用方式上的区别,还有就是注意题目要求,小心仔细,杜绝小问题。
实验三
一、实验目的
1.掌握类的定义和使用;
2.掌握类的定义和对象的声明;
3.复习具有不同访问属性的成员的访问方式;
4.观察构造函数和析构函数的执行过程;
5.使用VC++的debug调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序;
二、具体实验任务
任务1:
定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。
其中,rank为枚举类型CPU_Rank,定义为enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7}。
frequency为单位是MHz的整数,voltage为浮点型的电压值。
观察构造函数和析构函数的调用顺序。
#include
enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};
classCPU
{
public:
CPU(CPU_Rankr,intf,floatv)
{
rank=r;
frequency=f;
voltage=v;
cout<<"构造了一个CPU!
"<}
~CPU()
{
cout<<"析构了一个CPU!
"<}
voidRun(){
cout<<"CPU开始运行!
"<}
voidStop()
{
cout<<"CPU停止运行!
"<}
voidprint()
{
cout<}
private:
CPU_Rankrank;
intfrequency;
floatvoltage;
};
voidmain()
{
CPUa(P2,100,1.11);
a.Run();
a.print();
a.Stop();
CPUb(P3,200,2.12);
b.Run();
b.print();
b.Stop();
}
任务2:
定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run,stop。
CPU为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。
#include
classCPU
{
private:
intrank;
intfrequency;
floatvoltage;
public:
CPU(intr,intf,floatv)
{
rank=r;
frequency=f;
voltage=v;
cout<<"构造CPU!
"<}
CPU()
{
cout<<"构造CPU!
"<};
~CPU()
{
cout<<"析构CPU!
"<}
voidRun()
{cout<<"CPU运行!
"<voidStop()
{cout<<"CPU停止运行!
"<};
classRAM
{
private:
inta;
public:
RAM()
{
cout<<"构造RAM!
"<}
~RAM()
{
cout<<"析构RAM!
"<}
voidRun()
{cout<<"RAM运行!
"<voidStop()
{cout<<"RAM停止!
"<};
classCDROM
{
private:
inta;
public:
CDROM()
{cout<<"构造CDROM!
"<~CDROM()
{
cout<<"析构CDROM!
"<}
voidRun(){cout<<"CDROM运行!
"<voidStop(){cout<<"CDROM停止!
"<};
classCOMPUTER
{
private:
CPUcpu;
RAMram;
CDROMcdrom;
public:
COMPUTER()
{
cout<<"构造OMPUTER!
"<}
~COMPUTER()
{
cout<<"析构COMPUTER!
"<}
voidRun()
{
cout<<"COMPUTER运行!
"<cpu.Run();
ram.Run();
}
voidStop()
{
ram.Stop();
cpu.Stop();
cout<<"COMPUTER停止运行!
"<}
};
voidmain()
{
COMPUTERa;
a.Run();
a.Stop();
}
三、实验总结
使用VC++的debug调试功能观察程序流程时,要注意跟踪观察类的构造函数、析构函数、成员函数的执行顺序,结合教材,学习编写。
实验四
一、实验目的
1.学习定义和使用类的继承关系,定义派生类;
2.熟悉不同继承方式下对基类成员的访问控制;
3.学习利用虚基类解决二义性问题;
4.掌握运算符重载的方法;
5.学习使用虚函数实现动态多态性;
6.熟悉流类库中常用的类及其成员函数的用法;
7.学习标准输入输出及格式控制;
二、具体实验任务
任务1:
定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(intn)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?
#include
classAnimal
{
public:
Animal()
{
cout<<"构造函数"<}
~Animal()
{
cout<<"析构函数"<};
voidSetAge(intn)
{
age=n;
}
intGetAge()
{
returnage;
}
private:
intage;
};
classDog:
publicAnimal
{
public:
Dog()
{
cout<<"构造Dog"<}
~Dog()
{
cout<<"析构Dog"<}
};
voidmain()
{
Doga;
a.SetAge(5);
cout<<"age="<}
任务2:
定义一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop等成员函数,由此派生出自行车(bicycle)、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SearNum)等属性。
从bicycle何motorcar派生出摩托车(motorcycles)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?
#include
classvehicle
{
public:
intMAXSPEED;
intWEIGHT;
voidRUN();
voidSTOP();
vehicle()
{
cout<<"构造vehicle函数"<}
~vehicle()
{
cout<<"析构v