1·分数怎么表示出来,可惜数据类型没有分数。
2·加减乘除怎么办,既然都没有这个数据类型,当然没有相关的数据 *** 作方式。
我给你提供一个思路:
没有数据类型,你可以自己造一个:定义一个结构体,存储两个变量,一个就是分子,一个就是分母。当然你应该有判断机制保证分母不能为零。
加减乘除,这当然你用符号代替了,只是做switch()就搞定,当然,分数的加减乘除规则别乱搞就是了,严格安装分数运算规则编程,然后把结果储存一下。
至于实现多个分数连续运算,你只需写好实现两个分数之间的运算,多个也不过是重复调用它而已。
到这里,思想基本就这么了。
如果你还很怀疑:我是这么做的,可这分数还是无法在显示器上输出啊?别急,你只需要输出这样:“%d/%d”,然后你应该会有所领悟。
如果对小数转化成分数有兴趣,可以在这个基础上研究一下。
#include<stdio.h>int fm,fint tf(int a,int b,int m,int n){ int i,s for(i=b>n?b:ni++) { 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:si>=1i--) { 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 0break case 1:f=1t=tf(a,b,m,n)s=fmk='+'break case 2:f=0t=tf(a,b,m,n)s=fmk='-'break case 3:t=a*ms=b*nk='*'break case 4:t=a*ns=b*mk='/'break } fz=hj(t,s) printf("%d/%d%c%d/%d=%d/%d\n",a,b,k,m,n,fz,fm) }while(1)}自己编的!!好累!!所有数据都可以用分数来表示,比如整数可以认为分母为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=0i<7i++)
{
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=0i<leni++)
{
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=0i<=sPointi++)
{
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=nHeada<nPointa++)
{
numb[a]=numb[a+1]
}
numb[a]=0
nPoint--
for(a=sHead-1a<sPointa++)
{
symbol[a]=symbol[a+1]
}
symbol[sPoint]='\0'
sPoint--
nHead=0
sHead=-1
if(symbol[0]=='(')
{
nHead--
}
continue//重新开始
}
else
{
for(a=sHead-1a<=sPoint-2a++)
{
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=nHeada<nPointa++)
{
numb[a]=numb[a+1]
}
numb[nPoint]=0
nPoint--
for(a=sHead-1a<sPointa++)
{
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")
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)