LHL'PTA 实验6. 类和对象综合测试

计算机科学与工程学院实验报告
课程名称 面向对象程序设计 班级 19网络1班
实验内容 实验6 指导教师 黄震
姓名 罗宏亮 学号 1914080903119 实验日期 2020.04.21

题目1
7-1 定义一个带重载构造函数的日期类 (10分)
定义一个带重载构造函数的日期类Date,数据成员有年、月、日;成员函数包括:一个带参数的构造函数Date(int,int,int),一个不带参数的构造函数,一个按“年-月-日”格式显示日期的函数,一个对数据成员赋值的函数void init(int,int,int)。 主函数中对类的测试要求:

  1. 分别使用两个不同的重载构造函数创建两个日期类对象(必须为d1,d2,d2初始值为2100-12-12);
  2. 按“年-月-日”格式分别显示两个对象的值;
  3. 从键盘输入数据,用init函数为d1赋值;
  4. 按“年-月-日”格式显示对象d1的值;
    输入格式:
    给d1赋值的数据
    输出格式:
    d1的默认值
    d2的初始值
    d1赋值后的值
    输入样例:
    2019 4 13

输出样例:
1900-1-1
2100-12-12
2019-4-13
代码清单:
#include
#include
#include
using namespace std;
class Date
{
int year,month,day;
public:
Date(int y=1900,int m=1,int d=1)
{
year=y;
month=m;
day=d;
}
void readme()
{
cout< }

};

int main()
{
int y,m,d;
cin>>y>>m>>d;
Date d1;
Date d2(2100,12,12);
Date d3(y,m,d);
d1.readme();
d2.readme();
d3.readme();
return 0;
}

运行结果截图

题目2
7-2 类的定义和使用 (20分)
定义一个日期类Date,内有数据成员年、月、日,另有成员函数:构造函数用于初始化数据成员,输出,闰年的判断。编写主函数:创建日期对象,计算并输出该日是该年的第几天。
输入:
每组测试数据仅包含一个测试用例,每个测试用例占一行包括三个数,分别表示年、月、日。
输出:
该日是该年的第几天。
输入样例:
2006 3 5

输出样例:
64 (2006年3月5日是该年的第64天)

代码清单:
#include
#include
#include
using namespace std;
class Date
{
int year,month,day;
public:
Date(int y=1900,int m=1,int d=1)
{
year=y;
month=m;
day=d;
}
void readme()
{
int sum=0;
switch(month)
{
case 1: sum = 0;break;
case 2: sum = 31;break;
case 3: sum = 59;break;
case 4: sum = 90;break;
case 5: sum = 120;break;
case 6: sum = 151;break;
case 7: sum = 181;break;
case 8: sum = 212;break;
case 9: sum = 243;break;
case 10: sum = 273;break;
case 11: sum = 304;break;
case 12: sum = 334;break;
}
if((year%40&&year%100!=0||year%4000))
{
if(month>2)
{
sum++;
}
}
sum=sum+day;
cout< }

};

int main()
{
int y,m,d;
cin>>y>>m>>d;
Date d3(y,m,d);
d3.readme();
return 0;
}

运行结果截图

题目3
7-3 定义学生类 (20分)
设计一个学生类Student。
1、成员变量包括ID(学号),Name(姓名),Age(年龄),AverageScore(平均分);
2、成员函数包括init(int,char *, int ,int)(用于数据成员的初始化),StudentBonus()(计算学生奖学金),show_information()(显示学生的全部信息,包括学号、姓名、年龄、平均分、奖学金),本例中奖学金计算方法如下:
(1)平均分不超过80分(含80分)的,奖学金为0,即没有奖学金;
(2)平均分在81—90之间的,奖学金计算公式为(平均分-80)*50;
(3)平均分在91—100之间的,奖学金计算公式为(平均分-80)*100;
(4)在主函数中,声明1个对象并利用show_information()函数显示个人全部信息。
输入样例:
1001 张三 19 89

输出样例:
学号:1001
姓名:张三
年龄:19
平均分:89
奖学金:450
代码清单:
#include
#include
#include
using namespace std;
class student
{
int ID;
string name;
int age;
int AverageScore;
public:
student(int i,string n,int a,int av)
{
name=n;
age=a;
AverageScore=av;
ID=i;
}
int StudentBonus(int AverageScore)
{
if(AverageScore<=80)
return 0;
if(AverageScore>=80&&AverageScore<=90)
return (AverageScore-80)*50;
if(AverageScore>90&&AverageScore<=100)
return (AverageScore-80)*100;
}
void show_information()
{
cout<<“学号:”< cout<<“姓名:”< cout<<“年龄:”< cout<<“平均分:”< cout<<“奖学金:”<

}

};

int main()
{
int ID;
string name;
int age;
int AverageScore;
cin>>ID>>name>>age>>AverageScore;
student s1(ID,name,age,AverageScore);
s1.show_information();
return 0;
}

}运行结果截图
7-4 设计并测试Trapezium类 (15分)
题目内容: 设计并测试一个名为Trapezium的梯形类,其属性为梯形的四个顶点的坐标。
该梯形上边和下边均和x轴平行。
根据类的封装性要求,在类的声明中用8个私有的整型变量表示4个点的坐标值,声明成员函数,其中:
initial(int,int,int,int,int,int,int,int)初始化数据成员;
函数GetPosition(int&,int&,int&,int&,int&,int&,int&,int&)读取坐标值;
函数Area()计算面积。
输入格式:
梯形四个顶点的坐标
输出格式:
梯形的面积,依次为左上(x1,y1)、右上(x2,y2)、左下(x3,y3)和右下(x4,y4)角的顶点。
输入样例:
5 3 7 3 2 -3 9 -3

输出样例:
27

代码清单:
#include
#include
#include
using namespace std;
class Trapezium
{
int X1,X2,X3,X4,Y1,Y2,Y3,Y4;
public:
Trapezium(int x1,int x2,int x3,int x4,int y1,int y2,int y3,int y4)
{
X1=x1;
X2=x2;
X3=x3;
X4=x4;
Y1=y1;
Y2=y2;
Y3=y3;
Y4=y4;

}   
void Area()
{
     
printf("%d",(X2-X1+X4-X3)*(Y2-Y4)/2);
    
}

};

int main()
{
int X1,X2,X3,X4,Y1,Y2,Y3,Y4;
cin>>X1>>Y1>>X2>>Y2>>X3>>Y3>>X4>>Y4;
Trapezium t1(X1,X2,X3,X4,Y1,Y2,Y3,Y4);
t1.Area();

return 0;   

}
运行结果截图

题目5
返回
7-5 动态生成Person类的对象 (15分)
编写Person类,数据成员为姓名(20字符长度)、年龄(int)和性别(char)。
编写无参数的构造函数,其中姓名赋值为“XXX”,年龄0,性别m;
编写析构函数,在其中输出字符串“Now destroying the instance of Person”;
编写Register成员函数,为数据成员赋值;
编写showme成员函数,显示姓名、年龄和性别。
编写主函数: 用Person类创建2个指针,p1和 p2; 用new创建两个Person对象,分别将指针赋值给p1,p2; 用showme成员函数显示p1,p2所指对象的值; 再输入一组“姓名、年龄和性别”值,用成员函数Register为p1的成员赋值; 将p1所指对象的值赋值给p2所指对象; 用showme显示p1、p2所指对象的值; 删除动态对象。
输入格式:
为p1的成员赋值时使用的数据
输出格式:
person1和person2的默认值
person1和person2的赋值后的值
析构函数输出的信息
输入样例:
mike 21 m

输出样例:
在这里给出相应的输出。例如:
person1:XXX 0 m
person2:XXX 0 m
person1:mike 21 m
person2:mike 21 m
Now destroying the instance of Person
Now destroying the instance of Person

代码清单:
#include
#include
#include
#include
using namespace std;
class Person
{
char name[100] ;
int age;
char sex;
public:
Person()
{
strcpy(name,“XXX”);
age=0;
sex=‘m’;
}
void init(char *n,int a,char s)
{
strcpy(name,n);
age=a;
sex=s;
}
~Person()
{
cout<<“Now destroying the instance of Person”< }
void showme()
{
cout< }

};
int main()
{
char name[100] ;
int age;
char sex;
Person p1,p2;
cin>>name>>age>>sex;
cout<<“person1:”;
p1.showme();
cout<<“person2:”;
p2.showme();
p1.init(name,age,sex);
p2.init(name,age,sex);
cout<<“person1:”;
p1.showme();
cout<<“person2:”;
p2.showme();
return 0;

return 0;   

}

}运行结果截图
v

题目6
7-2 Jack cheng的烦恼3 (10分)
Jack cheng在书上遇到一道编程题,可他不会做,没办法,他只好向你求助。题目要求判断给出的一个数是否为“真素数”。真素数的定义为:自身为素数,且自身各位数之和仍为素数。例如,11为素数,1+1=2也为素数,所以11为真素数。
输入格式:
输入在一行中给出需要判断的数n.
输出格式:
如果n为真素数,则输出“yes”,否则输出“no”。
输入样例:
11

输出样例:
yes

代码清单:
#include
#include
#include
#include
using namespace std;
int add(int a,int b,int c)
{
return a+b+c;
}

int add (int a)
{
return 50+a;
}
int add(int a,int b)
{
return 30+a+b;
}
int prime(int n){
int i;
if(n<=1) return 0;
for(i=2;i if(n%i==0) return 0;
return 1;
}

struct student
{
char name[100];
int hx;
int mb;
}s[1000];
int main()
{
int n,m,j,i,k,l,t,s=0;
cin>>n;
if(prime(n))
{
m=n;
while(n)
{
t=n%10;
s=s+t;
n=n/10;
}
if(prime(s))
{
printf(“yes”);
return 0;
}

}
printf("no");
return 0;

}
运行结果截图

题目7
7-6 宿舍谁最高? (20分)
学校选拔篮球队员,每间宿舍最多有4个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类Student,有身高height,体重weight等。
输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。
输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。
输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115

输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145
代码清单:
#include
#include
#include
#include
using namespace std;
class student
{ public:
int number;
char name[100];
int height,weight;

void init(int num,char* n,int h,int w)
{
number=num;
strcpy(name,n);
height=h;
weight=w;
}
void showme()
{
printf("%06d",number);
cout<<’ ‘< }

};
int max1[1000000]={0},mh[10000000]={0};
student s[1000001];
int main()
{

int m;
int h,w;
cin>>m;
int i;
int num;
char name[100];
for(i=0;i

{
cin>>num>>name>>w>>h;
s[i].init(num,name,w,h);

}
for(i=0;i<10000000;i++)
{
mh[i]=-1;
}
for(i=0;i<1000000;i++)
{

for(int j=0;j {
if(s[j].number==i)
{
if(s[j].height>max1[i])
{
max1[i]=s[j].height;
mh[i]=j;
}

}

}

}
for(i=0;i<1000000;i++)
{
if(mh[i]==-1) continue;
s[mh[i]].showme();
}

return 0;
}

运行结果截图

实验心得和体会
第1题体会:这一题需要初始化,可以用init来初始化,也可以用Date头部初始化,个人觉得date头部初始化比较简单,Date(int y=1900,int m=1,int d=1)
{
year=y;
month=m;
day=d;
}

第2题体会: 这题可以承接上一题的代码只不过需要判断闰年和各月 的天数,可以被4整除但不可以被100整除或者可以被400整除,为闰年,月份需要定义一个case 分类讨论天数,如果闰年且月份大于2月则day++,即可
第3题体会: 一开始没有看清题意,以为给出4点求梯形面积,想了半天,没想出公式,最后重新看了一下题,原来上下边都与x轴平行,这就简单多了,
上底加下底乘以高/2即可;
第4题体会:这题需要先输出初始值,再输出赋完值的值,最后输出析构函数的值,新出现的析构函数中,写入一行Now destroying the instance of Person即可

第5题体会: 这是所有题中最难的一题,最开始我是从0,遍历到输入的宿舍号,结果验证了一下,没有错,但是提交没有一个点是对的,百思不得其解,之后问了一下老师,才恍然大悟,原来是我遍历的次数不够,比如说,我输入7,代表我要输入的个数,但是在我输入的个数中,不一定的依次增加的,可能是1234567,也可能是从1000000开始,再到后7个数,用户的输入是没有规律的,所有用从0,一直遍历到100000,这为宿舍号,然后定义一个数组,存储每个宿舍最高人的数,在定义一个数组,把初始值定为-1,存储每个宿舍最高人的信息,如果遍历的人大于这个最大值,则把这个的信息存到数组里去,最后遍历宿舍号,如果数组不为-1.则输出最高人的信息,即可

你可能感兴趣的:(LHL'PTA)