c++实现分数的读取与加减乘除运算

首先定义了Euclid函数,采用欧几里得算法用来求最大公约数,方便后续用在分数的化简与通分上。

定义了fraction类
私有数据成员:
int nume (分母) int deno (分子)
共有函数
构造函数三个分别用于整形分数,double小数,文本类型来构造分数
复制构造函数一个
化简函数 simplify
输出函数 display
运算符重载±*/采用友元函数在类外定义

主函数用于测试

#include<iostream>
#include<string>
#include <stdlib.h>   
using namespace std;
int  Euclid(int a,int b){//欧几里得求最大公约数 
	int r;
	while(b!=0){
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}
class fraction{//定义分数类 
	public:
		fraction(int n=0,int d=1):nume(n),deno(d){simplify();};
		fraction(double d);//double类型转化fraction 类外详细定义
		fraction(const string str); //string类型转化fraction 类外详细定义
		fraction(const fraction& f):nume(f.nume),deno(f.deno) {};//复制构造函数
		void simplify(); //化简 
		void display();//输出 
		friend fraction operator +(fraction a,fraction b);
		friend fraction operator -(fraction a,fraction b);
		friend fraction operator *(fraction a,fraction b);
		friend fraction operator /(fraction a,fraction b);
	private:
		int nume;//分子 
		int deno;//分母 
}; 
fraction::fraction(double d):nume(d),deno(1){//nume是整形,d为double故这里强制类型转化nume取了d的整数部分 
	d=d-nume;//d取小数部分
	while(int(d*10)!=0){
		nume=nume*10+int(d*10);
		deno=deno*10;
		d=d*10-int(d*10);
	} ;
	simplify();
}
fraction::fraction(const string str):nume(0),deno(1){
	char buf[200];
	int i=str.find('/');
	str.copy(buf,i,0);//string.copy函数(指向存放位置的指针,复制函数的个数,从第几位开始复制)
	buf[i]=0;
	nume=atoi(buf); 
	int j=str.length()-i-1;
	str.copy(buf,j,i+1);
	buf[j]=0;
	deno=atoi(buf);
	simplify();	
}
void fraction::simplify(){//欧几里得算法找到最大公约数 
	int n,d,r,s=1;//s为符号位 
	if(deno<0)s=-s,deno=-deno;
	if(nume<0)s=-s,nume=-nume;
	int t=Euclid(nume,deno) ;
	nume=s*nume/t;
	deno=deno/t; 	
}

void fraction::display(){
	if(deno!=0){
		cout<<nume<<"/"<<deno<<endl;	
	}
	else cout<<"the deno must not be 0"<<endl;
}

fraction operator *(fraction a,fraction b){
	fraction c;
	c.deno=a.deno*b.deno;
	c.nume=a.nume*b.nume;
	c.simplify();
	return c;
}

fraction operator /(fraction a,fraction b){
	fraction c;
	c.deno=a.deno*b.nume;
	c.nume=a.nume*b.deno;
	c.simplify();
	return c;
}

fraction operator +(fraction a,fraction b){
	fraction c;	
	int r=Euclid(a.deno,b.deno);
	c.nume=a.nume*(b.deno/r)+b.nume*(a.deno/r);
	c.deno=a.deno*b.deno/r;
	c.simplify();
	return c;
	
}
fraction operator -(fraction a,fraction b){
	fraction c;	
	int r=Euclid(a.deno,b.deno);
	c.nume=a.nume*(b.deno/r)-b.nume*(a.deno/r);
	c.deno=a.deno*b.deno/r;
	c.simplify();
	return c;
	
}




int main(){
	fraction a(-1,2);
	a.display();
	fraction b(-0.23);
	b.display();
	fraction c("-3/8");
	c.display();
	c=a*b;
	c.display();
	c=b/a;
	c.display();
	c=b+a;
	c.display();
	c=a-b;
	c.display();
	return 0;
}
  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个C程序,可以实现加减乘除的计算器功能。程序首先接受两个数作为输入,然后根据用户输入的操作符进行相应的运算,最后输出结果。具体的实现步骤如下: 1. 引用的代码中首先包含了两个头文件,iostream用于输入输出流,cstring用于字符串操作。接下来使用了using namespace std来引入标准命名空间。 2. 在主函数main()中,定义了整型变量a和b用于存储用户输入的两个数。 3. 进入while循环,循环条件为1,即永远为真,使得程序可以一直进行计算。 4. 接下来定义了整型变量f1和f2,用于存储操作数和结果。 5. 定义了字符数组a,用于存储用户输入的操作符。 6. 使用cin输入流依次读取f1和a。 7. 使用strlen函数获取字符数组a的长度。 8. 定义了指针p指向字符数组a的首地址。 9. 使用for循环遍历字符数组a,从索引1开始,将字符转换为整型数字,并计算f2的值。 10. 利用switch语句根据操作符进行相应的运算,将结果存储在ans变量中。 11. 使用delete释放动态分配的内存,避免内存泄漏。 12. 使用cout输出结果ans。 13. 循环回到while开始的地方,继续接受输入并进行计算。 这段代码实现了一个简单的C语言加减乘除的计算器。用户可以输入两个数和一个操作符,然后程序会根据操作符进行相应的运算并输出结果。<span class="em">1</span><span class="em">2</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值