用C++编写分数计算器
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
int gcd(int x,int y)
{return y?gcd(y,x%y):x;}
class fraction
{
private:
int a,b;/* b/a */
public:
fraction()//构造函数
{
a=b=1;
}
fraction(int aa,int bb)//构造函数
{
if(aa<0)
{
aa=-aa;
bb=-bb;
}
a=aa;
b=bb;
}
fraction operator+(const fraction x)const//加法
{
int m=a*x.a,n=b*x.a+a*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator-(const fraction x)const//减法
{
int m=a*x.a,n=b*x.a-a*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator*(const fraction x)const//乘法
{
int m=a*x.a,n=b*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator/(const fraction x)const//除法
{
int m=a*x.b,n=b*x.a,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
void show()
{
if(!b)
cout<<"0"<<endl;
else if(!a)
cout<<"Inf"<<endl;
else
cout<<b<<"/"<<a<<endl;
}
};
int main(int argc, char *argv[])
{
int a,b,c,d;
char op;
fraction x,y,z;
/*cin>>b>>a;
x=fraction(a,b);
cin>>b>>a;
y=fraction(a,b);
z=x+y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x-y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x*y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x/y;
cout<<z.getb()<<"/"<<z.geta()<<endl;*/
while(scanf("%d/%d %c %d/%d",&b,&a,&op,&d,&c)==5)//输入b/a op d/c //op是操作符+-*/
// 输入:1/2 + 1/3 输出:1/6
{
x=fraction(a,b);
y=fraction(c,d);
switch(op)
{
case '+':z=x+y;break;
case '-':z=x-y;break;
case '*':z=x*y;break;
case '/':z=x/y;break;
};
z.show();
}
}
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
int gcd(int x,int y)
{return y?gcd(y,x%y):x;}
class fraction
{
private:
int a,b;/* b/a */
public:
fraction()//构造函数
{
a=b=1;
}
fraction(int aa,int bb)//构造函数
{
if(aa<0)
{
aa=-aa;
bb=-bb;
}
a=aa;
b=bb;
}
fraction operator+(const fraction x)const//加法
{
int m=a*x.a,n=b*x.a+a*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator-(const fraction x)const//减法
{
int m=a*x.a,n=b*x.a-a*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator*(const fraction x)const//乘法
{
int m=a*x.a,n=b*x.b,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
fraction operator/(const fraction x)const//除法
{
int m=a*x.b,n=b*x.a,t;
t=gcd(m,n);
if(t)
{
m/=t;
n/=t;
}
return fraction(m,n);
}
void show()
{
if(!b)
cout<<"0"<<endl;
else if(!a)
cout<<"Inf"<<endl;
else
cout<<b<<"/"<<a<<endl;
}
};
int main(int argc, char *argv[])
{
int a,b,c,d;
char op;
fraction x,y,z;
/*cin>>b>>a;
x=fraction(a,b);
cin>>b>>a;
y=fraction(a,b);
z=x+y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x-y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x*y;
cout<<z.getb()<<"/"<<z.geta()<<endl;
z=x/y;
cout<<z.getb()<<"/"<<z.geta()<<endl;*/
while(scanf("%d/%d %c %d/%d",&b,&a,&op,&d,&c)==5)//输入b/a op d/c //op是操作符+-*/
// 输入:1/2 + 1/3 输出:1/6
{
x=fraction(a,b);
y=fraction(c,d);
switch(op)
{
case '+':z=x+y;break;
case '-':z=x-y;break;
case '*':z=x*y;break;
case '/':z=x/y;break;
};
z.show();
}
}
展开全部
。。。。。。。。。。。算术表达式行吗?
//引用头文件
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int ElemType;
const int STACK_INIT_SIZE=100; //存储空间的初始化分配量
const int STACKINCREMENT=10;//存储空间分配增量
typedef struct {ElemType *base; //存储空间基址
ElemType *top;//栈顶指针
int stacksize;//当前分配的存储空间}Stack;
//函数声明
int IfEmptyStack(Stack S);
void InitStack(Stack &S);
void EmptyStack(Stack &S);
void Push(Stack &S, ElemType e);
void Pop(Stack &S, ElemType &e);
void ShowStack(Stack S);
//声明定义变量
int In(char ch);
char Precede(char a, char b);
int Operate(int a, char f, int b);
int IfEmptyStack(Stack S){//判断是否为空栈
if(S.base==S.top) return 1; return 0;}
void InitStack(Stack &S){//构造一个空栈
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base; S.stacksize=STACK_INIT_SIZE; return;}
void EmptyStack(Stack &S){//若栈空则无返回值
S.top=S.base; return ;}
void Push(Stack &S, ElemType e){//插入元素e为新的栈顶元素(入栈)
if(S.top-S.base>=S.stacksize){
S.base=(ElemType *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(ElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
} *S.top++=e; return ;}
void Pop(Stack &S, ElemType &e){//若栈不空则删除s的栈顶元素,用e返回其值,否则无返回值
if(S.top==S.base)return ; e=*--S.top; return ;}
ElemType GetTop(Stack &S){//若栈不空则返回s的栈顶元素,否则无返回值
if(S.top==S.base) return 0; return *(S.top-1);}
void ShowStack(Stack S){//输出
ElemType *p=S.base; while(p!=S.top)printf("%d",*p++); return;}
int In(char ch){ int res; switch(ch){
case '+': case '-': case '*': case '/': case '(': case ')':
case '=': res=1;break; default: res=0;break; case '@': exit(0);}
return res;}
char Precede(char a, char b){//判断符号的优先级
int i,j; int form[7][7]={
{1,1,-1,-1,-1,1,1}, {1,1,-1,-1,-1,1,1}, {1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1}, {-1,-1,-1,-1,-1,0,2}, {1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(a){case '+':i=0;break; case '-':i=1;break;
case '*':i=2;break; case '/':i=3;break; case '(':i=4;break;
case ')':i=5;break; case '=':i=6;break;}switch(b){
case '+':j=0;break; case '-':j=1;break; case '*':j=2;break;
case '/':j=3;break; case '(':j=4;break; case ')':j=5;break;
case '=':j=6;break;//出栈时的结尾判断}//栈顶元素优先级
if(form[i][j]==1)return '>';
else if(form[i][j])return '<';
else return '=';}
int Operate(int a, char f, int b){ switch(f){
case '+': return a+b; case '-': return a-b;
case '*': return a*b; case '/': return a/b;}return 0;}
void EvaluateExpression(){//定义执行函数并实现相关操作
char c, d[100];
int i, f, num, tmpa, tmpb;
Stack OPTR, OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR, '='); c=getchar();
while(c!='='||GetTop(OPTR)!='='){
if(c>='0'&&c<='9'){ i=0;
do{d[i++]=c; c=getchar();
}while(c>='0'&&c<='9');
d[i]='\0'; num=atoi(d);
Push(OPND, num);}else if(In(c)){
switch(Precede(GetTop(OPTR), c)) {
case '<': Push(OPTR, (int)c);c=getchar(); break;
case '=': Pop(OPTR, f);c=getchar(); break;
case '>': Pop(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);
Push(OPND, Operate(tmpa, f, tmpb)); break; }}}
c=getchar();//接收最后输入的一个回车符!!!否则在主函数中只能输入一次...
cout<<"所求表达式的值为:"; ShowStack(OPND); cout<<endl<<endl;}//主函数
int main(){
cout<<"输入@结束操作!";
cout<<"请输入表达式,以=结束求值:"<<endl;
while(1){EvaluateExpression();
cout<<endl;
cout<<"请再输入表达式,以=结束求值:"<<endl;}return 0;}
较高级的程序代码:
#include <stdio.h>
#include <math.h>
#include <string> /*引用pow,计算a^b*/
struct{char ch[50];
int top,length;}str;
/*字符串栈*/
struct{char ch[30];
int top;}code;
/*操作符栈*/
struct{double num[30];
int top;}number;
/*操作数栈*/
void Getnumber()
/*读取一个浮点数到number.num[]中*/
{float t,result=0; int i=0,j;
while(str.top<str.length&&str.ch[str.top]>='0'&&str.ch[str.top]<='9')
result=result*10+str.ch[str.top++]-'0';//"str.ch[str.top++]-'0'"实现字符串与起对应的整型之间的转换
if(str.top<str.length&&str.ch[str.top]=='.'&&++str.top)
while(str.top<str.length&&str.ch[str.top]>='0'&&str.ch[str.top]<='9')
{i++,t=str.ch[str.top++]-'0';//"str.ch[str.top++]-'0'"实现字符串与起对应的整型之间的转换
for(j=0;j<i;j++)
t=t/10.0; result=result+t;}
number.num[++number.top]=result;}
float Solve(float a,float b,char ch) /*计算并返回表达式'a ch b'*/{switch(ch)
{case '+': return a+b; case '-': return a-b; case '*': return a*b;
case '/': return a/b; case '^': return pow(a,b); /*计算a^b*/}}
void Pop(void) /*当遇到优先级低的操作码时,从操作码栈弹出一操作码,*/
{if(number.top<1) /*从操作数栈弹出两个操作数,计算其值后压入操作数栈 */
printf("输入的表达式有误 !\n"),exit(0); else
number.num[number.top-1]=Solve(number.num[number.top-1],number.num[number.top],
code.ch[code.top--]),number.top--;}
main(){printf("请输入表达式:"); scanf("%s",str.ch);
str.length=strlen(str.ch),str.top=0,code.top=number.top=-1; /*初始化*/
while(str.top<str.length) /*处理整个字符串,一边处理,一边判错*/
switch(str.ch[str.top]){case '+': case '-':
while(code.top>=0&&code.ch[code.top]!='(') Pop();
code.ch[++code.top]=str.ch[str.top++]; break;
case '*': case '/':
while(code.top>=0&&code.ch[code.top]!='('&&code.ch[code.top]!='+'&&code.ch[code.top]!='-')
Pop(); code.ch[++code.top]=str.ch[str.top++]; break;
case '(': code.ch[++code.top]=str.ch[str.top++]; break; case ')':
while(code.top>=0&&code.ch[code.top]!='(') Pop();
if(code.top<0) printf("输入的表达式有误 !\n"),exit(0);
else code.top--; str.top++;
break; case '^':
code.ch[++code.top]=str.ch[str.top++]; break;
default: if(str.ch[str.top]<'0'&&str.ch[str.top]!='.'||str.ch[str.top]>'9')
printf("输入的字符有误!\n"),exit(0);
else Getnumber();}
while(code.top>=0) /*处理剩余操作码,优先级由高到低(栈序)*/
if(code.ch[code.top]=='(')
printf("输入的表达式有误 !\n"),exit(0);
else if(code.ch[code.top]=='+'||code.ch[code.top]=='-'||code.ch[code.top]=='*'||
code.ch[code.top]=='/'||code.ch[code.top]=='^')
Pop(); if(code.top>1) /*操作数多于操作码的匹配数*/
printf("输入的表达式有误!\n");
else /*输出结果*/
printf("The result is:%f\n",number.num[number.top]);}
//引用头文件
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int ElemType;
const int STACK_INIT_SIZE=100; //存储空间的初始化分配量
const int STACKINCREMENT=10;//存储空间分配增量
typedef struct {ElemType *base; //存储空间基址
ElemType *top;//栈顶指针
int stacksize;//当前分配的存储空间}Stack;
//函数声明
int IfEmptyStack(Stack S);
void InitStack(Stack &S);
void EmptyStack(Stack &S);
void Push(Stack &S, ElemType e);
void Pop(Stack &S, ElemType &e);
void ShowStack(Stack S);
//声明定义变量
int In(char ch);
char Precede(char a, char b);
int Operate(int a, char f, int b);
int IfEmptyStack(Stack S){//判断是否为空栈
if(S.base==S.top) return 1; return 0;}
void InitStack(Stack &S){//构造一个空栈
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base; S.stacksize=STACK_INIT_SIZE; return;}
void EmptyStack(Stack &S){//若栈空则无返回值
S.top=S.base; return ;}
void Push(Stack &S, ElemType e){//插入元素e为新的栈顶元素(入栈)
if(S.top-S.base>=S.stacksize){
S.base=(ElemType *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(ElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
} *S.top++=e; return ;}
void Pop(Stack &S, ElemType &e){//若栈不空则删除s的栈顶元素,用e返回其值,否则无返回值
if(S.top==S.base)return ; e=*--S.top; return ;}
ElemType GetTop(Stack &S){//若栈不空则返回s的栈顶元素,否则无返回值
if(S.top==S.base) return 0; return *(S.top-1);}
void ShowStack(Stack S){//输出
ElemType *p=S.base; while(p!=S.top)printf("%d",*p++); return;}
int In(char ch){ int res; switch(ch){
case '+': case '-': case '*': case '/': case '(': case ')':
case '=': res=1;break; default: res=0;break; case '@': exit(0);}
return res;}
char Precede(char a, char b){//判断符号的优先级
int i,j; int form[7][7]={
{1,1,-1,-1,-1,1,1}, {1,1,-1,-1,-1,1,1}, {1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1}, {-1,-1,-1,-1,-1,0,2}, {1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(a){case '+':i=0;break; case '-':i=1;break;
case '*':i=2;break; case '/':i=3;break; case '(':i=4;break;
case ')':i=5;break; case '=':i=6;break;}switch(b){
case '+':j=0;break; case '-':j=1;break; case '*':j=2;break;
case '/':j=3;break; case '(':j=4;break; case ')':j=5;break;
case '=':j=6;break;//出栈时的结尾判断}//栈顶元素优先级
if(form[i][j]==1)return '>';
else if(form[i][j])return '<';
else return '=';}
int Operate(int a, char f, int b){ switch(f){
case '+': return a+b; case '-': return a-b;
case '*': return a*b; case '/': return a/b;}return 0;}
void EvaluateExpression(){//定义执行函数并实现相关操作
char c, d[100];
int i, f, num, tmpa, tmpb;
Stack OPTR, OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR, '='); c=getchar();
while(c!='='||GetTop(OPTR)!='='){
if(c>='0'&&c<='9'){ i=0;
do{d[i++]=c; c=getchar();
}while(c>='0'&&c<='9');
d[i]='\0'; num=atoi(d);
Push(OPND, num);}else if(In(c)){
switch(Precede(GetTop(OPTR), c)) {
case '<': Push(OPTR, (int)c);c=getchar(); break;
case '=': Pop(OPTR, f);c=getchar(); break;
case '>': Pop(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);
Push(OPND, Operate(tmpa, f, tmpb)); break; }}}
c=getchar();//接收最后输入的一个回车符!!!否则在主函数中只能输入一次...
cout<<"所求表达式的值为:"; ShowStack(OPND); cout<<endl<<endl;}//主函数
int main(){
cout<<"输入@结束操作!";
cout<<"请输入表达式,以=结束求值:"<<endl;
while(1){EvaluateExpression();
cout<<endl;
cout<<"请再输入表达式,以=结束求值:"<<endl;}return 0;}
较高级的程序代码:
#include <stdio.h>
#include <math.h>
#include <string> /*引用pow,计算a^b*/
struct{char ch[50];
int top,length;}str;
/*字符串栈*/
struct{char ch[30];
int top;}code;
/*操作符栈*/
struct{double num[30];
int top;}number;
/*操作数栈*/
void Getnumber()
/*读取一个浮点数到number.num[]中*/
{float t,result=0; int i=0,j;
while(str.top<str.length&&str.ch[str.top]>='0'&&str.ch[str.top]<='9')
result=result*10+str.ch[str.top++]-'0';//"str.ch[str.top++]-'0'"实现字符串与起对应的整型之间的转换
if(str.top<str.length&&str.ch[str.top]=='.'&&++str.top)
while(str.top<str.length&&str.ch[str.top]>='0'&&str.ch[str.top]<='9')
{i++,t=str.ch[str.top++]-'0';//"str.ch[str.top++]-'0'"实现字符串与起对应的整型之间的转换
for(j=0;j<i;j++)
t=t/10.0; result=result+t;}
number.num[++number.top]=result;}
float Solve(float a,float b,char ch) /*计算并返回表达式'a ch b'*/{switch(ch)
{case '+': return a+b; case '-': return a-b; case '*': return a*b;
case '/': return a/b; case '^': return pow(a,b); /*计算a^b*/}}
void Pop(void) /*当遇到优先级低的操作码时,从操作码栈弹出一操作码,*/
{if(number.top<1) /*从操作数栈弹出两个操作数,计算其值后压入操作数栈 */
printf("输入的表达式有误 !\n"),exit(0); else
number.num[number.top-1]=Solve(number.num[number.top-1],number.num[number.top],
code.ch[code.top--]),number.top--;}
main(){printf("请输入表达式:"); scanf("%s",str.ch);
str.length=strlen(str.ch),str.top=0,code.top=number.top=-1; /*初始化*/
while(str.top<str.length) /*处理整个字符串,一边处理,一边判错*/
switch(str.ch[str.top]){case '+': case '-':
while(code.top>=0&&code.ch[code.top]!='(') Pop();
code.ch[++code.top]=str.ch[str.top++]; break;
case '*': case '/':
while(code.top>=0&&code.ch[code.top]!='('&&code.ch[code.top]!='+'&&code.ch[code.top]!='-')
Pop(); code.ch[++code.top]=str.ch[str.top++]; break;
case '(': code.ch[++code.top]=str.ch[str.top++]; break; case ')':
while(code.top>=0&&code.ch[code.top]!='(') Pop();
if(code.top<0) printf("输入的表达式有误 !\n"),exit(0);
else code.top--; str.top++;
break; case '^':
code.ch[++code.top]=str.ch[str.top++]; break;
default: if(str.ch[str.top]<'0'&&str.ch[str.top]!='.'||str.ch[str.top]>'9')
printf("输入的字符有误!\n"),exit(0);
else Getnumber();}
while(code.top>=0) /*处理剩余操作码,优先级由高到低(栈序)*/
if(code.ch[code.top]=='(')
printf("输入的表达式有误 !\n"),exit(0);
else if(code.ch[code.top]=='+'||code.ch[code.top]=='-'||code.ch[code.top]=='*'||
code.ch[code.top]=='/'||code.ch[code.top]=='^')
Pop(); if(code.top>1) /*操作数多于操作码的匹配数*/
printf("输入的表达式有误!\n");
else /*输出结果*/
printf("The result is:%f\n",number.num[number.top]);}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询