c++高级语言程序设计的一个作业题不会做 来个精英 帮帮忙···
作业题:两个分数相加,或两个小数相加,或者一个分数一个小数相加,结果为一个分数。如:2.4+4/5=16/5用C++编程不是c语言谢谢了...
作业题:两个分数相加, 或两个小数相加 , 或者一个分数一个小数相加, 结果为一个分数。 如:2.4+4/5=16/5 用C++编程 不是c语言 谢谢了
展开
展开全部
我是冲着“精英”这两个字来的~~
#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;
}
有什么看不明白的再讨论~
#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;
}
有什么看不明白的再讨论~
展开全部
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是分母。
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是分母。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
};
思路就是这样。
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);
};
思路就是这样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询