方法论
【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;
}
(码字不易,拆分讲解知识点更不易,你的关注和点赞是对我的最大支持与鼓励)