【C++实验】类和对象(两个分数相加并且化简)

这篇博客介绍了面向对象编程中的构造函数和析构函数,以及如何通过类来实现分数的相加。文章提供了一个分数类`Fract`的实现,包括构造函数、求最大公约数的方法、分数相加并化简的方法和显示分数的方法。通过实例展示了如何创建分数对象并执行加法操作,最后显示了相加后的结果11/20。
摘要由CSDN通过智能技术生成

类和对象进一步讨论

  • 面向对象程序设计中的几个名词:
    st1是对象
    display()是方法
    st1.dispaly()是消息

  • 构造函数:对类的成员进行初始化(为对象分配内存)
    带参数/使用默认参数的构造函数
    参数初始化表,更加简洁
    构造函数的重载
    构造函数的函数名必须与类名相同;没有类型与返回值;参数可带可不带

  • 析构函数 :释放对象占用的内存空间
    局部自动对象:每次调用对象所在函数同时调用构造函数,在其所在函数结束时调用解析函数
    静态局部对象:调用对象所在函数时调用构造函数,在主程序结束时调用析构函数

  • 先构造的后析构,后构造的先析构
    (相当于一个栈,先进后出,后进先出)

  • 对象数组

  • 对象指针 *p与p–>相同
    指向对象的指针
    int *p1=&t1.hour;
    指向对象成员的指针
    void(Time::*p3)=&Time::get_time;
    this指针(隐式使用):在调用成员函数时,把对象的地址作为实参传递给this指针

实验内容

分数相加,两个分数分别是 1/5 和 7/20,它们相加后得 11/20。
方法是先求出两个分数分母的最小公倍数,通分后,再求两个分子的和,最后约简结果分数的分子和分母,即用分子分母的最大公约数分别除分子和分母。
求m、n最大公约数的一种方法为:将m、n较小的一个数赋给变量k,然后分别用(k,k-1,k-2…1)中的数(递减)去除m和n,第一个能把m和n同时除尽的数就是m和n的最大公约数。
假定m、n的最大公约数是v,则它们的最小公倍数就是m*n/v。
试建立一个分数类Fract,完成两个分数相加的功能。具体要求如下:
(1)私有数据成员
int num, den : num为分子,den为分母。
(2)公有成员函数
Fract(int a=0,int b=1):构造函数,用a和b分别初始化分子num、分母den。
int ged (int m, intn);求m、n的最大公约数。此函数供成员add)函数调用。
Fract add (Fract f):将参数分数f与对象自身相加,返回约简后的分数对象。
void show():按照num/den的形式在屏幕上显示分数。
(3)在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add完
成f1和f2的相加,将得到的分数赋给对象f3,显示分数对象f3。

代码展示

#include <iostream>
using namespace std;
class Fract
{
	int num,den;   //num分子,den分母 
	public:
	Fract(int a=0, int b=1) //构造函数赋初始值
	{num=a;den=b;}
	int ged(int m, int n);   //求最大公约数
	Fract add(Fract f);  //分数相加并化简
	void show()
	{cout<<num<<"/"<<den<<endl;}
};  
//注意类的定义最后要带分号

int main()
{
	Fract f1(1,5);
	Fract f2(7,20);
	Fract f3;
	f3=f1.add(f2);
	f3.show();
	return 0;
}



int Fract::ged(int m, int n) 
{
	int k;
	if (m>n)
		k = n;
	else
		k = m;
	for(;k>0;k--)  
	{
		if ((m%k==0)&&(n%k==0))
		break;
	}
	return k;	
}

Fract Fract::add(Fract f) 
{
	Fract f4;
	int a,b;
	
	//den在C++被执行时为this—>den
	a = (den*f.den)/ged(den,f.den);  
	//求两分数分母的最小公倍数 a=m*n/k(k是m、n的最大公约数) 

	//通分
	f4.den=a;   //分母直接用最小公倍数替换
	f4.num=(a/den)*num + (a/f.den)*f.num;  //分子为两分子分别乘相应倍数后相加 
	
	//约分 
	b = ged(f4.num,f4.den);  //通分相加后,分子分母的最大公约数 
	f4.num=f4.num/b;   
	f4.den=f4.den/b;
	
	return f4;
}

输出结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值