C语言编程问题:分数计算器
发布网友
发布时间:2022-04-22 21:42
我来回答
共5个回答
热心网友
时间:2023-07-26 10:27
所有数据都可以用分数来表示,比如整数可以认为分母为1,这样,所有数据可以这样保存(数据结构为:)
struct
{
int z;//分子
int m;//分母
};
我没写过具体的可以计算分数的计算器,下面是加减乘除和括号的计算器源代码,你参考一下,如果看懂了应该不难改,应该是数据结构课程里堆栈这一块的内容。
测试样例:
输入:
2*(3+6*(8/2+1))
输出:
66
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct priority
{
char symb;
int pri;
}priority;
priority kuPriority[7]={{'+',1},{'-',1},{'*',2},{'/',2},{'(',3},{')',3},{'\0',0}};
char co[100];
char symbol[100];
int numb[100];
int sPoint,nPoint;
int sHead,nHead;
int findPri(char symb)
{
for(int i=0;i<7;i++)
{
if(kuPriority[i].symb==symb)
return kuPriority[i].pri;
}
return -1;
}
int calc(int a,int b,char symb)
{
switch(symb)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0)
{
printf("除数为0\n");
system("pause");
exit(0);
}
else
{
return a/b;
}
}
}
void f()
{
int len;
int i,a;
int flag,negative;
scanf("%s",co);//scanf能解决行末空格问题,gets不行
len=strlen(co);
sPoint=nPoint=0;
//栈的准备
int sum=0;
flag=-1;
negative=1;
for(i=0;i<len;i++)
{
if(i==0 && co[0]=='-')
{
negative=-1;
continue;
}
if(co[i]<='9' && co[i]>='0')
{
if(i!=0)
{
if(co[i-1]==')')
{
printf("不合法:右括号后面不能是数字\n");
system("pause");
return;
}
}
flag=0;
sum=sum*10+co[i]-'0';
if(i==len-1)
{
numb[nPoint++]=sum*negative;
sum=0;
negative=1;
}
else if(!(co[i+1]<='9' && co[i+1]>='0'))
{
numb[nPoint++]=sum*negative;
sum=0;
negative=1;
}
}
else //是运算符
{
if(co[i]=='(' ||co[i]==')')
{
if(co[i]=='('&&flag==0)
{
printf("不合法:左括号前面不能是数字\n");
system("pause");
return;
}
else if(co[i]==')'&&flag!=0&&co[i-1]!=')')
{
printf("不合法:右括号前面不能是非右括号运算符\n") ;
system("pause");
return;
}
flag=2;
}
else//不是括号
{
if(sPoint!=0)
{
if(co[i-1]=='('&&co[i]!='(')//非左括号运算符前面不能是左括号
{
if(co[i]=='-')//负号
{
negative=-1;
continue;
}
else if(co[i]=='+')
{
continue;
}
if(co[i]!='(')
{
printf("不合法:左括号后面不能有非括号运算符\n") ;
system("pause");
return;
}
}
}
if(flag==1)
{
printf("不合法:运算符前后不能有除括号以外的运算符\n") ;
system("pause");
return;
}
flag=1;
}
symbol[sPoint++]=co[i];
}
}
//栈准备完毕
a=0;
for(i=0;i<=sPoint;i++)
{
if(symbol[i]=='(')
{
a++;
}
else if(symbol[i]==')')
{
a--;
}
if(a==-1)
{
printf("括号符不匹配\n");
system("pause");
return;
}
}
if(a!=0)
{
printf("括号符不匹配\n");
system("pause");
return;
}
//检查匹配括号完毕
if(sPoint!=0)
{
sPoint--;
}
if(nPoint!=0)
{
nPoint--;
}
//开始计算
int formal,current;
sHead=-1;
nHead=0;
if(symbol[0]=='(')
{
nHead--;
}
while(1)
{
sHead++;
if(nPoint==0)
{
printf("%d",numb[0]);
break;
}
if(sHead==0)
{
continue;
}
formal=findPri(symbol[sHead-1]);
current=findPri(symbol[sHead]);
if(formal==-1 || current==-1)
{
printf("非法字符\n");
system("pause");
return;
}
if(symbol[sHead]!='(')//非左括号
{
nHead++;
}
if(current==3) //括号
{
if(symbol[sHead]=='(')
{
continue;
}
else
{
//消掉括号
if(symbol[sHead-1]!='(')
{
numb[nHead-1]=calc(numb[nHead-1],numb[nHead],symbol[sHead-1]);
for(a=nHead;a<nPoint;a++)
{
numb[a]=numb[a+1];
}
numb[a]=0;
nPoint--;
for(a=sHead-1;a<sPoint;a++)
{
symbol[a]=symbol[a+1];
}
symbol[sPoint]='\0';
sPoint--;
nHead=0;
sHead=-1;
if(symbol[0]=='(')
{
nHead--;
}
continue;//重新开始
}
else
{
for(a=sHead-1;a<=sPoint-2;a++)
{
symbol[a]=symbol[a+2];
}
symbol[sPoint-1]=symbol[sPoint]='\0';
sPoint-=2;
sHead=-1;
nHead=0;
if(symbol[0]=='(')
{
nHead--;
}
continue;//重新开始
}
}
}
if(formal<current)
{
continue;
}
else if(formal>=current && formal!=3)//且不是括号
{
numb[nHead-1]=calc(numb[nHead-1],numb[nHead],symbol[sHead-1]);
for(a=nHead;a<nPoint;a++)
{
numb[a]=numb[a+1];
}
numb[nPoint]=0;
nPoint--;
for(a=sHead-1;a<sPoint;a++)
{
symbol[a]=symbol[a+1];
}
symbol[sPoint]='\0';
sPoint--;
sHead=-1;
nHead=0;
if(symbol[0]=='(')
{
nHead--;
}
continue;
}
}
}
int main()
{
while(1)
{
f();
printf("\n");
}
}
热心网友
时间:2023-07-26 10:27
#include<stdio.h>
int fm,f;
int tf(int a,int b,int m,int n)
{
int i,s;
for(i=b>n?b:n;;i++)
{
if(i%b==0&&i%n==0)
break;
}
fm=i;
if(f)
s=(i/b*a+i/n*m);
else
s=(i/b*a-i/n*m);
return s;
}
int hj(int t,int s)
{
int i;
for(i=t<s?t:s;i>=1;i--)
{
if(t%i==0&&s%i==0)
{
t/=i;
s/=i;
}
}
fm=s;
return t;
}
main()
{
int a,b,m,n,t,s,fz,r,c,ff=0;
char k;
printf("------------------------------------------\n");
printf("[1] 加法[2] 减法\n");
printf("[3] 乘法[4] 除法\n");
printf("[0] 退出\n");
printf("------------------------------------------\n");
do{
printf("请输入你选择的菜单(0--4):");
k1:
scanf("%d",&c);
if(c<0||c>4)
{printf("菜单中没有本选项,请重新输入!");
fflush(stdin);
goto k1;
getchar();
}
printf("请输入第一个分数的分子和分母:");
scanf("%d %d",&a,&b);
printf("请输入第二个分数的分子和分母:");
scanf("%d %d",&m,&n);
switch(c)
{
case 0:return 0;break;
case 1:f=1;t=tf(a,b,m,n);s=fm;k='+';break;
case 2:f=0;t=tf(a,b,m,n);s=fm;k='-';break;
case 3:t=a*m;s=b*n;k='*';break;
case 4:t=a*n;s=b*m;k='/';break;
}
fz=hj(t,s);
printf("%d/%d%c%d/%d=%d/%d\n",a,b,k,m,n,fz,fm);
}while(1);
}
自己编的!!好累!!
热心网友
时间:2023-07-26 10:28
#include<stdio.h>
int fm,f;
int tf(int a,int b,int m,int n)
{
int i,s;
for(i=b>n?b:n;;i++)
{
if(i%b==0&&i%n==0)
break;
}
fm=i;
if(f)
s=(i/b*a+i/n*m);
else
s=(i/b*a-i/n*m);
return s;
}
int hj(int t,int s)
{
int i;
for(i=t<s?t:s;i>=1;i--)
{
if(t%i==0&&s%i==0)
{
t/=i;
s/=i;
}
}
fm=s;
return t;
}
main()
{
int a,b,m,n,t,s,fz,r,c,ff=0;
char k;
printf("------------------------------------------\n");
printf(" [1] 加法 [2] 减法\n");
printf(" [3] 乘法 [4] 除法\n");
printf(" [0] 退出\n");
printf("------------------------------------------\n");
do{
printf("请输入你选择的菜单(0--4):");
k1:
scanf("%d",&c);
if(c<0||c>4)
{ printf("菜单中没有本选项,请重新输入!");
fflush(stdin);
goto k1;
getchar();
}
printf("请输入第一个分数的分子和分母:");
scanf("%d %d",&a,&b);
printf("请输入第二个分数的分子和分母:");
scanf("%d %d",&m,&n);
switch(c)
{
case 0:return 0;break;
case 1:f=1;t=tf(a,b,m,n);s=fm;k='+';break;
case 2:f=0;t=tf(a,b,m,n);s=fm;k='-';break;
case 3:t=a*m;s=b*n;k='*';break;
case 4:t=a*n;s=b*m;k='/';break;
}
fz=hj(t,s);
printf("%d/%d%c%d/%d=%d/%d\n",a,b,k,m,n,fz,fm);
}while(1);
}
热心网友
时间:2023-07-26 10:28
#incl < iostream>
using namsp std;
int ma()
{
double subfd1,sbf2;
co<<"pl inp;
cin>> su;
cout<<"pa inoe;
cin>>sb;
cout<<su+sb;
return 0;
}
以后问问题把问题补全了
热心网友
时间:2023-07-26 10:29
貌似楼上的是大神,linux下编写的哦。