c++高级语言程序设计的一个作业题不会做 来个精英 帮帮忙···

作业题:两个分数相加,或两个小数相加,或者一个分数一个小数相加,结果为一个分数。如:2.4+4/5=16/5用C++编程不是c语言谢谢了... 作业题:两个分数相加, 或两个小数相加 , 或者一个分数一个小数相加, 结果为一个分数。 如:2.4+4/5=16/5 用C++编程 不是c语言 谢谢了 展开
 我来答
西瓜妈妈育儿助手
2011-10-14 · 新手妈妈育儿助手,24小时在线的育儿专家
西瓜妈妈育儿助手
采纳数:158 获赞数:549

向TA提问 私信TA
展开全部
我是冲着“精英”这两个字来的~~
#include<iostream>
#include<string>
#include<sstream>
#include<math.h>
using namespace std;

int gys(int,int); //求公约数
bool find(string,int &,char); //判断是不是小数(char='/'时)
void separate(string ,int &,char *,char *); //把分子分母分开
double shift(char *,char *); //把分数转换成小数
void main()
{
string str1,str2;
cout<<"输入两个数:"<<endl;
cin>>str1>>str2;
char str1part1[10]={0}; //第一个的整数部分
char str1part2[10]={0}; //第一个的小数部分
char str2part1[10]={0};
char str2part2[10]={0};
int div1=-1; //分数
int div2=-1;
double res1; //第一个数转换成小数
double res2;
double result; //最后结果
if(find(str1,div1,'/'))
separate(str1,div1,str1part1,str1part2);
if(find(str2,div2,'/'))
separate(str2,div2,str2part1,str2part2);
if(div1!=-1)
res1=shift(str1part1,str1part2);
if(div2!=-1)
res2=shift(str2part1,str2part2);
if(div1!=-1 && div2!=-1) //两个都是分数
result=res1+res2;
else if(div1==-1 && div2!=-1) //第一个是小数第二个是分数
{
const char *temp1=str1.c_str();
res1=atof(temp1);
result=res1+res2;
}
else if(div1!=-1 && div2==-1) //第一个是分数第二个是小数
{
const char *temp2=str2.c_str();
res2=atof(temp2);
result=res1+res2;
}
else //两个都是小数
{
const char *temp3=str1.c_str();
const char *temp4=str2.c_str();
res1=atof(temp3);
res2=atof(temp4);
result=res1+res2;
}
stringstream stream; //将整数和小数分离
string db2s;
char db2szhshu[10]={0};
char db2sxshu[10]={0};
int db2sindex=-1;
stream<<result;
stream>>db2s;
if (find(db2s,db2sindex,'.'))
separate(db2s,db2sindex,db2szhshu,db2sxshu);
stream.clear();
string xsh;
stream<<db2sxshu;
stream>>xsh;
int sz=xsh.size(); //小数位数
int den; //分子
stream.clear();
stream<<xsh;
stream>>den;
int mum=pow(10,sz);
int maxgys=gys(den,mum); //分子分母公约数
den=den/maxgys; //分子分母约分
mum=mum/maxgys;
stream.clear();
stream<<db2szhshu;
int zhshu;
stream>>zhshu;
den=den+zhshu*mum;
cout<<"运算结果:"<<den<<"/"<<mum<<endl;
}
double shift(char *ch1,char *ch2)
{
int fst=atoi(ch1);
int scd=atoi(ch2);
return (double)fst/(double)scd;
}
void separate(string strsprt,int &index,char *pt1,char *pt2)
{
const char *p=strsprt.c_str();
strncpy(pt1,p,index);
for(int j=index+1;j<strsprt.size();j++)
pt2[j-index-1]=strsprt[j];
}
bool find(string strdot,int &index,char ch)
{
for(int i=0;i<strdot.size();i++)
{
if(strdot[i]==ch)
{
index=i;
return true;
}
}
return false;
}
int gys(int a,int b) //最大公约数
{
if(a<b)
{
int mid;
mid=b;
b=a;
a=mid;
}
while(b!=0)
{
int temp=b;
b=a%b;
a=temp;
}
return a;
}
有什么看不明白的再讨论~
feiyang169
2011-10-13 · TA获得超过383个赞
知道小有建树答主
回答量:993
采纳率:0%
帮助的人:442万
展开全部
double a, b;
a = xx;
b = 1;
while ((a % 10) != 0)
{
a *= 10;
b *= 10;
}
a /= 10;
b /= 10;
for (int i = 2; i < 10; i++)
{
while ((a % i == 0) && (b % i == 0))
{
a /= i;
b /= i;
}
}

a是分子,b是分母。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
颜叉叉补a7
2011-10-13 · 超过19用户采纳过TA的回答
知道答主
回答量:54
采纳率:0%
帮助的人:20.3万
展开全部
1、 抽象一个 分数类 Class Number,里面有分子成员和分母成员
2、定义2个构造函数,一个参数为 double 类型 :Number(double d),用小数来构造对象
一个为int,int型:Number(int a, int b),用分数来构造对象
3、重载类的 “+”算法,实现小数+分数=分数 以及 分数+分数=分数的算法,具体方法可以是:先把小数转成分数(转成分母为10次幂的分数比较简单),分数和分数相加就直接等于(分子1*分母2 - 分子2*分母1)/分母1*分母2,然后再用转辗相除法对得到的分数进行约分
4、定义一个打印函数,用来展示分数的值
class Number
{
public:
Number(double d);
Number(int den, int num);
private:
int den; //分母
int num; //分子

public:
void MyPrintf(); //用来打印
Number operator +(Number n);
};
思路就是这样。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式