计算机科学与工程学院实验报告
课程名称 面向对象程序设计 班级 19网络1班
实验内容 实验6 指导教师 黄震
姓名 罗宏亮 学号 1914080903119 实验日期 2020.04.21
题目1
7-1 定义一个带重载构造函数的日期类 (10分)
定义一个带重载构造函数的日期类Date,数据成员有年、月、日;成员函数包括:一个带参数的构造函数Date(int,int,int),一个不带参数的构造函数,一个按“年-月-日”格式显示日期的函数,一个对数据成员赋值的函数void init(int,int,int)。 主函数中对类的测试要求:
输出样例:
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
输出样例: }; int main() }运行结果截图 输出样例: 代码清单: }; int main() } 题目5 输出样例: 代码清单: }; } }运行结果截图 题目6 输出样例: 代码清单: int add (int a) struct student } 题目7 输出样例: void init(int num,char* n,int h,int w) }; { } for(int j=0;j } } } return 0; 运行结果截图 实验心得和体会 第2题体会: 这题可以承接上一题的代码只不过需要判断闰年和各月 的天数,可以被4整除但不可以被100整除或者可以被400整除,为闰年,月份需要定义一个case 分类讨论天数,如果闰年且月份大于2月则day++,即可 第5题体会: 这是所有题中最难的一题,最开始我是从0,遍历到输入的宿舍号,结果验证了一下,没有错,但是提交没有一个点是对的,百思不得其解,之后问了一下老师,才恍然大悟,原来是我遍历的次数不够,比如说,我输入7,代表我要输入的个数,但是在我输入的个数中,不一定的依次增加的,可能是1234567,也可能是从1000000开始,再到后7个数,用户的输入是没有规律的,所有用从0,一直遍历到100000,这为宿舍号,然后定义一个数组,存储每个宿舍最高人的数,在定义一个数组,把初始值定为-1,存储每个宿舍最高人的信息,如果遍历的人大于这个最大值,则把这个的信息存到数组里去,最后遍历宿舍号,如果数组不为-1.则输出最高人的信息,即可
学号: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<<“学号:”<}
{
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 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;
运行结果截图
返回
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
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;
}
{
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
return 1;
}
{
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-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;
{
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++)
{
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();
}
}
第1题体会:这一题需要初始化,可以用init来初始化,也可以用Date头部初始化,个人觉得date头部初始化比较简单,Date(int y=1900,int m=1,int d=1)
{
year=y;
month=m;
day=d;
}
第3题体会: 一开始没有看清题意,以为给出4点求梯形面积,想了半天,没想出公式,最后重新看了一下题,原来上下边都与x轴平行,这就简单多了,
上底加下底乘以高/2即可;
第4题体会:这题需要先输出初始值,再输出赋完值的值,最后输出析构函数的值,新出现的析构函数中,写入一行Now destroying the instance of Person即可