C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,

本文介绍了一个用于处理分数的C++类,包括初始化、输入、输出、简化和放大操作。
#include <iostream>

using namespace std;

class CFraction
{private:
	int nume;  // 分子
	int deno;  // 分母
 public:
	CFraction(int nu=0,int de=1);   //构造函数,初始化用
	void Set(int nu=0,int de=1);    //置值,改变值时用
	void input();				//按照"nu/de"的格式,如"5/2"的形式输入
	void Simplify();			//化简(使分子分母没有公因子)
	void amplify(int n);			//放大n倍,如2/3放大5倍为10/3
	void output(int style=0);		//输出:以8/6为例,style为0时,输出8/6;
							//style为1时,输出4/3;
							//style为2时,输出1(1/3),表示一又三分之一;
							//不给出参数和非1、2,认为是方式0
};
int main ()
{
    CFraction CF;
	int style,x;
	CF.input();
	cout<<"请输入要放大的倍数:"<<endl;
	cin>>x;
	CF.amplify(x);
	cout<<"选择输出形式(以8/6为例,style为0时,输出8/6;style为1时,输出4/3;style为2时,输出1(1/3),表示一又三分之一;不给出参数和非1、2,认为是方式0)"<<endl;
	cin>>style;
	CF.output(style);
	CF.Set();
	return 0;
}

	
CFraction::CFraction(int nu,int de)
{
	nume=nu;
	deno=de;
}
void CFraction::Set(int nu,int de)
{
	nume=nu;
	deno=de;
}
void CFraction:: input()
{
	int x,y;
	char ch1;
	while(1)
	{
	    cout<<"请输入分数(格式为 */*):"<<endl;
	    cin>>x>>ch1>>y;
		if (ch1!='/')
			cout<<"输入错误,请重新输入"<<endl;
		else
			break;
	}
	nume=x;
	deno=y;
}
void CFraction::Simplify()
{
	int m,n;
    n=nume,m=deno;
	for(int i=2;n>=i;i++) 
	{
      if(n%i==0 && m%i==0)
      {
         n/=i;
         m/=i;
         i--;       
      }
	}
	cout<<n<<"/"<<m<<endl;
}
   
void CFraction::amplify(int x)
{	
	int m,n;
    n=nume,m=deno;
	for(int i=2;n>=i;i++) 
	{
      if(n%i==0 && m%i==0)
      {
         n/=i;
         m/=i;
         i--;       
      }
	}
	n=n*x;
	cout<<n<<"/"<<m<<endl;
	
}
void CFraction::output(int style)
{
	int n,m,x;
	n=nume,m=deno;
	 switch(style)
	 {
	 case 1:
		 {
		   for(int i=2;n>=i;i++) 
		   {
              if(n%i==0 && m%i==0)
			  {
                n/=i;
                m/=i;
                 i--;       
			  }
		   }cout<<n<<"/"<<m<<endl;
		 };break;
	
	 case 2:
		 {
			 cout<<"约分后结果为:";
              for(int i=2;n>=i;i++) 
			  {
                 if(n%i==0 && m%i==0)
				 {
                  n/=i;
                 m/=i;
                  i--;       
				 }
			  };
		     if(n<=m)
			 {
			     cout<<n<<"/"<<m<<endl;
			 }
		    else if (n%m==0)
			{
			  x=n/m;
			  n=n%m;
			  cout<<x<<endl;
			}
			  else
			  {
               x=n/m;
			   n=n%m;
               cout<<x<<'('<<n<<'/'<<m<<')'<<endl;
			  }
		 };break;
		   default:cout<<n<<"/"<<m<<endl;break;
	 }
}





 
### 关于《C++语言程序设计》第五版第十二的内容 #### 类模板与友元函数的应用 在《C++语言程序设计》第五版中,第十二主要讨论了类模板以及如何定义和使用它们。这一节深入探讨了泛型编程的概念及其重要性,在实际开发过程中能够极大提高代码重用率[^1]。 对于类模板而言,其允许创建可以操作不同类型数据的对象而无需为每种类型单独编写相同的逻辑实现。例如: ```cpp template <typename T> class Stack { private: T* items; public: // 构造函数和其他成员方法... }; ``` 此段代码展示了怎样声明一个简单的栈结构作为模板类的一部。 #### 友元机制详解 除了类模板外,本还介绍了友元概念——即让某些特定的函数或另一个类访问当前类中的私有成员变量成为可能。这有助于解决一些特殊场景下的需求,比如为了方便调试工具获取对象内部状态信息等目的所必需的操作[^2]。 下面是一个关于友元的例子: ```cpp #include <iostream> using namespace std; class ComplexNumber { friend ostream& operator<<(ostream&, const ComplexNumber&); // ...其他成员... }; ostream& operator<<(ostream &out, const ComplexNumber &c){ out << c.realPart << "+" << c.imaginaryPart << "i"; return out; } ``` 上述例子实现了自定义类型的流插入运算符重载,使得可以直接通过`<<`输出复数对象的信息。 #### 编程实践建议 书中强调理解这些高级特性不仅依赖理论学习更需大量练习来巩固掌握程度。读者应尝试构建不同种类的数据容器如链表、队列等,并利用友元功能增强其实现灵活性;同时鼓励探索STL标准库内已有的高效解决方案以便日后快速应用于项目当中[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值