使用类计算分数
Calculator for fractions using classes
本文关键字:计算 更新时间:2023-10-16
我想用类为分数创建一个四个函数(+,-,/,*)计算器。getinf函数有问题,每当我调用它时,它总是在主函数中返回相同的值。我搞不清是什么原因造成的。
#include<iostream>
#include<conio.h>
#include<cmath>
#include<process.h>
using namespace std;
class frac{
long num,dum;
public:
void getinf(){
cout<<"Enter the fraction = ";
cin>>num>>dum;
if(cin.fail()) {
cout<<"Invalid data entered. "<<"nTry again. ";getch();exit(0);
}
}
frac add(frac f1,frac f2){
frac f3;
f3.num=((f1.num*f2.dum)+(f1.dum*f2.dum));
f3.dum=f1.dum*f2.dum;
return f3;
}
frac sub(frac f1,frac f2){
frac f3;
f3.num=((f2.num*f2.dum)-(f1.dum*f2.dum));
f3.dum=f1.dum*f2.dum;
return f3;
}
frac mul(frac f1,frac f2){
frac f3;
f3.num=f1.num*f2.num;
f3.dum=f1.dum*f2.dum;
return f3;
}
frac div(frac f1,frac f2){
frac f3;
f3.num=f1.num*f2.dum;
f3.dum=f1.dum*f2.num;
return f3;
}
void lowterm(){
long tnum,tdum,temp,gcd;
tnum=labs(num);
tdum=labs(dum);
if(tdum==0) {
cout<<"Illegal fraction division by 0";exit(1);
} else if(tnum==0) {
num=0;dum=1;return;
}
while(tnum!=0){
if(tnum<tdum) {
temp=tnum;tnum=tdum;tdum=temp;
}
tnum=tnum-tdum;
}
gcd=tdum;
num=num/gcd;
dum=dum/gcd;
}
void showinf(){
cout <<"The result is "<<num<<"/"<<dum;getch();
}
};
void main(){
frac s1,s2,s3;char ch = 'a' ;
s1.getinf();
s2.getinf();
cout<<"Enter the function you want to perform on the fractions (+,-,*,/): ";
cin>>ch;
if(cin.fail()){
cout<<"Invalid operation entered. "<<"nNo such operation exist. " <<"nTry again. ";
getch();
exit(0);
}
switch(ch){
case'+':s3.add(s1,s2);break;
case'-':s3.sub(s1,s2);break;
case'*':s3.mul(s1,s2);break;
case'/':s3.div(s1,s2);break;
default:cout<<"Wrong information entered. "<<"nTry again. ";
}
s3.lowterm();
s3.showinf();
getch();
}
查看您的"运算符"函数,例如:
frac mul(frac f1,frac f2){
frac f3;
f3.num=f1.num*f2.dum;
f3.dum=f1.dum*f2.num;
return f3;
}
此功能:
- 创建一个名为
f3
的全新frac
对象 - 设置该对象的
num
和dum
成员 - 返回对象
特别是,它在任何时候都不会设置this
的num
或dum
成员。
当您在main中调用s3.mul(...)
时,您完全忽略了mul
的返回值。由于mul
除了对它返回的对象进行操作之外,什么都不做,所以该调用本质上是一个no-op。
你应该改变你的操作员功能,这样他们才能真正改变对象的字段,如下所示:
void mul(frac f1,frac f2){
num=f1.num*f2.dum;
dum=f1.dum*f2.num;
}
或者让它们成为自由函数(或静态成员),并用之类的东西调用它们
frac result = mul(s1, s2); // or frac::mul(s1, s2) for a static member
(还要注意,div
函数的代码与mul
函数的代码相同,这可能是一个错误。)
只需将开关块更改为:
switch(ch){
case'+':s3=s3.add(s1,s2);break;
case'-':s3=s3.sub(s1,s2);break;
case'*':s3=s3.mul(s1,s2);break;
case'/':s3=s3.div(s1,s2);break;
default:cout<<"Wrong information entered. "<<"nTry again. ";
你的代码会很好。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何计算多映射中重复对的数量