作业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;
} 


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值