最新C++实验报告1.doc
精品资料C+实验报告1.重 庆 交 通 大 学学 生 实 验 报 告实验课程名称 C+程序设计 开课实验室 数学实验室 学 院 理学院 年级 09级信息 专业班 2班 学 生 姓 名 学号 09180223 开 课 时 间 2009 至 2010 学年 第 2 学期评分细则内容分数实验过程设计 (40%)实验结果分析(30%)实验体会(20%)排版格式(10%)总 成 绩教师签名:韩逢庆实验2 类和对象2.1 实验目的 1 类的定义; 2 类对象的使用; 3 类成员变量、成员函数的定义和使用; 4 观察类的组合使用; 5 理解类的作用域; 6 理解类的声明; 7 理解类中 private 和 public 权限;8 掌握拷贝构造函数的定义和使用; 9 掌握构造函数的重载; 10 掌握析构函数的定义和使用11 理解构造函数和析构函数的执行过程2.2 实验内容 2.2.1 理解部分 1 理解下面的程序,回答后面的问题,并在 vc6.0 下运行查看结果。 #include <iostream.h> class CDate void Set( int m, int d, int y ) month = m ; day = d ; year = y ; int IsLeapYear() return (year%4 = 0 && year%100 != 0)|(year%400 = 0); public : void Print() cout<<month<< "/" <<day<< "/" <<year<<endl; private : int month; int day; int year; ; void main() CDate a; - a.Set(10,15,2007) ; a.Print(); 问题一:以上程序编译能通过吗,为什么,应该如何改正? 答:不能。因为没有定义构造函数,并且没有声明私有成员。修改后的程序代码为:#include <iostream.h> class CDate private:int month,day,year;public :void Set( int m, int d, int y ) month = m ; day = d ; year = y ; int IsLeapYear() return (year%4 = 0 && year%100 != 0)|(year%400 = 0); void Print() cout<<month<< "/" <<day<< "/" <<year<<endl; private : int month; int day; int year; ; void main() CDate a; a.Set(10,15,2007) ; a.Print(); 问题二:类 CDate 中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限? 答:成员变量为:month、day、year. 成员函数有:void Set( int m, int d, int y ) 、int IsLeapYear()、void Print() 问题三:处语句的意思是什么? 答: 定义一个省略参数的类。2 理解下面的程序,回答后面的问题,并在 vc6.0 下运行查看结果。 #include <iostream.h> int month; / 全局变量 int day; int year; void Set( int m, int d, int y) - a :month=m; - :day=d; :year=y; class CDate public : void Set( int m, int d, int y) - b :Set(m,d,y); - void Print() cout<<month<< "/" <<day<< "/" <<year<<endl; private : int month; / 成员变量 int day; int year; ; void main() CDate a; a.Set(10,15,2007) ; a.Print(); 问题一:处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符 : ,程序是否还能正确运行? 答:处是在给局部变量赋值。去掉:后不能正确运行。问题二:处调用的哪个函数,如果去掉域作用符 : ,程序是否还能正确运行? 答:处调用的是a处的函数。去掉:仍然不能正确运行。问题三:该程序的输出结果是什么,试解释该输出结果。 答:原因在于该类没有定义私有成员变量。3试指出以下程序的错误,并改正之。 #include <iostream.h> class CPoint public : unsigned x, unsigned y; bool IsInCircle(CCircle *Circle) return (x-Circle->Center.x)*(x-Circle->Center.x) +(y-Circle->Center.y)*(y-Circle->Center.y)<=Circle->Radius*Circle->Radius); ; class CCircle public : unsigned Radius; CPoint Center ; ; void main() 答:错误在于bool IsInCircle(CCircle *Circle) ;修改后的程序为:#include <iostream.h> class CCircle; class CPoint friend class CCircle();public : unsigned x;unsigned y; bool IsInCircle(CCircle *Circle) return (x-Circle->Center.x)*(x-Circle->Center.x) +(y-Circle->Center.y)*(y-Circle->Center.y)<=Circle->Radius*Circle->Radius); ; class CCircle public : unsigned Radius; CPoint Center ; ; void main() 4 理解下面的程序,回答后面的问题,并在 vc6.0 下运行查看结果。 #include <iostream.h> class CPoint public : void Set( int x, int y); void Print(); private : int x; int y; ; void CPoint:Set( int x, int y) x = x; y = y; void CPoint:Print() cout<< "x=" <<x<< ",y=" <<y<<endl; void main() CPoint pt; pt.Set(10,20); pt.Print(); 问题一:以上程序编译能通过吗,试解释该程序? 答:能够通过。问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正? 答:不正确。原因在于改程序中void Set( int x, int y)的形参与函数变量重名,产生二义性。void Set( int x, int y)应改为void Set( int x1, int y1);5 理解下面的程序,回答后面的问题,并在 vc6.0 下运行查看结果。 #include <iostream.h> class CPerson public : void Print(); private : CPerson(); private : int age; char *name; ; CPerson:CPerson() void CPerson:Print() cout<< "name=" <<name<< ",age=" <<age<<endl; void main() CPerson ps(23, " 张三 " ); ps.Print(); 问题:以上程序存在若干错误,在不改变主函数内容的前提下,试改正该程序。答:修改后的程序为: #include <iostream.h> class CPerson public : void Print(); CPerson(int a,char *b); private : int age; char *name; ; CPerson:CPerson(int a,char *b) age=a; name=b; void CPerson:Print() cout<< "name=" <<name<< ",age=" <<age<<endl; void main() CPerson ps(23, " 张三 " ); ps.Print(); 2.2.2 程序设计部分 1 试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。2 设计实现一个 CPoint 类,满足以下要求: a 该类包含两个整型成员变量 x (横坐标)和 y (纵坐标),以及一个输出函数 Print() 用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b 可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值 0 ; c 可以采用直接输入参数的方式来初始化该类的成员变量; d 可以采用其它的 CPoint 对象来初始化该类的成员变量; e 设计一个主函数来测试以上功能。3 设计一个 CStudent (学生)类,并使 CStudent 类具有以下特点: a 该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b 学生全部信息由键盘输入,以提高程序的适应性; c 通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d 输出学生的基本信息、各科成绩与平均成绩; e 学生对象的定义采用对象数组实现; f 统计不及格学生人数。4 设计一个用于人事管理的员工类(employee),包含的成员变量有:编号、性别、出生日期、身份证号码等,成员函数有:构造函数、析构函数、拷贝构造函数、员工基本信息输出函数等。其中,编号用字符数组,身份证号码用字符指针,出生日期为日期类的对象一、 实验结果分析1 试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。(一)、程序理解该程序考察构造函数和利用成员函数对私有成员进行修改的问题,此外也考察了应用与指针在数据应用方面的广泛应用!(二)、程序设计见代码。二、 实验体会改程序让我了解熟悉了构造函数与成员函数对私用成员的重要性,以及指针域应用的区别。三、 附录:(源代码)#include"iostream.h"#include"math.h"class fushuprivate:float shibu;float xubu;public:fushu(float a,float b); fushu(float *a,float *b);fushu(float &a,float &b);void show(void);fushu(void);fushu:fushu(float a,float b)/定义公共函数shibu=a;xubu=b;fushu:fushu(float *a,float *b)/定义参数为指针类型的函数shibu=*a;xubu=*b;fushu:fushu(float &a,float &b)/定义参数为引用类型的函数shibu=a;xubu=b;void fushu:show(void)/私用成员的输出cout<<"实部为:"<<endl;cout<<shibu<<endl; cout<<"虚部为:"<<endl;cout<<xubu<<endl; fushu:fushu()main()float k=1.2,n=2; float *r=&k,*i=&n;fushu a(2.5,3);cout<<"采用对象方式输出结果为:"<<endl;a.show(); fushu b(r,i);cout<<"采用指针方式输出结果为:"<<endl;b.show();fushu c(&k,&n);cout<<"采用引用方式输出结果为:"<<endl;c.show();2 设计实现一个 CPoint 类,满足以下要求: a 该类包含两个整型成员变量 x (横坐标)和 y (纵坐标),以及一个输出函数 Print() 用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b 可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值 0 ; c 可以采用直接输入参数的方式来初始化该类的成员变量; d 可以采用其它的 CPoint 对象来初始化该类的成员变量; e 设计一个主函数来测试以上功能。四、 实验结果分析(一)、程序理解 改程序主要考察了构造函数与一般成语函数的作用,以及在定义构造函数在参数个数与参数默认的情况下的构造情况!(二)、程序设计见源代码.五、 实验体会此实验让我对构造函数在参数默认以及参数个数缺省情况下的定义方法有了更深的掌握,以及对成员函数的作用有了更深刻的了解!六、 附录:(源代码)#include "iostream.h"#include "stdio.h"class CPoint private:float x, y;public:CPoint(void);CPoint (float x1,float y1);modify(float x2,float y2);CPoint();void Print(void);CPoint:CPoint()x=0;y=0;CPoint:CPoint(float x1,float y1)/默认参数函数x=x1;y=y1;CPoint:modify(float x2,float y2)/对私有成员的修改x=x2;y=y2;CPoint:CPoint()void CPoint:Print(void)/输出坐标功能函数cout<<"初始化后的坐标为:("<<x<<","<<y<<")"<<endl;void main(void) CPoint a,b(8,9); a.Print(); b.Print();a.modify(9,8);a.Print();3 设计一个 CStudent (学生)类,并使 CStudent 类具有以下特点: a 该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b 学生全部信息由键盘输入,以提高程序的适应性; c 通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d 输出学生的基本信息、各科成绩与平均成绩; e 学生对象的定义采用对象数组实现; f 统计不及格学生人数。七、 实验结果分析(一)、程序理解该程序主要考察嵌套类定义,以及在定义相关成员函数是的定义方法。此外还考察了程序设计的灵活性!(二)、程序设计见源代码。八、 实验体会该实验让我对嵌套类的定义有了更深刻的了解,对嵌套类的使用有了进一步的掌握。最主要的是让我知道了程序设计的灵活性的重要性!九、 附录:(源代码)#include "iostream.h"#include "string.h"#include "math.h"#include "stdio.h"class Cstudentclass gradeprivate:int sum;float process; float singal;float construct;float average;public:grade(float a,float b,float c)sum=0;process=a;singal=b;construct=c;average=(process+singal+construct)/3.0; void modify(float a,float b,float c)/子对象值的修改传值 process=a; singal=b; construct=c; void show()/子对象的显示 average=(process+singal+construct)/3.0; cout<<"程序设计成绩为:"<<process<<endl;cout<<"信号处理成绩为:"<<singal<<endl;cout<<"数据结构成绩为:"<<construct<<endl;cout<<"学生平均成绩为:"<<average<<endl;if(process<60)|(singal<60)|(construct<60)sum+;cout<<"有不及格科目的学生数为:"<<sum<<endl; ;private:char *name;char *number;grade all;public:Cstudent(char *name1,char *number1,float a1,float b1,float c1);Cstudent(void);void set(void);void display();Cstudent:Cstudent(char *name1,char *number1,float a1,float b1,float c1):/函数1(传入数据)all(a1,b1,c1) name=new charstrlen(name1)+1; strcpy(name,name1); number=new charstrlen(number1)+1; strcpy(number,number1);Cstudent:Cstudent(void)/函数2(释放空间)delete name;delete number;void Cstudent:set(void)/函数3(数据修改) float grade1,float grade2,float grade3;char name120,char number110; cout<<"请输入学生的程序设计成绩:"<<endl; cin>>grade1; cout<<"请输入学生的信号处理成绩:"<<endl; cin>>grade2; cout<<"请输入数据结构成绩:"<<endl; cin>>grade3; delete name; cout<<"请输入学生的姓名:"<<endl; cin>>name1; name=new charstrlen(name1)+1;strcpy(name,name1); delete number; cout<<"请输入学生的学号:"<<endl; cin>>number1; number=new charstrlen(number1)+1;strcpy(number,number1);all.modify(grade1,grade2,grade3);void Cstudent:display()/函数4(数据输出)cout<<"学生姓名为:"<<name<<endl;cout<<"学生学号为:"<<number<<endl;all.show();void main() char a20,b10; float grade1,grade2,grade3; cout<<"请输入学生的姓名:"<<endl; cin>>a; cout<<"请输入学生的学号:"<<endl; cin>>b; cout<<"请输入学生的程序设计成绩:"<<endl; cin>>grade1; cout<<"请输入学生的信号处理成绩:"<<endl; cin>>grade2; cout<<"请输入数据结构成绩:"<<endl; cin>>grade3; Cstudent number1(a,b,grade1,grade2,grade3); number1.display(); number1.set(); cout<<endl<<"-重新修订后的信息为-"<<endl<<endl; number1.display();4 设计一个用于人事管理的员工类(employee),包含的成员变量有:编号、性别、出生日期、身份证号码等,成员函数有:构造函数、析构函数、拷贝构造函数、员工基本信息输出函数等。其中,编号用字符数组,身份证号码用字符指针,出生日期为日期类的对象十、 实验结果分析(一)、程序理解同上一个程序一样,改程序主要考察队类以及嵌套类的理解与定义方法的掌握。另外还考察了析构函数、构造函数、拷贝构造函数、其他成员函数的配套应用。(二)、程序设计见源代码。十一、 实验体会该实验让我了解到了析构函数与构造函数配套的具体作用,同时也让我对拷贝构造函数有了更深刻的了解与掌握。十二、 附录:(源代码)#include "iostream.h"#include "stdio.h"#include "string.h"class employeeclass birthdayprivate:char *month;char *day;char *year;public:birthday(char *mon,char*da,char*ye)/子对象传值month=mon;day=da;year=ye;birthday()month="0"day="0"year="0" void modify(char *a,char *b,char *c)/子对象值的修改传值 month=a; day=b; year=c; void show()/子对象的显示 cout<<"人员出生月份为:"<<month<<endl;cout<<"人员出生日为:"<<day<<endl;cout<<"人员出生年为:"<<year<<endl; ;private:char *number;char *sex;char *array;birthday all;public:employee(char *number,char *sex,char *array,char *m,char *d,char *y);employee(void);void set(char *number,char *sex,char *array,char *m,char *d,char *y);void display();void show(void);employee:employee(char *nu,char *se,char *arr,char *m,char *d,char *y):/函数1(传入数据)all(m,d,y)number=new charstrlen(nu)+1; strcpy(number,nu); sex=new charstrlen(se)+1; strcpy(sex,se); array=new charstrlen(arr)+1; strcpy(array,arr);employee:employee(void)/函数2(释放空间)delete number;delete sex;delete array;void employee:set(char *nu,char *se,char *arr,char *m,char *d,char *y)/函数3(数据修改)delete number;number=new charstrlen(nu)+1;strcpy(number,nu);delete sex;sex=new charstrlen(se)+1;strcpy(sex,se);delete array;array=new charstrlen(arr)+1;strcpy(array,arr);all.modify(m,d,y);void employee:display()/函数4(数据输出)cout<<"人员编号为:"<<number<<endl;cout<<"人员性别为:"<<sex<<endl;cout<<"人员身份证号为:"<<array<<endl;all.show();void main() employee stuff("09180223","man","500381199010174375","10","17","1990"); stuff.display(); cout<<endl<<"-重新修订后的信息为-"<<endl<<endl; stuff.set("09180222","man","500102199008298698","08","29","1990"); stuff.display();