面向对象程序设计实验报告_第1页
面向对象程序设计实验报告_第2页
面向对象程序设计实验报告_第3页
面向对象程序设计实验报告_第4页
面向对象程序设计实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、面向对象程序设计实验报告姓名: 学号: 班级: 专业: 学院: 实验三 函数的应用一、实验目的:掌握函数的定义 和调用方法;练习重载函数使用;练习函数模板的使用;练习使用系统函数。二、实验步骤编写函数float Convert(float TempFer),参数的返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入、输出。分别编写四个同名函数max1,实现函数重载,在main()函数中测试函数功能。使用函数模板实现求任意类型数的最大值,针对不同的参数个数,编写两个同名函数模板max1,其参数个数不同,实现函数重载,在main()函数中测试函数的功能。在mai

2、n()函数中提示输入两个整数x,y,使用cin语句得到x,y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算Fibonacci级数。公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib(1)=fib(2)=1。使用if语句判断函数的出口,在程序中用cout语句输出提示信息。三、实验内容及部分代码:1)编写一个函数把华氏温度转换为摄氏温度,转换公式为:C=(F-32)*5/9。26 / 26文档可自由编辑打印#include<iostream.h>float Co

3、nvert(float TempFer)float C,F;F=TempFer;C=(F-32)*5/9;return C;main()float C,F;cin>>F>>endl;c=Convert(f);cout<<”摄氏温度:”<<endl;2) 编写重载函数Max1可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。#include<iostream.h>int maxl(int a,int b);int maxl(int a,int b,int c);int maxl(float a,float b);int

4、maxl(float a,float b,float c);int main()int A,B,C;float Max;float D,E,F;Max=maxl(A,B);Max=maxl(A,B,C);Max=maxl(D,E);Max=maxl(D,E,F);return 0;int maxl(int a,int b)int max;if(a>b)max=a;else max=b;return max;int maxl(int a,int b,int c)int max;max=(a>b?a:b)>c?(a>b?a:b);return max;float maxl(

5、float a,float b)float max;if(a>b)max=a;else max=b;return max;float maxl(float a,float b,float c)float max;max=(a>b?a:b)>c?(a>b?a:b):c;return max;3)使用重函数模板重新实现上小题中的函数Max1。#include<iostream.h>template<typename T>T maxl(T a,T b);return a>b?a:b;int main()int A,B;float C,D;cout

6、<<maxl(A,B)<<endl;cout<<maxl(C,D)<<endl;return 0;3) 使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。#include<iostream.h>#include<math.h>main() int x,y; cin>>x>>y; cout<<x<<"的"<<y<<"次方为:"<<pow(x,y)<<endl;4)用递归的

7、方法编写函数求Fibonacci级数。#include <iostream.h>int fib(int n);int main() int n,answer; cout<<”Enter number:”; cin>>n; cout <<”nn”; answer=fib(n); cout<<answer<<”is the “<<n<<”th Fibonnaci numbern”; return 0;int fib(int n) if(n<3) return 1; else return fib(

8、n-2)+fib(n-1); 4、 实验思考及体会:在本次实验中,;了解到各种函数的运用和性质,以及函数模板的调用,重载函数,函数模板,系统函数的使用。实验四 类与对象一、 实验目的: 掌握类的定义和使用掌握类的定义和对象的声明复习具有不同访问属性的成员的访问方式。察构造函数和析构函数的执行过程。学习类的聚集使用方法。二、实验步骤:首先定义枚举类型CPU_Rank,例如 enum CPU_Rank P1=1,P2,P3,P4,P5,P6,P7,再定义CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等私有数据成员,定义成员函数run、stop,用来输出提示信息,

9、在构造函数和析构函数中也可以输出提示信息。在主程序中定义一个CPU类的对象,调用其成员函数,观察类对象的构造与析构顺序,以及成员函数的调用。三、实验内容及部分代码:1)定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中rank为枚举类型CPU_Rank,定义一个enum CPU_Rank=P1=1,P2,P3,P4,P5,P6,P7,frequency为单位为MHz的整型数,voltage为浮点型的电压值。#include <iostream.h>class CPU CPU_Rank rank;

10、 int frequency; float voltage;public: enum CPU_Rankp1=1, p2, p3, p4, p5, p6, p7; CPU() std:cout << "CPU constructive" << std:endl; void run() ; void stop() ; virtual CPU() std:cout << "CPU destructive" << std:endl; ;class RAM public: RAM() std:cout <<

11、; "RAM constructive" << std:endl; RAM() std:cout << "RAM destructive" << std:endl; ;class CDROM public: CDROM() std:cout << "CDROM constructive" << std:endl; CDROM() std:cout << "CDROM destructive" << std:endl; ;class

12、Computer private: CPU cpu; RAM ram; CDROM cdrom;public: Computer() std:cout << "Computer constructive" << std:endl; void run() ; void stop() ; Computer() std:cout << "Computer destructive" << std:endl; ;int main (int argc, char *argv) CPU *cpu = new CPU();

13、 Computer *computer = new Computer(); delete cpu; delete computer; return 0;2)定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。#include<iostream.h>enum CPU_RankP1=1,P2,P3,P4,P5,P6,P7; class CPU private:CPU_Rank rank; int frequency; float

14、voltage; public: CPU(CPU_Rank r,int f,float v) rank=r;frequency=f;voltage=v;cout<<"构造了一个CPU!"<<endl; CPU()cout<<"析构了一个CPU!"<<endl;CPU_Rank GetRank()constreturn rank;int GetFrequency()constreturn frequency;float GetVoltage()constreturn voltage;void SetRank(

15、CPU_Rank r)rank=r;void SetFrequency(int f)frequency=f;void SetVoltage(float v)voltage=v;void Run()cout<<"CPU开始运行!"<<endl;void Stop()cout<<"CPU停止运行!"<<endl;class RAM /定义RAM类int x;public:RAM(int a)x=a;cout<<"构造了一个RAM!"<<endl;RAM()cout&l

16、t;<"析构了一个RAM!"<<endl;class CDROM /定义CDROM类char y;public:CDROM(char v)y=v;cout<<"构造了一个CDROM!"<<endl;CDROM()cout<<"析构了一个CDROM!"<<endl;class Computer /定义Computer类CPU a;RAM b;CDROM c;public:Computer(CPU_Rank x,int y,float z,int xx,char yy)/构

17、造函数:a(x,y,z),b(xx),c(yy)cout<<"构造了一个Computer!"<<endl;Computer()cout<<"析构了一个Computer!"<<endl;void Run()cout<<"Computer开始运行!"<<endl; void Stop()cout<<"Computer停止运行!"<<endl;void main()Computer niu(P6,3,2.9,4,'G&

18、#39;);niu.Run();niu.Stop(); 3)设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。#include <iostream>#include <string>class Date /日期类private:int year;int month;int day;public

19、:Date() /默认构造Date(int y,int m,int d) /带参构造year=y;month=m;day=d;void set() /设置数据函数cin>>year>>month>>day;void display() /显示函数cout<<year<<'/'<<month<<'/'<<day;class Person /人员类private:int num;char sex;Date birthday;char ID19;public:Person(

20、) /默认构造Person(int n,int y,int m,int d,char id19,char s='m'):birthday(y,m,d)num=n;sex=s;strcpy(ID,id); /有默认值的带参构造Person(Person& p) /拷贝构造num=p.num;sex=p.sex;birthday=p.birthday;strcpy(ID,p.ID);void input() /输入函数cout<<"录入数据:"<<endl;cout<<"编号:"cin>>

21、;num;cout<<"性别(m/f):"cin>>sex;cout<<"生日:"birthday.set();cout<<"身份证号:"cin>>ID;ID18='0'cout<<endl;void output() /输出函数cout<<"编号:"<<num<<endl;cout<<"性别:"<<sex<<endl;cout<&

22、lt;"生日:"birthday.display();cout<<endl;cout<<"身份证号:"<<ID<<endl;Person() /析构函数cout<<num<<"号人员信息已删除。"<<endl;int main()Person p1;p1.input();p1.output();return 0;4、 实验思考及体会:通过本次试验更加了解了C+中类与对象的含义,类和函数的互相使用,以及类的编写和使用。 实验五 C+程序的结构一、实验目的

23、观察程序运行中变量的作用域、生存期和可见性。学习类的静态成员的使用。学习多文件结构在C+程序中的使用。二、实验步骤1 运行程序lab5_1,观察程序输出。全局变量的作用域为文件作用域,在整个程序运行期间有效,但如果在局部模块中定义了同名的变量,则在局部模块中,可见的是局部变量,此时,全局变量不可见;而局部变量的生存期只限于相应的程序模块中,离开相应的程序模块,局部变量x、y就不再存在,此时同名的全局变量重新可见。2 新建一个空的项目lab5_2,添加头文件client.h,在其中定义类CLIENT,注意使用编译预处理命令;再添加原程序文件client.cpp,在其中实现CLIENT类,注意静态

24、成员变量的使用方法,再添加文件lab5_2.cpp,在其中定义main()函数,测试CLIENT类,观察相应的成员变量取值的变化情况。3、 实验内容及部分代码:1)运行下面的程序,观察变量x、y的值。#include<iostream.h>void fnl();int x=1,y=2; int main() cout<<"Begin."<<endl; cout<<"x="<<x<<endl; cout<<"y="<<y<<end

25、l; cout<<"Evaluate x and y in main()."<<endl; int x=10, y=20; cout<<"x="<<x<<endl; cout<<"y="<<y<<endl; cout<<"Step into fnl()."<<endl; fnl(); cout<<"Back in main"<<endl; cout<

26、;<"x="<<x<<endl; cout<<"y="<<y<<endl; return 0;void fnl() int y=20; cout<<"x="<<x<<endl; cout<<"y="<<y<<endl;经运行,实验运行结果:Begin.x=1y=2Evaluate x and y in main().x=10y=20Step into fnl().x=1y=20B

27、ack in mainx=10y=20;2)现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeSeverName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在test.cpp中测试这个类,观察相应的成员变量取值的变化情况。client.h文件:class CLIENTprivate: static char10 ServerName; /保存其服务器名称 static int ClientNum; /记录已定义的客户数量publi

28、c: ChangeServerName(); /改变服务器名称 ;4、 实验思考及体会:通过本次实验,了解域的性质和使用情况,对字符串,数据组的使用,静态动态数据组的使用。实验六 数组、指针与字符串1、 实验目的:学习使用数组。学习字符串数据的组织和处理。学习标准C+库的使用。掌握指针的使用方法。练习通过debug观察指针的内容及其所指的对象的内容。练习通过动态内存分配实现动态数组,并体会指针在其中的作用。分别使用字符数组和标准C+库练习处理字符串的方法。2、 实验步骤:1、编写矩阵转置函数,输入参数为3*3整型数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操

29、作,编写main()函数实现输输出。2、改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中 new 操作符分配内存生成动态数组。3、编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用count 语句显示输出。用 cin 实现输入,注意,字符串的结束标志是ASCII码 0,使用循环语句进行字符串间的字符拷贝。使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+ =”实现字符串的连接,可以使用这个功能。4、在employee.h文件中定义Employee类, EmpL

30、oyee类具有姓名、街道地址、城市和邮遍等私有数据成员,都可以用字符型数组来表示,在成员函数中,构造函数用来初始化所有成员数组,对字符数组的赋值可以使用字符串拷贝函数 strcpy(char *,char * name);display()中使用count显示姓名、街道地址、城市和邮遍等属性,chang_name()改变类中表示姓名属性的字符数组类型的数据成员。在主程序中定义这个类的对象并对其进行操作。 5、使用上一小题中定义的Employee类定义对象数组enp5,使用循环语句把数据显示出来。三、实验内容及部分代码:1)编写并测试3*3 矩阵转置函数,使用数组保存 3*3 矩阵。#inclu

31、de<iostream.h>void main() int a33,i,j,b33; cout<<"请依次输入距阵中的元素:"<<endl; for( i=0;i<3;i+) for( j=0;j<3;j+) cin>>aij; cout<<"此矩阵中的元素为:"<<endl; for( i=0;i<3;i+) for( j=0;j<3;j+) cout<<aij; cout<<" " cout<<end

32、l; cout<<"经过转置后矩阵为:"<<endl; for( i=0;i<3;i+) for( j=0;j<3;j+) bij=aji; cout<<bij; cout<<" " cout<<endl; 使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能#include<iostream.h>#include<stdlib.h>void print(int *a) for(int i=0;i<9;i+) cout<<*a;

33、 cout<<" " a+; if(i+1)%3=0)cout<<endl; void reserve(int *&a) int b33,i,j; int *c; c=a; for(i=0;i<3;i+) for(j=0;j<3;j+) bij=*a; a+; a=c;for(i=0;i<3;i+) for(j=0;j<3;j+) *a=bji; a+; a=c;void main() int i,j; int *a,*b; a=(int *)new int33; b=a; cout<<"请依次输

34、入距阵中的元素:"<<endl; for(i=0;i<9;i+) cin>>*a; a+; a=b;cout<<"此距阵中的元素为:"<<endl;print(a);reserve(a);cout<<"经过转置后此距阵为:"<<endl;print(a);2)编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。使用sting类定义字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。#include <iostream>using

35、namespace std;int main() char str140; char str220;/保证被连接字符串长度大于待连接字符串的长度. int counter1=0,counter2=0;/计数器 cout<<"请输入第一个字符串: " cin>>str1; cout<<"n请输入第二个字符串: " cin>>str2; while(str1counter1!='0') /这个循环用于找到第一个字符串的最后一字符位置 +counter1; /counter1用于记录这个位置 wh

36、ile(str2counter2!='0') str1counter1-1=str2counter2; /从第一个字符串的末尾开始复制 +counter1; +counter2; str1counter1='0' /将字符串的结束位改成 连接后的字符串的末尾 cout<<"n连接后的字符串:"<<str1;3)定义一个Employee类,其中包括姓名、街道地址、城市和邮遍等属性。以及 change_name() 和display()等函数。display()显示姓名、街道地址、城市和邮遍等属性,change_name(

37、)改变对象的姓名。#include <iostream>using namespace std;class Employee private: char *name,*address,*city,*postCode;public: Employee(char *_name,char *_address,char *_city,char *_postCode) name = _name; address = _address; city = _city; postCode = _postCode; void change_name(char *_name) name = _name;

38、 void display() cout << "name : " << name << endl; cout << "address : " << address << endl; cout << "city : " << city << endl; cout << "postcode : " << postCode << endl; ;int main(int argc

39、,char *argv) Employee *e = new Employee("zhangsan","chang d d","beijing","100056"); e->display(); e->change_name("lisi"); e->display(); delete e;4、 实验思考及体会:通过本次实验,了解了指针变量可以指向任何类型的对象,它指向数组、结构、函数、数组的数组元素等。同时对多维数组也有了深刻的认识。实验七、继承与派生(一、二)1、实验目的:学

40、习定义和使用类的继承关系,定义派生类。熟悉不同继承方式下对基类成员的访问控制。学习利用虚基类解决二义性问题。二、实验步骤编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:error C2248:age:cannot access private member declared in class Animalerror C2248:age:cannot access private member declared in class Animal把age改为公有成员变量后重新编译就可以了

41、。(2) 编写程序定义一个基类BassClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名为:lab7_2.cpp。(3) 用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车类(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名为:lab7_3.cpp。 编译成功后,

42、把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。3、 实验内容及部分代码:1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?# include <iostream> using namespace std; class Animal public: Animal() cout << "Aninmal is constru

43、cted!"<<endl; Animal() cout << "Aninmal is deconstructed!"<<endl; ; void SetAge(int n) age=n; int GetAge() return age; private : int age; char name; ; class Dog:public Animal public: Dog() cout << "Dog is constructed!"<<endl; Dog() cout <<

44、 "Dog is constructed!"<<endl; ;int main() Dog dog; dog.SetAge(12); cout <<"age=" <<dog.GetAge() <<endl; return 0; 运行结果:Aninmal is constructed!Dog is constructed!age=12Dog is constructed!Aninmal is deconstructed!2)定义一个基类BaseClass,有整型成员变量Number ,构造其派生类Derive

45、dClass,观察构造函数和析构函数的执行情况。#include<iostream>using namespace std;class baseclasspublic: int number; baseclass() baseclass(int);class derivedclass:public baseclasspublic: int number_derived; derivedclass() derivedclass(int);baseclass:baseclass(int num) number = num; cout<<number<<endl;

46、 cout<<"call base class"<<endl;derivedclass:derivedclass(int num) number_derived = num;cout<<number_derived<<endl; cout<<"call derived class"<<endl; int main() baseclass Base(10); derivedclass DBase(29); return 1; 运行结果:10call base class29call d

47、erived class;3) 定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车类有高度(height)等属性,汽车类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。#include<iostream>using namespace std;class Vehicle double M

48、axSpeed;double Weight;void Run();void Stop()class Bicycle extends Vehicledouble Height;void Run()System.out.println("I can 2!");class Motocar extends Vehicledouble SeatNum;void Run()System.out.println("I can 3!");class Motorcycle extends Vehiclevoid Run()System.out.println("

49、I can 4!");public class question2_7 public static void main(String args) Vehicle a=new Motorcycle();Vehicle b=new Motocar();a.Run();b.Run();Int main() Vehicle (10)4、 实验思考及体会:通过本次实验了解了 :派生类是基类的具体化,而基类则是派生类的抽象。同时对正在进行多继时,出现的二义性问题有了了解。实验八、多态性1、实验目的:掌握运算符重载的方法习使用虚函数实现动态多态性。2、实验步骤1/编写程序定义Point类,在类中定

50、义整型的私有成员变量x,y,定义成员函数Point& operator+();Point operator+(int);以实现对Point类重载“+”运算符,定义成函数Point& operator ();Point operator - -(int);以实现对Point类重载“- -”运算符,实现对坐标值的改变。2、 编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车类(motorcar),从bicycle类和motorcar类派生出摩托车类(motorcycle),它们都有Run、Stop等成员函数。在main

51、()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。再分别用vehicle类型的指针来调用几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试看。3、 实验内容及部分代码:1) 定义Point类,有坐标x,y两个成员变量;对Point类重载“+”、“- -”运算符,实现对坐标值的改变。#include <iostream.h>class Pointprivate: int x; int y;public: Point (int a,int b)x=a;y=b; Point

52、&operator +(int); Point &operator -(int); Point &operator +(); Point &operator -(); void print();Point &Point:operator+(int) return Point(x+,y+);Point &Point:operator-(int) return Point(x-,y-);Point &Point:operator+() return Point(+x,+y);Point &Point:operator-() retur

53、n Point(-x,-y);void Point:print() cout<<"x="<<x<<"ty="<<y<<endl;main() Point a1(2,3); a1+; a1.print();2)定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函的作用。#include<iostream.h>class vehicle / 定义汽车类protected:int wheels; / 车轮数float weight; / 重量public:vehicle(int wheels,float weight);int get_wheels();float get_weight();float wheel_load

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论