C++实验报告.docx
《C++实验报告.docx》由会员分享,可在线阅读,更多相关《C++实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
C++实验报告
实验一
1.题目
编写一个时间类,实现时间的自增、自减、读和输出。
2.编程思想
定义两个私有数据成员minute和second,在自增运算中重载运算符++,使得若时间大于60秒是minute自增1,second为(秒数-60),在这里我定义的全部是后置运算,重载运算符——也是一样。
在主函数中定义了4个Time类的对象,通过调用display()函数分别显示自增自减前和后的时间数。
3.源程序
#include
#include
usingnamespacestd;
classTime
{public:
Time(){minute=0;second=0;}//默认构造函数
Time(intm,ints):
minute(m),second(s){}//构造重载函数,用参数的初始化表对数据成员初始化
Timeoperator++(int);//声明后自增运算符"++"重载函数
Timeoperator--(int);//声明后置自减运算符“--”重载函数
voiddisplay(){cout<"<private:
intminute;
intsecond;
};
TimeTime:
:
operator++(int)//定义后置运算符“++”重载函数
{Timetemp(*this);
second++;
if(second>=60)
{second-=60;
++minute;}
returntemp;//返回的是自加前的对象
}
TimeTime:
:
operator--(int)//定义后置运算符“--”重载函数
{Timetemp(*this);
second--;
if(second<=0)
{second+=60;
--minute;
}
returntemp;//返回的是自减前的对象
}
intmain()
{
Timetime1(34,59),time2(23,00),time3,time4;
cout<<"time1:
";
time1.display();
cout<<"time3=time++"<time3=time1++;
cout<<"time3:
";
time3.display();
cout<<"time1:
";
time1.display();
cout<<"-------------------------"<cout<<"time2:
";
time2.display();
cout<<"time4=time--"<time4=time2--;
cout<<"time4:
";
time4.display();
cout<<"time2:
";
time2.display();
system("pause");
}
4.运行结果
5.问题及解决
此次实验主要是练习如何对++和--运算符进行重载,在编程过程中由于对于时间的计算运用不是很熟练导致在重载函数时输出结果不正确,经过多次修改后得出正确运行结果。
本次实验较为简单,在编程过程中未遇到较为棘手的问题。
实验二
1.题目
定义描述平面任意点坐标(X,Y)的类Point,编写一运算符重载函数,使该函数能求出平面上任意两点的距离。
在主函数中完成下列运算:
Pointp1(1,1),p2(4,5);
doubled=p1-p2;
2.编程思想
在point类中声明两个私有成员x和y,在类内定义构造函数,并在构造函数中声明运算符“-”的重载函数,然后定义运算符重载函数,用this指针指向当前值,定义一求距离的的友元函数d(),使得其能够访问point类中的私有成员,并返回两点距离值。
在主函数中通过两种方法计算平面两点的举例,一是通过运算符重载,二是通过函数调用,两者结果相同。
3.源程序
#include
#include
#include
usingnamespacestd;
classpoint
{
private:
doublex,y;//私有成员函数
public:
point(doublea,doubleb)
{
x=a;y=b;
cout<<"点:
("<doubleoperator-(pointp);
}
doublepoint:
:
operator-(pointp)
{
returnsqrt((this->x-p.x)*(this->x-p.x)+(this->y-p.y)*(this->y-p.y));
}
frienddoubled(point&a,point&b)//
{
returnsqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
};
intmain()
{
pointp1(1,1),p2(4,5);
cout<<"距离为:
"<cout<<"两点间距离:
"<system("pause");
return0;
}
4.运行结果
5.问题及解决
在本次实验中,对运算符重载的认识有进一步加深,在最初的编程过程中不知道怎样才能将计算距离的算法进行运算符重载,通过多次的尝试和学习才得知对运算符的重载其实就是在原来运算符的基础上在多加一些功能,在重载函数中将其功能实现即可。
实验三
1.题目
定义学生成绩类Score,其私有数据成员有学号、姓名、物理、数学、外语、平均成绩。
再定义一个能计算学生平均成绩的普通函数Average(),并将该普通函数定义为Score类的友元函数。
在主函数中定义学生成绩对象,通过构造函数输入除平时成绩外的其他信息,然后调用Average()函数计算平均成绩,并输出学生成绩的所有信息。
2.编程思想
在Score类的公有部分声明友元函数Average(),在类外定义构造函数,将各个数据成员初始化,并对某一学生的各信息进行输出;在类外定义一求平均成绩的函数,用于求该生各门课程的平均成绩,在主函数中声明Score的对象s并对各项进行赋初值,通过调用Average()输出平均成绩。
3.源程序
#include
#include
usingnamespacestd;
classScore
{
public:
frienddoubleAverage(Score*s);
Score(char*number,char*name,doublephysicsScore,doublemathScore,doubleenglishScore,doubleother);
private:
charm_number[100];
charm_name[100];
doublem_physicsScore;
doublem_mathScore;
doublem_englishScore;
doublem_other;
};
Score:
:
Score(char*number,char*name,doublephysicsScore,doublemathScore,doubleenglishScore,doubleother)
{
strcpy(m_number,number);
strcpy(m_name,name);
m_physicsScore=physicsScore;
m_mathScore=mathScore;
m_englishScore=englishScore;
m_other=other;
cout<<"学号:
"<cout<<"姓名:
"<cout<<"物理:
"<cout<<"数学:
"<cout<<"英语:
"<cout<<"其他:
"<}
doubleAverage(Score*s)
{
return(s->m_physicsScore+s->m_mathScore+s->m_englishScore+s->m_other)/4;
}
intmain()
{
Scores("1239902983","陈晨",80,85,90,88);
cout<<"平均成绩:
"<system("pause");
return0;
}
4.运行结果
5.问题及解决
本次实验较为困惑的地方是在对Average()函数的调用上,因为在Score类中将其声明为友元函数,所以它可以访问类中的私有成员,但在构造函数中由于对个数据成员赋初值,所以在AVerage()函数中不知道变量使用是赋值后的还是赋值钱前的,所以导致在多次调试过程中多次出错,在以后的学习中对定义的理解和掌握还得加强!
C++上机实验报告
班级:
030914
学号:
03091391
姓名:
顾娜