bupt信通院上机第一学期实验五(39-42) 类与对象

方法论

【1】当出现错误时,把代码分解为一个个部分,大胆猜测是哪部分代码的哪里出了问题,再进行验证:
(1)代值验证
(2)设断点,一步步验证

实验39 矩形类

题目描述

定义一个矩形类,长和宽是它的属性,可以求出矩形的面积。
定义一个比较函数,比较两个矩形的面积,把面积大的矩形对象作为引用来返回。
主函数中定义两个矩形,它们的长、宽已知,分别为矩形1:长5.2、宽4.3,矩形2:长100、宽20。再由键盘输入一个矩形的长、宽。调用比较函数进行比较,找出面积大的矩形,输出其面积。
输入:10 8
输出:2000

思路

(1)先定义一个类,根据要求设定好成员数据和函数;
(2)在定义一个以对象引用为返回值和形参的函数:如果对象1的函数计算结果大于对象2,则返回对象1

程序化

【1】如何根据对象的函数(数据操作)结果大小,来找出该对象,并输出对象函数结果 -->

Rectangle& compare(Rectangle& r1, Rectangle& r2)
{
	if (r1.S() > r2.S())
		return r1;
	else
		return r2;
		。。。。。。
	Rectangle& maxR = compare(rect1, compare(rect2, rect3));
	cout << maxR.S() << endl;

代码

#include<iostream>
using namespace std;
//定义一个类:数据成员:矩形边长;
//成员函数:<1>给对象的数据成员初始化的构造函数或其他成员函数;<2>计算面积的成员函数
class Rectangle {
private:
	float a, b;
public:
	void setshape(float newA, float newB)
	{
		a = newA; b = newB;
	}
	float S() { return a * b; }
};
//定义一个以对象引用为返回值和形参的函数:如果对象1的函数计算结果大于,则返回对象1
Rectangle& compare(Rectangle& r1, Rectangle& r2)
{
	if (r1.S() > r2.S())
		return r1;
	else
		return r2;
}
int main() {
	//主函数中定义三个对象并初始化
	Rectangle rect1, rect2, rect3;
	rect1.setshape(5.2, 4.3);
	rect2.setshape(100, 20);
	float c, d;
	cin >> c >> d;
	rect3.setshape(c, d);
	//定义一个对像引用并将比较函数的返回值(对象引用)赋给它,并输出该对象的操作结果
	Rectangle& maxR = compare(rect1, compare(rect2, rect3));
	cout << maxR.S() << endl;
	return 0;
}

实验40 三角类

题目描述

定义一个Triangle三角形类,包括数据成员三边边长(int类型)、判断三角形形状的成员函数。键盘输入三角形三边边长,判断此三角形形状(其中,等腰直角三角形归为等腰三角形类)。
构成等边三角形,输出“A equileteral triangle”;
构成等腰三角形,输出“A isosceles triangle”;
构成直角三角形,输出“A right triangle”;
构成三角形,但不是以上三种,则输出“A triangle”;
不构成,输出“Not a triangle”。
输入:3 4 5
输出:A right triangle

思路

(1)先定义一个类:数据成员:三边;
成员函数:初始化数据成员并排序;根据三边关系判断并输出三角形类型;
(2)定义并输入三边,将其作为构造函数实参来初始化定义的对象;
(3)调用判定函数

程序化

【1】类中数据成员与成员函数的关系–>
(1)有数据成员,就相当于这个“变量”已经被定义了,不管其在前or在后;
(2)成员函数中不必再定义这些变量
【2】(易错点)给数据排序之后就不能将其作为参数传参了,因为这样排序就没用了–>
解决方法:(1)把数据排序的代码放在函数里;
(2)函数不要参数,变量放在外面定义和排序。

错误示范

#include<iostream>
#include<cmath>
using namespace std;
class Triangle {
private:
	int x,y,z;
public:
	Triangle(int a, int b, int c) {
		x = max(a, max(b, c));
		y = min(a, min(b, c));
		z = a + b + c - x - y;
	}
	void shape(int x,int y,int z) {
		if (!(y+z>x&&x-z<y))
			cout << "Not a triangle";
		else if (x==y)
			cout << "A equileteral triangle";
		else if (x==z||y==z)
			cout << "A isosceles triangle";
		else if (x*x==y*y+z*z)
			cout << "A right triangle";
		else
			cout << "A triangle";
	}
};
int main() {
	int d, e, f;
	cin >> d >> e >> f;
	Triangle A(d,e,f);
	A.shape(d,e,f);
	return 0;
}

错因:shape如果传参的话参数还是输入的顺序,并不是排序之后的顺序,因此不能传参 -->
解决:(1)shape函数不要参数;
(2)把构造函数中的排序代码放到shape函数里;或者干脆不要shape函数,把判断形状的代码都放到构造函数里

代码

(1)

#include<iostream>
#include<cmath>
using namespace std;
class Triangle {
private:
	int x,y,z;
public:
	Triangle(int a,int b,int c) {
		x = max(a, max(b, c));
		y = min(a, min(b, c));
		z = a + b + c - x - y;
	}
	void shape() {
		if (!(y+z>x&&x-z<y))
			cout << "Not a triangle";
		else if (x==y)
			cout << "A equileteral triangle";
		else if (x==z||y==z)
			cout << "A isosceles triangle";
		else if (x*x==y*y+z*z)
			cout << "A right triangle";
		else
			cout << "A triangle";
	}
};
int main() {
	int d, e, f;
	cin >> d >> e >> f;
	Triangle A(d,e,f);
	A.shape();
	return 0;
}

(2)

#include<iostream>
#include<cmath>
using namespace std;
class Triangle {
private:
	int x,y,z;
public:
	Triangle() {
		
	}
	void shape(int a, int b, int c) {
		x = max(a, max(b, c));
		y = min(a, min(b, c));
		z = a + b + c - x - y;
		if (!(y+z>x&&x-z<y))
			cout << "Not a triangle";
		else if (x==y)
			cout << "A equileteral triangle";
		else if (x==z||y==z)
			cout << "A isosceles triangle";
		else if (x*x==y*y+z*z)
			cout << "A right triangle";
		else
			cout << "A triangle";
	}
};
int main() {
	int d, e, f;
	cin >> d >> e >> f;
	Triangle A(d,e,f);
	A.shape(d,e,f);
	return 0;
}

(3)

#include<iostream>
#include<cmath>
using namespace std;
class Triangle {
private:
	int x,y,z;
public:
	Triangle(int a, int b, int c) {
		x = max(a, max(b, c));
		y = min(a, min(b, c));
		z = a + b + c - x - y;
		if (!(y+z>x&&x-z<y))
			cout << "Not a triangle";
		else if (x==y)
			cout << "A equileteral triangle";
		else if (x==z||y==z)
			cout << "A isosceles triangle";
		else if (x*x==y*y+z*z)
			cout << "A right triangle";
		else
			cout << "A triangle";
	}
};
int main() {
	int d, e, f;
	cin >> d >> e >> f;
	Triangle A(d,e,f);
	return 0;
}

实验41 时间类

题目描述

定义一个时间类,数据成员包括年、月、日,它的函数成员分别可以设置时间、显示时间,其中显示时间的函数,使用重载函数定义,遇到整型数值,则返回2017-5-30的格式,遇到浮点型数值,则输出2017年5月30日的格式。
输入:2017 5 30 1.1
输出:2017年5月30日

思路

(1)先定义一个对象;
(2)从键盘输入四个数,判断第四个数是否为浮点数,
(3)定义一个对象,并根据判断结果调用不同成员函数

程序化

【1】常用必会操作(程序化代码)–>
根据要求会定义一个类,并在主函数中用其定义对象:
(1)要有 重载函数 来初始化对象;
(2)还有其他成员函数:两个重载函数(因形参类型构成重载)(在实际调用时根据实参的类型来调用不同重载函数)
(3)public属性中成员函数所涉及的数据都放在private属性里(不需要直接外部访问的话)
(4) 一般数据成员都放在private属性里,如果要访问的话可以在public里定义一个成员函数来访问(此时就是在类的内部了);
(5)格式易错:类的定义完时记得在}后加 ;

【2】判断一个数是浮点数还是整型数的代码,
并将整个字符串是否的结果转换为k的数值,以便后面以此作为条件用条件结构来启用不同代码(来调用不同重载函数)[常规操作] -->

string s;
	int k=0;
	cin >> a >> b >> c >> s;
	int len = s.length();//int len=sizeof(s);或 int len=strlen(s);
	//s[i]可表示字符串中的每一个字符(用循环结构遍历就行)
	//循环结构遍历看看第四个数中有没有小数点,并将有无转化为k的值,以便后面条件语句判定执行哪个成员函数
	for (int i = 0; i < len; i++) {
		if (s[i] == '.')k = 1;
	}

代码

#include<iostream>
//可写可不写  #include<cstdio>
using namespace std;
//首先定义一个类:(1)要有 重载函数 来初始化对象;
//(2)还有其他成员函数:两个重载函数(因形参类型构成重载)
//(3)public属性中成员函数所涉及的数据都放在private属性里(不需要直接外部访问的话)
//一般数据成员都放在private属性里,如果要访问的话可以在public里定义一个成员函数来访问(此时就是在类的内部了)
class Time {
public:
	Time(int x, int y, int z) { year = x; month = y; day = z; };
	//在实际调用时根据实参的类型来调用不同重载函数
	void show(int flag) {
		//printf 用于输出时确实好用(相比之下cout只能一个一个输出)
		printf("%d-%d-%d", year, month, day);}
	void show(double flag) {
		printf("%d年%d月%d日", year, month, day);
	}
private:
	int year, month, day;
};//类的定义完时记得在}后加 ;
int main() {
	int a, b, c;
	//第四个数设成字符串,以便通过判断其中有无小数点来判断其是否为浮点数
	string s;
	int k=0;
	cin >> a >> b >> c >> s;
	int len = s.length();//int len=sizeof(s);或 int len=strlen(s);
	//s[i]可表示字符串中的每一个字符(用循环结构遍历就行)
	//循环结构遍历看看第四个数中有没有小数点,并将有无转化为k的值,以便后面条件语句判定执行哪个成员函数
	for (int i = 0; i < len; i++) {
		if (s[i] == '.')k = 1;
	}
	//主函数中定义对象 am 并调用构造函数初始化
	Time am(a, b, c);
	//
	if (k)am.show(1.0);
	else am.show(1);
	return 0;
}

实验42 员工薪金管理类(对象数组)

题目描述

设计雇员Employee类,包含雇员的情况,工号、姓名、工资等级(每月工资数,整型数值)、受雇时间(年、月、日)。
编写程序测试Employee类。要求输入任意员工工号,及当前日期(年、月,此日期应晚于受雇时间),输出该员工姓名接应得到的工资总额,中间用空格隔开。
已知当前所有员工信息如下:
1,“wang”,5000,2000,10,23
2,“liu”,4500,2008,1,20
3,“huo”,3800,2003,7,3
4,“ma”,5300,2015,4,10
5,“meng”,6000,2016,3,16
输入:5 2016 5
输出:meng 12000

思路

(1)先定义一个类:一个构造函数(用于给数据成员初始化);其他成员函数:形参为输入的数据类,计算工资;输出计算结果(两者可以为一个)。
数据成员:每个对象的数据。
(2)在主函数中用类定义一个对象数组(数组元素为对象),并调用构造函数给每个数组元素对象初始化。
(3)从键盘输入数据,根据数据调用不同对象的成员函数进行计算并输出

程序化

【1】如何定义一个对象数组并给每个对象初始化–>

staff a[5] = { staff(1,"wang",5000,2000,10,23),
				  staff(2,"liu",4500,2008,1,20),
				  staff(3,"huo",3800,2003,7,3),
				  staff(4,"ma",5300,2015,4,10),
				  staff(5,"meng",6000,2016,3,16) };

【2】同一类的不同对象 -->
用对象数组。

代码

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
//定义一个类
//构造函数给数据成员赋值;计算工资、输出的其他成员函数
//数据成员:每个员工的数据
class staff
{
public:
	staff(int id, string s, int money, int y, int m, int d);
	void payoff(int y, int r) {
		num = (y - eyear) * 12 + (r - emonth);
		num *= salary;
	}
	void print() {
		cout << name << " ";
		cout << num << endl;
	}
private:
	string name;
	int ID;
	int salary;
	int eyear, emonth, eday;
	int num;
};
//成员函数的函数体可以一开始就写在类里,也可写在类外(此时注意格式)
staff::staff(int id, string s, int money, int y, int m, int d) {
	ID = id; name = s; salary = money;
	eyear = y, emonth = m, eday = d;
}

int main() {
	//主函数中用类定义成员数组
	//并调用构造函数给成员数组初始化
	staff a[5] = { staff(1,"wang",5000,2000,10,23),
				  staff(2,"liu",4500,2008,1,20),
				  staff(3,"huo",3800,2003,7,3),
				  staff(4,"ma",5300,2015,4,10),
				  staff(5,"meng",6000,2016,3,16) };
	//从键盘输入数据,并调用数组元素对象计算
	int i, y, m;
	cin >> i >> y >> m;
	a[i - 1].payoff(y, m);
	a[i - 1].print();
	return 0;
}

(码字不易,拆分讲解知识点更不易,你的关注和点赞是对我的最大支持与鼓励)

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值