设计程序实现分数的运算

设计程序实现分数的运算,第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")

 } 

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8073961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存