1. 程式人生 > >作業11: 類_運算子過載

作業11: 類_運算子過載

作業11:  類_運算子過載

1.設向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),則它們之間的加、減和積分別定義為:

X + Y = ( x1 + y1 , x2 + y2 , x3 + y3 )

X - Y = ( x1 - y1 , x2 - y2 , x3 - y3 )

X * Y = x1 * y1 + x2 * y2 + x3 * y3

程式設計序定義向量類vector,過載運算子“+”、“-”、“*”和“=”,實現向量之間的加、減、乘和賦值運算。用過載運算子“>>”、“<<”做向量的輸入/輸出操作。

2.定義一個類nauticalmile_kilometer,它包含兩個資料成員kilometer(千米)和meter(米)。還包含一個建構函式對資料成員初始化;成員函式print用於輸出資料成員kilometer和meter的值;型別轉換函式double()實現把千米和米轉換為海里(1海里=1.852千米)。編寫main函式,測試類nauticalmile_kilometer。

3.教材p343頁第3小題。

  定義一個複數類Complex,過載運算子“+”,使之能用於複數的加法運算。參加運算的兩個運算量可以都是類物件,也可以其中有一個是整數,順序任意。例如:c1+c2, i+c1, c1+i , 均合法(設i為整數,c1,c2 為複數)。程式設計序,分別求兩個複數之和、整數和複數之和。

/************************************** 作業五 第1題  **************************************** 
1.設向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),則它們之間的加、減和積分別定義為:
X + Y = ( x1 + y1 , x2 + y2 , x3 + y3 ) 
X - Y = ( x1 - y1 , x2 - y2 , x3 - y3 )
X * Y = x1 * y1 + x2 * y2 + x3 * y3
程式設計序定義向量類vvector, 過載運算子"+"、"-" 、"*"和"=",實現向量之間的加、減、乘和賦值運算。
用過載運算子">>"、"<<"做向量的輸入/輸出操作。
**********************************************************************************************/

// H5t1.cpp
#include <iostream>
#include <string>
using namespace std;
#include "vvector.h"

int main()
{
	vvector first;
	vvector second;
	char choice;
	// 定義string的menu時,=後面的內容直接用雙引號“” 
	string menu = "————————————\n"
					 "| 請選擇想要執行的運算 |\n"
					 "|  1.兩向量間的加法    |\n"
					 "|  2.兩向量間的減法    |\n"
					 "|  3.兩向量間的乘法    |\n"
					 "|  4.我需要退出系統    |\n"
					 "————————————\n"
					 "我的選擇是:";	
// strart to do-while circulate
	do			// do-while 迴圈裡面,需要用{},在while後,得加上分號; 
	{
	
	cout << menu;

enteragain:		//此處定位,用於重新輸入

	cin >> choice;
	cout << endl;
	
	switch(choice)
	{
		case '1':
				{
		 		    cout << "第一個向量:" << endl;
					cin >> first;
					cout << "第二個向量:" << endl;
					cin >> second;
					cout << (first + second);
					break;
				}

		case '2':
				{
    			    cout << "第一個向量:" << endl;
					cin >> first;
					cout << "第二個向量:" << endl;
					cin >> second;
					cout << (first - second);
					break;
				}
		case '3': 
				{
					cout << "第一個向量:" << endl;
					cin >> first;
					cout << "第二個向量:" << endl;
					cin >> second;
					cout << (first * second);
					break;
				}
		case '4': break;
		default: 
				{
					cout << "\n你的輸入不正確,請重新輸入:";
					if(1)
						goto enteragain;
					break;
				}
    }
    cout << "執行成功。" << endl << endl << endl << endl << "請繼續:"  << endl;
}	while(choice != '4');			// 不要忘了分號 ;  
	
	return 0;
}

/************************************** 作業五 第1題  **************************************** 
1.設向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),則它們之間的加、減和積分別定義為:
X + Y = ( x1 + y1 , x2 + y2 , x3 + y3 ) 
X - Y = ( x1 - y1 , x2 - y2 , x3 - y3 )
X * Y = x1 * y1 + x2 * y2 + x3 * y3
程式設計序定義向量類vvector, 過載運算子"+"、"-" 、"*"和"=",實現向量之間的加、減、乘和賦值運算。
用過載運算子">>"、"<<"做向量的輸入/輸出操作。
**********************************************************************************************/

// vvector.h
#include <iostream.h>


class vvector
{
	private:
		double x;
		double y;
		double z;
	
	public:
		friend vvector operator + (const vvector&, const vvector&);
		friend vvector operator - (const vvector&, const vvector&);
		friend double operator * (const vvector&, const vvector&);
		friend istream& operator >> (istream& inp, vvector& in);
		friend ostream& operator << (ostream& outp, const vvector& ou);
};
		
// +
vvector operator + (const vvector& f, const vvector& s)
{
	vvector re;
	cout << "( " << f.x << "+" << s.x << ", "
		 << f.y << "+" << s.y << ", "
		 << f.z << "+" << s.z << " ) = " ;
	re.x = f.x + s.x;
	re.y = f.y + s.y;
	re.z = f.z + s.z;
	return re;
}

// -
vvector operator - (const vvector& f, const vvector& s)
{
	vvector re;
	cout << "( " << f.x << "-" << s.x << ", "
		 << f.y << "-" << s.y << ", "
		 << f.z << "-" << s.z << " ) = " ;
	re.x = f.x - s.x;
	re.y = f.y - s.y;
	re.z = f.z - s.z;
	return re;
}

// *
double operator * (const vvector& f, const vvector& s)
{
	cout << f.x << "*" << s.x << " + "
		 << f.y << "*" << s.y << " + "
		 << f.z << "*" << s.z << " = " ;
	return double (f.x * s.x + f.y * s.y + f.z * s.z);
}

// >>
istream& operator >> (istream& inp, vvector& in)
{
	cout << "請輸入該向量的橫座標: ";
	inp >> in.x;
	cout << "\n請輸入該向量的縱座標:";
	inp >> in.y;
	cout << "\n請輸入該向量的豎座標:";
	inp >> in.z;
	cout << endl;
	return inp;
} 


// <<
ostream& operator << (ostream& outp, const vvector& ou)
{
	outp << "(" << ou.x 
		 << ", " << ou.y 
		 << ", " << ou.z
		 << ")";
    outp << endl << endl;
     return outp;
 }


/*********************  作業五 第02題 ************************************
2.定義一個類 nauticalmile_kilometer,
它包含兩個資料成員kilometer(千米)和meter(米)。
還包含一個建構函式對資料成員初始化;
成員函式print用於輸出資料成員kilometer和meter的值;
型別轉換函式double()實現把千米和米轉換為海里(mile)(1海里=1.852千米)。
編寫main函式,測試類nauticalmile_kilometer。
****************************************************************************/

// H5t2.cpp
#include <iostream>
#include "nk.h"
using namespace std;

// typename nauticalmile_kilometer nk;  // 用個別名,方便編寫 

int main()
{
  nauticalmile_kilometer m(18520, 0);   // 建構函式中千米的資料為0 
  nauticalmile_kilometer km(0, 18520);  // 建構函式中米的資料為0 
  nauticalmile_kilometer mkm(18520, 18520); // 建構函式中兩者資料皆不為0
  nauticalmile_kilometer nmkm(0, 0);      // 建構函式中兩者資料皆為0
 
 // explain
 cout << "該實驗測試將類型別強制轉換成double型。"
      << "其中類型別包含了(千米、米)兩個資料。 "
      << endl << endl; 
 
 // 強制轉換前的顯示 
 cout << "強制轉換前:" << endl << endl;
 cout << " 當建構函式中千米的資料為0時" << endl; 
 m.print();
 cout << " 當建構函式中米的資料為0時" << endl; 
 km.print();
 cout << " 當建構函式中兩者資料皆不為0" << endl; 
 mkm.print();
 cout << " 當建構函式中兩者資料皆為0" << endl; 
 nmkm.print();
 cout << endl << endl;
  
 // 實行強制轉換 
 (double) (m);
 (double) (km);
 (double) (mkm);
 (double) (nmkm);
 
 // 強制顯示後的顯示
 cout << "強制轉換後:" << endl << endl;
 cout << " 當建構函式中千米的資料為0時" << endl; 
 m.print();
 cout << " 當建構函式中米的資料為0時" << endl; 
 km.print();
 cout << " 當建構函式中兩者資料皆不為0" << endl; 
 mkm.print();
 cout << " 當建構函式中兩者資料皆為0" << endl; 
 nmkm.print();
 cout << endl << endl;
 
 while(2);
  
 return 0;
} 

/*********************  作業五 第02題 ************************************
2.定義一個類 nauticalmile_kilometer,
它包含兩個資料成員kilometer(千米)和meter(米)。
還包含一個建構函式對資料成員初始化;
成員函式print用於輸出資料成員kilometer和meter的值;
型別轉換函式double()實現把千米和米轉換為海里(mile)(1海里=1.852千米)。
編寫main函式,測試類nauticalmile_kilometer。
****************************************************************************/

// nk.h -- to define a class nauticalmile_kilometer
#include <iostream.h>

class nauticalmile_kilometer
{
 	  private:
	  		  double meter;
	  		  double kilometer;
      public:
	  		 int print();
	  		 nauticalmile_kilometer(double m = 0, double km = 0):meter(m), kilometer(km) {}
             operator double();
};

// print
int nauticalmile_kilometer::print()
{
 	cout << "meter = " << meter << "\t";
 	cout << "kilometer = " << kilometer;
 	cout << endl;
 	return 0;
}

// operator typeName();
nauticalmile_kilometer::operator double()
{
 	// only kilometer
 	if (meter == 0 && kilometer != 0)
 	{
    kilometer = kilometer / 1.825;
 	return kilometer;
	}

 	// only meter
 	else if (meter != 0 && kilometer == 0)
 	{
 	meter = meter / 1000 / 1.825;
 	return meter;
 	}
 	
	// kilometer && meter 
    else if (meter != 0 && kilometer != 0)
    {
 	meter = meter / 1000 / 1.825;
 	kilometer = kilometer / 1.825;
    return 0;
	}
    // nothing to print , when both == 0
 	else 	
	return 0;
}


/************************** 作業五 習題三 ********************************* 
 定義一個複數類Complex,過載運算子"+",使之能用於複數的加法運算。
 參加運算的兩個運算量可以都是類物件,也可以其中有一個是整數,順序任意。
 例如:c1+c2, i+c1, c1+i , 均合法(設i為整數,c1,c2 為複數)。
 程式設計序,分別求兩個複數之和、整數和複數之和。
****************************************************************************/
 
// H5t3.cpp -- Complex  operation
#include <iostream>
using namespace std;
#include "complex.h"

int main()
{
 	// definition
 	complex c1;
 	complex c2;
 	complex c;
 	int i;
 	
 	// enter
 	cout << "輸入資料:" << endl << endl; 
 	cout << "第一個複數:" << endl; 
	c1.enter();
	cout << "第二個複數:" << endl; 
 	c2.enter();
 	cout << "請輸入一個整數:" ; 
 	cin >> i;
 	cout << endl << endl;
 	
 	// display & calculate
 	cout << "以下是運算結果:" << endl;
	
	cout << "1.兩複數相加: "; 
	c1.display();
	cout << " + "; 
 	c2.display();
 	cout << " = ";
    (c1 + c2).display();
 	
 	cout << endl;
 	cout << endl;
 	cout << "2.複數與整數相加: " << endl;
 	cout << i << " + ";
 	c1.display();
 	cout << " = ";
	(i + c1).display();
 	
 	cout << endl; 	
 	c2.display();
	cout << " + " << i ;
	cout << " = ";
	(c2 + i).display();
	cout << endl;
 	
 	while(2);
 	return 0;
}

/************************** 作業五 習題三 ********************************* 
 定義一個複數類Complex,過載運算子"+",使之能用於複數的加法運算。
 參加運算的兩個運算量可以都是類物件,也可以其中有一個是整數,順序任意。
 例如:c1+c2, i+c1, c1+i , 均合法(設i為整數,c1,c2 為複數)。
 程式設計序,分別求兩個複數之和、整數和複數之和。
****************************************************************************/

// complex.h
#include <iostream>

class complex
{
 private:
	  	 double real;
	  	 double image;
 public:
 		 void display();
 		 void enter();
		 friend complex operator + (const complex& , const complex&);
		 friend complex operator + (const complex& , const int& );
		 friend complex operator + (const int& , const complex& );
};

// c+c
complex operator + (const complex& c1, const complex& c2)
{
  complex c;
  c.real = c1.real + c2.real;
  c.image = c1.image + c2.image;
  return c;
}
  
// c+i
complex operator + (const complex& c, const int& i)
{
  complex c1;
  c1.real = c.real + double(i);
  c1.image = 0;
  return c1;
}

// i+c
complex operator + (const int& i, const complex& c)
{
  complex c1;
  c1.real = c.real + double(i);
  c1.image = 0;
  return c1;
}

// display
void complex::display()
{
 	cout << "( " << real << " + " << image << "i" << " )";
}

// enter
void complex::enter()
{
 	cout << "請輸入實部:" ;
 	cin >> real;
 	cout << "請輸入虛部:" ;
	cin >> image;
} 


相關推薦

作業11: _運算子過載

作業11:  類_運算子過載1.設向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),則它們之間的加、減和積分別定義為:X + Y = ( x1 + y1 , x2 + y2 , x3 + y3 ) X - Y = ( x1 - y1 , x2

YTUOJ——C++時間運算子過載

題目描述 C++時間類的運算子過載 定義一個時間類Time,其資料成員為表示時間的小時(hour)、分(minute),秒(second)。 過載運算子“+”,使之能用於時間物件的加法運算;過載運算子“<<”,使之能用於時間物件的輸出操作。 (1)參加運算的兩個運算元可以都是時間

《C++第九周實驗報告3-1》----接第8周任務3,定義分數運算子過載,實現分數的輸入輸出

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: CFraction.cpp *

2014第八週專案三--分數運算子過載

/* *程式的版權和版本宣告部分: *Copyright(c)2014,煙臺大學計算機學院學生 *All rights reserved. *檔名稱: *作者:劉曉曉 *完成日期:2014年 04月15號 *版本號:v1.0 *對任務及求解方法的描述部分: *輸入描述: 無

C++_運算子過載的注意事項

1、過載操作符沒必要一定是成員函式,還可以是友元函式。 2、過載操作符函式為成員函式主要是你需要操作類內部的成員, 必須是成員函式或友元函式才行。 3、至於由深淺拷貝的原因要使其成為成員函式,這個不知道。 4、如果運算子被過載為全域性函式,那麼只有一個

8_3分數運算子過載

#include <iostream> using namespace std; class CFraction {private: int nume; // 分子 int deno;

多型性-成員運算子過載

1、如果運算子作為類的成員函式過載,其引數個數要比該運算子實際引數個數少一個。其第一個引數是通過物件的this指標傳遞的,this指標是一個隱含的引數,有c++編譯系統自行處理。而靜態成員函式沒有this指標,所以不能將運算子過載為類的靜態成員函式。2、二元運算子     

複數運算子過載

#include <iostream>   using namespace std;   class Complex   {   public:       Complex(){real=0;imag=0;}       Complex(double r,dou

[c++]String字串運算子過載

在c++中有一個新定義的型別string,可以不用那麼麻煩的操作字串,並且一些高階的運算子過載讓她的使用更加便捷 下面是String類的定義和成員函式的定義: #ifndef operator_operator_h #define operator_operator_h

string運算子過載的實現

#include<iostream> using namespace std; class MyString { public: MyString(); MyString(const int number); MyStri

運算子過載,this指標

class Complex { private : double m_real; double m_imag; public: // 無引數建構函式 // 如果建立一個類你沒有寫任何建構函式,則系統會自動

C++和物件.四個預設成員函式(賦值運算子過載

1.(1)類的定義   類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年

運算子過載(18.11.17)

一、運算子過載:自定義型別和內建型別滿足的相同的邏輯。分為兩種: 1.普通運算子過載: 1>. <運算子過載,程式碼如下: bool operator<(int rhs) //int rhs形參作為右運算元 { return mdata<rhs; //mdata類成員

運算子過載:string

運算子過載規則如下: ①、 C++中的運算子除了少數幾個之外,全部可以過載,而且只能過載C++中已有的運算子。 ②、 過載之後運算子的優先順序和結合性都不會改變。 ③、 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原

運算子過載:複數

運算子的過載: 1,只能過載已存在的運算子 2,自定義型別和內建滿足的相同的邏輯 1.普通運算子可以過載 2.型別過載 const : 1、防止實參被修改; 2、接收隱式生成臨時物件; 類內是this_call的呼叫約定,成員方法隱藏this指標,指向一般為左

JavaSE—11.抽象_介面

抽象類 用abstract關鍵字來修飾一個類時,這個類叫做抽象類;用abstract來修飾一個方法時,該方法叫做抽象方法 含有抽象方法的類必須被宣告為抽象類,抽象類必須被繼承,抽象方法必須被重寫 抽象類不能被例項化 抽象方法只需宣告,而不需實現 abstra

運算子過載

首先定義一個簡單的類,用它來實現int型別資料的加減乘除等功能。 class Int { public: Int() : m_value(0) {} /

C ++中字串運算子過載示例

一、基本概念 (一) 函式過載的含義 所謂過載,就是重新賦予新的含義。函式過載就是對一個已有的函式賦予新的含義,使之實現新功能,因此,一個函式名就可以用來代表不同功能的函式,也就是”一名多用”。 (二) 為什麼要進行函式過載 一般情況下,編譯器對現有操作符的運算元是有一定的限制,但是