问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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下编写的哦。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 有没有分数计算器,怎样使用啊 华为nova6se多少钱? 手机上什么计算器即可以算分数又可以简便计算? 华为nova6se价格是什么? 在线分数计算器。 分数乘除法在计算器上怎么按? 计算器怎么计算分数 计算器上怎么表示分数? 魅蓝note5支持同时使用电信和移动双4G吗 冬奥会纪念币每套都一样吗 冬奥会纪念币能用吗? 2022年冬奥会纪念钞到银行能兑换人民币吗? 冬奥会纪念币尺寸具体是多少? 冬奥会纪念钞是限量的吗 冬奥会纪念钞收藏价值 刚注册的微信,显示红色字是什么意思,怎么消除? 冬奥会纪念钞怎么获得 冬奥纪念钞以后有升值空间吗 怎样设置微信红色图标? 微信的那个红色区域是什么,怎么弄的 华为nova6se价格? 怎么在计算器上打出分数? 华为nova6se换个外屏多少钱? 分数计算器在线使用 华为nova6se价格是什么?刚上市价格和现在的价格。 用C#设计分数计算器 华为nova6se换个屏多少钱? 分数计算器 华为nova6se值得入手吗? 这个计算器怎样输入分数 能算整数小数百分数分数的计算器叫什么 华为nvao6se多少钱? 学生用的科学计算器怎样显示分数? 华为Nvos6se多少钱? 怎么用计算器算分数? 学生计算器怎么按分数 华为nova 6se 8+128使用一年后值多少钱? 华为nova6SE,屏幕坏了,换一个多少钱? 华为nova6se外屏碎了换个多少钱? 华为nova6se换个屏幕多少钱?