1. 程式人生 > >C++_Operator Overloading(運算子過載 | 計算有理數的加減乘除)

C++_Operator Overloading(運算子過載 | 計算有理數的加減乘除)

// OperatorT.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>

//運算子的過載 
//計算有理數rational的 + - * /

class Rational
{
public:
	Rational();//建構函式初始化
	Rational(int numer, int denom);
	Rational operator +(Rational  d);// 
	Rational operator -(Rational  d);
	Rational operator *(Rational  d);
	Rational operator /(Rational  d);

	void print();
private:
	friend std::ostream &operator<<(std::ostream &os, Rational f);
	//友元函式用friend宣告,可以訪問類中的私有變數

	void normalize();//對分數簡化處理
	int nu;
	int de;
};
Rational::Rational()
{
	nu = 0;
	de = 0;
}
Rational::Rational(int numer, int denom)
{
	nu = numer;
	de = denom;
	normalize();//簡化
}
Rational Rational::operator +(Rational  d)
{
	Rational r;
	r.nu = nu *d.de + de*d.nu;
	r.de = de * d.de;
	return r;
}

Rational Rational::operator-(Rational  d)
{
	//Rational r;
	//r.nu = nu *d.de - de*d.nu;
	//r.de = de * d.de;
	//return r;

	d.nu = -d.nu;
	return operator +(d);
}

Rational Rational::operator*(Rational  d)
{
	Rational r;
	r.nu = nu * d.nu;
	r.de = de * d.de;
	return r;
}
Rational Rational::operator/(Rational   d)
{
	//Rational r;
	//r.nu = nu * d.de;
	//r.de = de * d.nu;
	//return r;

	int temp;
	temp = d.nu;
	d.nu = d.de;
	d.de = temp;
	return operator*(d);
}
void Rational::print()
{
	normalize();
	if (nu%de == 0)
	{
		std::cout << nu / de << std::endl; //<< "\n" << "\n"
	}
	else
	{
		std::cout << nu << "/" << de  << std::endl;
	}
}
//對分數的簡化處理
//1.分母為正
//2.歐幾里得演算法對分數進行化簡
void Rational::normalize()
{
	if (de < 0)//分母小於0,分子分母都取負
	{
		nu = -nu;
		de = -de;
	}

	int a = abs(nu);
	int b = abs(de);
	while (b > 0)   //好!
	{
		int t = a%b;
		a = b;//被除數變除數,餘數變被除數...迴圈..直到餘數為0
		b = t;
	}
	nu /= a;
	de /= a;
}
//使用前先宣告 // 對 << 進行過載
std::ostream & operator<<(std::ostream & os, Rational f);
int main()
{
	Rational r1(-3, 5), r2(-6, -9);
	Rational r3, r4, r5, r6;

	r3 = r1 + r2;
	r4 = r1 - r2;
	r5 = r1 * r2;
	r6 = r1 / r2;

	std::cout << "Src: "<<"\n";
	std::cout << "r1= "; r1.print();
	std::cout << "r2= "; r2.print();

	std::cout << "Result: "<<"\n";
	//std::cout << "r3= "; r3.print();
	//std::cout << "r4= "; r4.print();
	//std::cout << "r5= "; r5.print();
	//std::cout << "r6= "; r6.print();//

	//對<<過載 應用
	std::cout <<"("<< r1 <<")"<< " + " <<"("<< r2  <<")"<< " = " << r1 + r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " - " << "("<< r2  <<")"<< " = " << r1 - r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " * " << "("<< r2  <<")"<< " = " << r1 * r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " / " << "("<< r2  <<")" << " = " << r1 / r2 << std::endl;

	system("pause");
	return 0;
}
// 對 << 進行過載的實現
std::ostream & operator<<(std::ostream & os, Rational f)
{
	Rational f1 = f;
	f1.normalize();
	os << f1.nu << "/" << f1.de;
	return os;
}

相關推薦

C++_Operator Overloading(運算子過載 | 計算有理數乘除)

// OperatorT.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> //運算子的過載 //計算有理數rational的 + - * / class Rational {

c-1:位運算:實現整數的乘除四則運算

首先回憶計算機組成原理學過的內容,數字在機器ALU運算邏輯單元內部是以補碼形式進行運算的,因為補碼有兩個優勢:1、能做到符號位和數值部分一起運算,這樣無需單獨考慮符號。2、能把減法運算轉化為加法運算來處理。3、補碼的沒有正0和負0之分,所以表示範圍比原碼和反碼多1個。問題一: 位運算實現加法不管是十進位制加法

已解決求一個計算l乘除的mysq自定義函式

php排序1億個QQ號碼匆忙之間一個猥瑣的刺客一個強行隱身的消失技能後就打算逃離誰知道他距離我實在太近我的等級早就可以把他偵測到了於是很不客氣的一揚石錐php排序1億個QQ號碼匆忙之間一個猥瑣的刺客一個強行隱身的消失技能

shell數值計算乘除

shell 包含三個命令:bc、expr、let可用於數值計算。 輸入:整數,let和expr都無法進行浮點運算,但是bc和awk可以。 輸出:bc、expr可直接顯示計算結果;let則丟棄計算結果,可通過傳遞結果到變數,取變數值獲得計算結果。 格式示例: bc  [[

大數乘除---C++運算子過載

#include <iostream> #include <typeinfo> #include <string> #include <vector> #include <iterator> using namespace std; tem

《隨筆二十二》—— C++中的“ 運算子過載

目錄 前言 過載運算子的兩種形式 運算子成員函式  和 運算子友元函式的比較 前言 ● 為什麼要對運算子進行過載: C++預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別是沒有辦法操作的。但是大多時候我們需

C++ 簡單的運算子過載小練習

#include <iostream> #include <string> #include <sstream> using namespace std; class MyShape { protected: int R_, G_, B

9.3分數類中的運算子過載,完成分數的乘除

/* * Copyright (c) 2014, 煙臺大學計算機學院 * All rights reserved. * 作 者:王穎 * 完成日期:2014 年 4 月 14 日 * 版 本 號:v1.0 * 輸入描述: 無 * 問題描述:分數類中的運算子過載,在分數

C++實現有理數乘除

C++上機題,題目如下: 設計一個有理數類,要求如下: 有理數有整數型別的分子、分母組成,通過運算子過載,完成有理數的加、減、乘、除運算,運算結果要求為最簡分數,即分子分母沒有公約數。在主程式中測試類與方法。 不多廢話,完整程式碼我已經貼出來了,註釋也很詳

C++ 輸入輸出運算子過載 感想

在C++中,經常會對輸入輸出運算子進行過載,而在過載的時候用到了友元(Friends)和引用返回(Returning References),這裡對為什麼會這麼用發表一些思考。 比如,下面的類是一個簡單的Student類,其中過載了<<和>&

【演算法】位元位計算(A+B Problem)-位運算子介紹、位運算實現乘除

問題描述 問題:計算A+B,不適用“+”運算子(LintCode 1.A + B Problem) 注意:A B均為32位整數,可使用位元位計算 解決思路 演算法示例 程式碼如下:(通過LintCode測試) class Solution

2015年大一下第6周專案3-分數類中的運算子過載(2)分數與整數的乘除

/* *Copyright (c) 2014,煙臺大學計算機學院 *All rights reserved. *檔名稱:Annpion.cpp *作者:王耀鵬 *完成日期:2015年4月29日 *版本號:v1.0 * *問題描述:在(1)的基礎上,實現分數類中的物件和整型數

C++賦值運算子過載函式(operator=)

  由於對c++的過載符號一直不是很理解,此處參閱一些資料給出比較詳細的解釋,方便讀者以及自己查閱。 此處有更詳細的解釋,但是其中關於 a = b = c執行順序的解釋不正確! 例1 #include<iostream> #include&

C++實現一個有理數類,包括大小比較,有理數乘除。測試你的類。

//實現一個有理數類,包括大小比較,有理數的加減乘除。測試你的類。 #include <iostream> #include <stdlib.h> class Rational { public: Rational(int nu

c++ static、運算子過載

1.static 靜態資料成員靜態成員函式 使用場景: 即使不例項化物件,靜態成員iCount的值始終在記憶體中存在。 普通資料成員則不會。 靜態成員不依賴物件的例項化,它的例項化必須單獨進行

C++中的運算子過載-1

Opencv學堂 http://mp.weixin.qq.com/s?__biz=MzA4MDExMDEyMw==&mid=100000109&idx=1&sn=7540b49e869c3e27f87c84f6f3dfe9a8&chksm

運算子過載 乘除

#include <iostream> using namespace std;//運算子的過載 class A { public: A(int x) {

C++ 下標運算子 過載

我們常用下標運算子operator[]來訪問陣列中的某個元素.它是一個雙目運算子,第一個運算子是陣列名,第二個運算子是陣列下標.在類物件中,我們可以過載下標運算子,用它來定義相應物件的下標運算. 注意,C++不允許把下標運算子函式作為外部函式來定義,它只能是非靜態的成員函式

c++ -> 後置++運算子過載(單目運算子

我們知道一個數 a 實現自增1的方式有兩種: 1. a++        2. ++a同樣的如果像把它應用到c++運算子過載裡面,實現類的某些屬性的自增1操作,也應該有兩種形式之前我已經給過實現前置++運算子過載的方法了,沒看過的小夥伴可以戳這裡當我們想要實現後置++運算子的

C++基礎】----運算子過載(01)

一方面,在C++中,運算子過載( operator overloading)允許把標準運算子(如+  -  *  /  % 等)應用於自定義資料型別的物件。 這樣可以直觀自然地看出自定義資料型別間的運算,並且提高程式的可讀性。 另一方面,運算子過載僅僅是一種語法上的方便。