C语言编程问题:分数计算器 C语言编写一个简单的计算器问题?

\u5206\u6570\u8ba1\u7b97\u5668\u7528C\u8bed\u8a00\u5982\u4f55\u5b9e\u73b0\uff1f\u7f16\u7a0b\u5b9e\u73b0\u5206\u6570\u8ba1\u7b97\u529f\u80fd\uff0c\u8981\u6709\u56db\u5219\u8fd0\u7b97\u7684\u529f\u80fd\uff0c\u4f7f\u7a0b\u5e8f\u80fd\u6b63\u786e\u8bc6\u522b\u5e76\u8ba1\u7b97\u7ed3\u679c\u3002

\u7ed9\u4e2a\u7b80\u5355\u7684\u7a0b\u5e8f\u4f60
#include

#include

typedef
struct
Fraction
{
int
m;
//\u5206\u5b50
unsigned
int
d;
//\u5206\u6bcd
}F;
F
Addition(F
a,F
b);
//\u52a0\u6cd5
F
Subtraction(F
a,F
b);
//\u51cf\u6cd5
F
Multiplication(F
a,F
b);
//\u4e58\u6cd5
F
Division(F
a,F
b);
//\u9664\u6cd5
int
Getm(int
u,unsigned
int
v);//\u6700\u5927\u516c\u7ea6\u6570
void
Output(F
c);//\u663e\u793a
void
main()
{
F
a,b,c;
a.m=-2;
a.d=5;
b.m=3;
b.d=7;
c=Addition(a,b);
Output(c);printf("\n");
c=Subtraction(a,b);
Output(c);printf("\n");
c=Multiplication(a,b);
Output(c);printf("\n");
c=Division(a,b);
Output(c);printf("\n");
}
F
Addition(F
a,F
b)
{
F
c;
int
t,t1;
unsigned
int
t2;
t1=a.m*b.d+a.d*b.m;t2=a.d*b.d;
t=Getm(abs(t1),t2);
c.m=t1/t;
c.d=t2/t;
return
c;
}
F
Subtraction(F
a,F
b)
{
F
c;
c.m=-b.m;
c.d=b.d;
return
Addition(a,c);
}
F
Multiplication(F
a,F
b)
{
F
c;
int
t,t1;
unsigned
int
t2;
t1=a.m*b.m;t2=a.d*b.d;
t=Getm(abs(t1),t2);
c.m=t1/t;
c.d=t2/t;
return
c;
}
F
Division(F
a,F
b)
{
F
c;
c.m=int(b.d);
c.d=unsigned
int(b.m);
if(b.m<0)
c.m=-c.m;
return
Multiplication(a,c);
}
int
Getm(int
m,unsigned
int
d)
{
int
t;
while(d!=0)
{
t=m%d;
m=d;
d=t;
}
return
m;
}
void
Output(F
c)
{
printf("%d",c.m);
if(c.d!=1)
printf("/%d",c.d);
}

#include
int main()
{
int i,i1,i2,num;
while(true)
{
printf("\n");
printf("\n");
printf(" *********************\n");
printf(" * *\n");
printf(" * \u5e38\u89c4\u8ba1\u7b97\u5668 *\n");
printf(" * *\n");
printf(" *********************\n");
printf(" \u8bf7\u9009\u62e9\u4f60\u8981\u8fdb\u884c\u7684\u8ba1\u7b97\uff1a\n");
printf(" 1.\u5e38\u89c4\u8ba1\u7b97\n");
printf(" 2.\u9000\u51fa\n");
printf("\u8bf7\u8f93\u5165\u4f60\u7684\u9009\u62e9\uff1a\n");
scanf("%d",&i);
if(!(i > 0&&i < 3))
{
if(i==1)
{
while(true)
{
system("cls");
printf("\n");
printf("\n");
printf(" 1.\u52a0\n");
printf(" 2.\u51cf\n");
printf(" 3.\u4e58\n");
printf(" 4.\u9664\n");
printf(" 5.\u53d6\u6a21\n");
printf(" 6.\u8fd4\u56de\n");
printf(" 7.\u9000\u51fa\n");
printf("\u8bf7\u8f93\u5165\u4f60\u7684\u9009\u62e9\uff1a\n");
scanf("%d",&i);
if(!(i >0 &&i<7))
{
if(i==1)
{
printf("\u8f93\u51652\u4e2a\u6570\u5b57, \u7528\u7a7a\u683c\u9694\u5f00: ");
scanf("%d %d", &i1, &i2);
num = i1+i2;
printf("\u7ed3\u679c\u4e3a%d\n", num);
}
else if(i==2)
{
printf("\u8f93\u51652\u4e2a\u6570\u5b57, \u7528\u7a7a\u683c\u9694\u5f00: ");
scanf("%d %d", &i1, &i2);
num = i1-i2;
printf("\u7ed3\u679c\u4e3a%d\n", num);
}
else if(i==3)
{
printf("\u8f93\u51652\u4e2a\u6570\u5b57, \u7528\u7a7a\u683c\u9694\u5f00: ");
scanf("%d %d", &i1, &i2);
num = i1*i2;
printf("\u7ed3\u679c\u4e3a%d\n", num);
}
else if(i==4)
{
printf("\u8f93\u51652\u4e2a\u6570\u5b57, \u7528\u7a7a\u683c\u9694\u5f00: ");
scanf("%d %d", &i1, &i2);
num=i1/i2;
printf("\u7ed3\u679c\u4e3a%d\n", num);
}
else if(i==5)
{
printf("\u8f93\u51652\u4e2a\u6570\u5b57, \u7528\u7a7a\u683c\u9694\u5f00: ");
scanf("%d %d", &i1, &i2);
num=i1%i2;
printf("\u7ed3\u679c\u4e3a%d\n", num);
}else if(i==6)
{
break;
}else if(i==7)
{
return 0;
}
else
{
printf("\u8f93\u5165\u6709\u8bef\uff0c\u8bf7\u91cd\u8bd5\uff01");
}
}
}
}
else if(i==2)
{
return 0;
}
else
{
printf("\u8bf7\u91cd\u65b0\u9009\u62e9\uff1a");
}
}
}
}

\u52a0\u4e86\u4e24\u4e2awhile \u548c\u4e24\u4e2aif
if(!(i > 0&&i < 3))\uff1b \u8981\u53bb\u6389 \u201c\uff1b\u201d
if(!(i >0 &&i<7))\uff1b \u53bb\u6389\u201c\uff1b\u201d
\u52a0\u4e86
else if(i==6)
{
break;
}else if(i==7)
{
return 0;
}

所有数据都可以用分数来表示,比如整数可以认为分母为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
");
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("不合法:右括号后面不能是数字
");
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("不合法:左括号前面不能是数字
");
system("pause");
return;

}
else if(co[i]==')'&&flag!=0&&co[i-1]!=')') 
{
printf("不合法:右括号前面不能是非右括号运算符
") ;
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("不合法:左括号后面不能有非括号运算符
") ;
system("pause");
return;
 } 

}
if(flag==1)
{
printf("不合法:运算符前后不能有除括号以外的运算符
") ;
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("括号符不匹配
");
system("pause");
return;
}
}
if(a!=0)
{
printf("括号符不匹配
");
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("非法字符
");
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("
");
 } 
}


#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("------------------------------------------
");
printf(" [1]  加法 [2]  减法
");
printf(" [3]  乘法 [4]  除法
");
printf(" [0]  退出
");
printf("------------------------------------------
");
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
",a,b,k,m,n,fz,fm);
}while(1);
}

自己编的!!好累!!



#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);
}

#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;
}

以后问问题把问题补全了



貌似楼上的是大神,linux下编写的哦。

  • 鐢C璇█鎬庝箞鍐欏嚭涓涓璁$畻鍣?
    绛旓細娓呮绠楁硶灏卞彲浠ュ緢蹇啓鍑猴細锛1锛夊彧闇杈撳叆2涓彉閲弉鍜宻um,涓攕um=n+sum.锛2锛夌‘瀹歯鐨勮寖鍥翠负n<=100 锛3锛夊惊鐜綋涓 for(n=1;n<=100;n++)sum+=n;锛4锛夋牴鎹C璇█缂栬緫瑙勫垯鍐欏嚭绋嬪簭 鐢╢or寰幆姹傦細include<stdio.h> int main(void){ int n,sum=0;for(n=1;n<=100;n++)sum+=n;printf("1...
  • 濡備綍鐢C璇█缂栦竴涓璁$畻鍣?
    绛旓細浜屻佺畻娉曡璁★細1銆佽鍏ュ瓧绗︼紝鐩村埌閬囧埌鎹㈣缁撴潫銆2銆佸浜庢瘡涓瓧绗︼紝鍒ゆ柇鏄瓧姣嶈繕鏄暟瀛楋紝鎴栬呯┖鏍硷紝鎴栬呮槸鍏跺畠瀛楃銆3銆佸浜庢瘡涓瓧绗﹀垽鏂悗锛屽搴旂被鍒璁℃暟鍣鑷姞銆4銆佹渶缁堣緭鍑虹粨鏋溿備笁銆佸弬鑰冧唬鐮侊細include <stdio.h>int main(){ int a,b,c,d,ch; a=b=c=d=0;//璁℃暟鍣ㄥ垵濮嬪寲涓0. whil...
  • 濡備綍鐢C璇█缂栦竴涓璁$畻鍣?
    绛旓細浜屻佺畻娉曡璁★細1. 璇诲彇瀛楃锛岀洿鍒扮敤鎴锋寜涓嬪洖杞﹂敭銆2. 瀵规瘡涓瓧绗﹁繘琛屾鏌ワ紝鍒ゆ柇瀹冩槸瀛楁瘝銆佹暟瀛楋紝杩樻槸绌烘牸鎴栧叾浠栧瓧绗︺3. 鏍规嵁瀛楃绫诲瀷锛屽搴旂殑瀛楃璁℃暟鍣澧炲姞銆4. 鏈鍚庤緭鍑哄悇涓被鍒殑瀛楃鏁伴噺銆備笁銆佹敼杩涘悗鐨勫弬鑰冧唬鐮侊細```c include int main() { int countDigits = 0, countLetters = 0, count...
  • C璇█瀹炵幇璁$畻鍣鐨闂 楹荤儲楂樻墜缁欑湅涓 鍦ㄧ嚎绛
    绛旓細鍔犱釜 getchar();鍦╯canf("%d%c%b",a,c,b,)鐨勪笅闈 鐢ㄦ潵淇濆瓨鍥炶溅閿瘯璇
  • c璇█濡備綍瀹炵幇涓涓皬鍨璁$畻鍣
    绛旓細int main(){float a,b,c;printf("please enter number1:")scanf("%f",&a)printf("please enter number2:")scanf("%f",&b)c = (a+b)/2;printf("the result is %.1f\n",c);return 0;} C璇█缂栧啓绋嬪簭鐨勬柟娉曪細visual c++6.0 鎶ラ敊姣旇緝鍑嗙‘锛屼絾姣旇緝闅剧敤銆傛槸寰蒋鎺ㄥ嚭鐨勪竴娆剧紪璇戝櫒锛屾槸...
  • 鎬!C璇█闂璁捐涓涓皬璁$畻鍣
    绛旓細include <stdio.h> include <stdlib.h> include <process.h> include <string.h> define N 100 double numStack[N]={0};int numTop;char opStack[N];int opTop;int op(char ch){ if(ch=='+'||ch=='-') return 2;if(ch=='*'||ch=='/') return 3;if(ch=='(') return -...
  • 鐢C璇█缂栧啓甯歌璁$畻鍣
    绛旓細涓昏鏄繖浜涳紝濂藉ソ鍔姏鍚э紒include<stdio.h> include<math.h> include<malloc.h> double jisuan(char a[]){ int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;char nibo[50],zhan2[50];double x,n,l,z=0,zhan3[50];typedef struct { double d1;int d2;}dd;typedef struct { dd data[...
  • 濡備綍鐢C璇█缂栫▼鍒朵綔涓涓畝鏄璁$畻鍣?
    绛旓細灏哻瀹氫箟涓洪夋嫨璁$畻鏂瑰紡鐨勫彉閲忋傜敤switch璇彞锛屽皢c浣滀负閫夋嫨鍙橀噺锛屽~鍐欒绠楁柟寮忕殑閫夐」锛屾渶鍚庡湪涓诲嚱鏁颁腑杈撳叆涓涓緭鍑哄嚱鏁版潵杈撳嚭璁$畻寮忓強缁撴灉鍗冲彲瀹屾垚绋嬪簭鐨勭紪鍐欙細3銆佽繍琛岀紪璇戞煡璇紝杈撳叆涓涓櫎娉曠殑璁$畻楠岃瘉涓涓嬶紝鍙戠幇绋嬪簭杈撳嚭浜嗗皬鏁帮紝璇存槑绋嬪簭杩愯姝e父銆備互涓婂氨鏄敤C璇█缂栧啓璁$畻鍣鐨勬祦绋嬶細
  • 鐢ㄧ畝鍗c璇█缂栧啓璁$畻鍣
    绛旓細include"stdio.h"/*棰勫鐞嗗懡浠*/ void main()/*涓诲嚱鏁*/ { double a,b;/*鍙岀簿搴﹀疄鍨嬪彉閲忚鏄*/ char c,d;/*鍙橀噺璇存槑*/ do /*寰幆浣*/ { printf("input a (-*/)b\n");/*杈撳叆鎻愮ず*/ scanf("%lf%c%lf",&a,&c,&b);/*杈撳叆绠楁湳琛ㄨ揪寮*/ if(c=='')/*鍒ゆ柇 / printf("=...
  • C璇█ 瑕佹眰缂栧啓涓涓畝鍗璁$畻鍣鐨勭▼搴
    绛旓細include<stdio.h>void main() { float x,y,z; char c; scanf("%f%c%f",&x,&c,&y); switch ( c ) { case '+': z=x+y; break; case '-': z=x-y; break; case '*': z=x*y; break; case '/': z=( y==0 )?(0):(x/y); break; default:...
  • 扩展阅读:学编程一年大概多少钱 ... c十十编程教学视频 ... 信息学奥赛c++编程 ... 计算机编程学校排名 ... c++入门程序代码 ... 吓人的编程代码 ... 初学编程必背50个 ... 为什么不建议孩子学编程 ... c#考试题库 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网