C++实验报告1.docx
《C++实验报告1.docx》由会员分享,可在线阅读,更多相关《C++实验报告1.docx(25页珍藏版)》请在冰豆网上搜索。
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?
classCDate
{
voidSet(intm,intd,inty)
{
month=m;
day=d;
year=y;
}
intIsLeapYear()
{
return(year%4==0&&year%100!
=0)||(year%400==0);
}
public:
voidPrint()
{cout<private:
intmonth;intday;intyear;
};?
voidmain()
{
CDatea;-----------------------------------------------------①
a.Set(10,15,2007);
a.Print();
}
问题一:
以上程序编译能通过吗,为什么,应该如何改正?
答:
不能。
因为没有定义构造函数,并且没有声明私有成员。
修改后的程序代码为:
#include
classCDate
{private:
intmonth,day,year;
public:
voidSet(intm,intd,inty)
{
month=m;
day=d;
year=y;
}
intIsLeapYear()
{
return(year%4==0&&year%100!
=0)||(year%400==0);
}
voidPrint()
{cout<private:
intmonth;intday;intyear;
};
voidmain()
{
CDatea;
a.Set(10,15,2007);
a.Print();
}
问题二:
类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限?
答:
成员变量为:
month、day、year.成员函数有:
voidSet(intm,intd,inty)
、intIsLeapYear()、voidPrint()
问题三:
①处语句的意思是什么?
答:
定义一个省略参数的类。
2.理解下面的程序,回答后面的问题,并在vc6.0下运行查看结果。
#include?
intmonth;//全局变量
intday;
intyear;
voidSet(intm,intd,inty)----------------------------------------------a
{
:
:
month=m;-----------------------------------------------------①
:
:
day=d;
:
:
year=y;
}
classCDate
{
public:
voidSet(intm,intd,inty)------------------------------------------------b
{
:
:
Set(m,d,y);-----------------------------------------------------②
}
voidPrint()
{cout<private:
intmonth;//成员变量
intday;
intyear;
};?
voidmain()
{
CDatea;
a.Set(10,15,2007);
a.Print();}
问题一:
①处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符:
:
,程序是否还能正确运行?
答:
①处是在给局部变量赋值。
去掉:
:
后不能正确运行。
问题二:
②处调用的哪个函数,如果去掉域作用符:
:
,程序是否还能正确运行?
答:
②处调用的是a处的函数。
去掉:
:
仍然不能正确运行。
问题三:
该程序的输出结果是什么,试解释该输出结果。
答:
原因在于该类没有定义私有成员变量。
3.试指出以下程序的错误,并改正之。
#include?
classCPoint
{
public:
unsignedx,
unsignedy;
boolIsInCircle(CCircle*Circle)
{
return(((x-Circle->Center.x)*(x-Circle->Center.x)
+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);}
};?
classCCircle
{
public:
unsignedRadius;
CPointCenter;
};?
voidmain()
{?
…}
答:
错误在于boolIsInCircle(CCircle*Circle);
修改后的程序为:
#include?
classCCircle;
classCPoint
{
friendclassCCircle();
public:
unsignedx;
unsignedy;
boolIsInCircle(CCircle*Circle)
{
return(((x-Circle->Center.x)*(x-Circle->Center.x)
+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius);}
};?
classCCircle
{
public:
unsignedRadius;
CPointCenter;
};?
voidmain()
{?
…}
4.理解下面的程序,回答后面的问题,并在vc6.0下运行查看结果。
#include?
classCPoint
{
public:
voidSet(intx,inty);
voidPrint();
private:
intx;
inty;};?
voidCPoint:
:
Set(intx,inty)
{x=x;y=y;}
voidCPoint:
:
Print()
{cout<<"x="<voidmain()
{
CPointpt;
pt.Set(10,20);
pt.Print();}
问题一:
以上程序编译能通过吗,试解释该程序?
答:
能够通过。
问题二:
以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正?
答:
不正确。
原因在于改程序中voidSet(intx,inty)的形参与函数变量重名,产生二义性。
voidSet(intx,inty)应改为voidSet(intx1,inty1);
5.理解下面的程序,回答后面的问题,并在vc6.0下运行查看结果。
#include?
classCPerson
{
public:
voidPrint();
private:
CPerson();
private:
intage;
char*name;
};?
CPerson:
:
CPerson()
{}?
voidCPerson:
:
Print()
{
cout<<"name="<}?
voidmain()
{
CPersonps(23,"张三");
ps.Print();}
问题:
以上程序存在若干错误,在不改变主函数内容的前提下,试改正该程序。
答:
修改后的程序为:
#include
classCPerson
{
public:
voidPrint();
CPerson(inta,char*b);
private:
intage;
char*name;
};
CPerson:
:
CPerson(inta,char*b)
{
age=a;
name=b;
}
voidCPerson:
:
Print()
{
cout<<"name="<}
voidmain()
{
CPersonps(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"
classfushu
{
private:
floatshibu;
floatxubu;
public:
fushu(floata,floatb);
fushu(float*a,float*b);
fushu(float&a,float&b);
voidshow(void);
~fushu(void);
};
fushu:
:
fushu(floata,floatb)//定义公共函数
{
shibu=a;
xubu=b;
}
fushu:
:
fushu(float*a,float*b)//定义参数为指针类型的函数
{
shibu=*a;
xubu=*b;
}
fushu:
:
fushu(float&a,float&b)//定义参数为引用类型的函数
{
shibu=a;
xubu=b;
}
voidfushu:
:
show(void)//私用成员的输出
{
cout<<"实部为:
"<cout<cout<<"虚部为:
"<cout<}
fushu:
:
~fushu()
{}
main()
{
floatk=1.2,n=2;
float*r=&k,*i=&n;
fushua(2.5,3);
cout<<"采用对象方式输出结果为:
"<a.show();
fushub(r,i);
cout<<"采用指针方式输出结果为:
"<b.show();
fushuc(&k,&n);
cout<<"采用引用方式输出结果为:
"<c.show();
}
2.设计实现一个CPoint类,满足以下要求:
a.该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量;
b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0;
c.可以采用直接输入参数的方式来初始化该类的成员变量;
d.可以采用其它的CPoint对象来初始化该类的成员变量;
e.设计一个主函数来测试以上功能。
四、实验结果分析
(一)、程序理解
改程序主要考察了构造函数与一般成语函数的作用,以及在定义构造函数在参数个数与参数默认的情况下的构造情况!
(二)、程序设计
见源代码.
五、实验体会
此实验让我对构造函数在参数默认以及参数个数缺省情况下的定义方法有了更深的掌握,以及对成员函数的作用有了更深刻的了解!
六、附录:
(源代码)
#include"iostream.h"
#include"stdio.h"
classCPoint
{
private:
floatx,y;
public:
CPoint(void);
CPoint(floatx1,floaty1);
modify(floatx2,floaty2);
~CPoint();
voidPrint(void);
};
CPoint:
:
CPoint()
{
x=0;
y=0;
}
CPoint:
:
CPoint(floatx1,floaty1)//默认参数函数
{
x=x1;
y=y1;
}
CPoint:
:
modify(floatx2,floaty2)//对私有成员的修改
{
x=x2;
y=y2;
}
CPoint:
:
~CPoint()
{}
voidCPoint:
:
Print(void)//输出坐标功能函数
{
cout<<"初始化后的坐标为:
("<}
voidmain(void)
{
CPointa,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"
classCstudent
{
classgrade
{
private:
intsum;
floatprocess;
floatsingal;
floatconstruct;
floataverage;
public:
grade(floata,floatb,floatc)
{
sum=0;
process=a;
singal=b;
construct=c;
average=(process+singal+construct)/3.0;
}
voidmodify(floata,floatb,floatc)//子对象值的修改传值
{
process=a;
singal=b;
construct=c;
}
voidshow()//子对象的显示
{
average=(process+singal+construct)/3.0;
cout<<"程序设计成绩为:
"<cout<<"信号处理成绩为:
"<cout<<"数据结构成绩为:
"<cout<<"学生平均成绩为:
"<if((process<60)||(singal<60)||(construct<60))
sum++;
cout<<"有不及格科目的学生数为:
"<}
};
private:
char*name;
char*number;
gradeall;
public:
Cstudent(char*name1,char*number1,floata1,floatb1,floatc1);
~Cstudent(void);
voidset(void);
voiddisplay();
};
Cstudent:
:
Cstudent(char*name1,char*number1,floata1,floatb1,floatc1):
//函数1(传入数据)
all(a1,b1,c1)
{
name=newchar[strlen(name1)+1];
strcpy(name,name1);
number=newchar[strlen(number1)+1];
strcpy(number,number1);
}
Cstudent:
:
~Cstudent(void)//函数2(释放空间)
{
delete[]name;
delete[]number;
}
voidCstudent:
:
set(void)//函数3(数据修改)
{
floatgrade1,floatgrade2,floatgrade3;
charname1[20],charnumber1[10];
cout<<"请输入学生的程序设计成绩:
"<cin>>grade1;
cout<<"请输入学生的信号处理成绩:
"<cin>>grade2;
cout<<"请输入数据结构成绩:
"<cin>>grade3;
delete[]name;
cout<<"请输入学生的姓名:
"<cin>>name1;
name=newchar[strlen(name1)+1];
strcpy(name,name1);
delete[]number;
cout<<"请输入学生的学号:
"<cin>>number1;
number=newchar[strlen(number1)+1];
strcpy(number,number1);
all.modify(grade1,grade2,grade3);
}
voidCstudent:
:
display()//函数4(数据输出)
{
cout<<"学生姓名为:
"<cout<<"学生学号为:
"<all.show();
}
voidmain()
{
chara[20],b[10];
floatgrade1,grade2,grade3;
cout<<"请输入学生的姓名:
"<cin>>a;
cout<<"请输入学生的学号:
"<cin>>b;
cout<<"请输入学生的程序设计成绩:
"<cin>>grade1;
cout<<"请输入学生的信号处理成绩:
"<