📄 calculator.c
字号:
/*Called by yyparse on errer*/
void yyerror(char const *s)
{
printf("%s\n",s);
}
struct init
{
char const *fname;
double (*fnct) (double);
};
struct init const arith_fncts[]=
{
"sin",sin,
"cos",cos,
"tan",tan,
"asin",asin,
"acos",acos,
"atan",atan,
"ln",log,
"exp",exp,
"sqrt",sqrt,
0,0
};
/*The symbol table:a chain of 'struct symrec'.*/
symrec *sym_table;
/*Put arithmetic functions in table.*/
void init_table(void)
{
int i;
symrec *ptr;
for(i=0;arith_fncts[i].fname!=0;i++)
{
ptr=putsym(arith_fncts[i].fname,FNCT);
ptr->value.fnctptr=arith_fncts[i].fnct;
}
}
int main(void)
{
init_table();
return yyparse();
}
symrec* putsym(char const *sym_name,int sym_type)
{
symrec *ptr;
ptr=(symrec*)malloc(sizeof(symrec));
ptr->name=(char*)malloc(strlen(sym_name)+1);
strcpy(ptr->name,sym_name);
ptr->type=sym_type;
ptr->value.var.a=0;ptr->value.var.b=1;
ptr->next=(struct symrec*)sym_table;
sym_table=ptr;
return ptr;
}
symrec* getsym(char const *sym_name)
{
symrec *ptr;
for(ptr=sym_table;ptr!=(symrec *)0;ptr=(symrec *)ptr->next)
if(strcmp(ptr->name,sym_name)==0) return ptr;
return 0;
}
int maxgys(number Num)/*求分子与分母的公约数。*/
{
int m,n,r,temp;
m= Num.a;n= Num.b;
if(m<n)
{
temp=m;
m=n;
n=temp;
}
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
return n;
}
void Display1(number Num)/*显示分数形式*/
{
int m=Num.a,n=Num.b;
printf("\t%d",m/maxgys(Num));
if(n/maxgys(Num)!=1)/*当分母不为1时,*/
{
printf("%c",'/');
printf("%d\n",n/maxgys(Num));
}
else printf("\n");/*若分母为1,则不予显示。*/
}
void Display2(int P,number Num)/*显示带精度的数*/
{
switch(P)
{ case 0:printf("\t%.0f",Num.a/Num.b);break;
case 1:printf("\t%.1f",Num.a/Num.b);break;
case 2:printf("\t%.2f",Num.a/Num.b);break;
case 3:printf("\t%.3f",Num.a/Num.b);break;
case 4:printf("\t%.4f",Num.a/Num.b);break;
case 5:printf("\t%.5f",Num.a/Num.b);break;
case 6:printf("\t%.6f",Num.a/Num.b);break;
case 7:printf("\t%.7f",Num.a/Num.b);break;
case 8:printf("\t%.8f",Num.a/Num.b);break;
case 9:printf("\t%.9f",Num.a/Num.b);break;
case 10:printf("\t%.10f",Num.a/Num.b);break;
default:printf("\t%.10f",Num.a/Num.b);break;
}
}
void Display3(int P,number Num)/*以科学计数法显示*/
{
switch(P)
{
case 1:printf("\t%.1e",Num.a/Num.b);break;
case 2:printf("\t%.2e",Num.a/Num.b);break;
case 3:printf("\t%.3e",Num.a/Num.b);break;
case 4:printf("\t%.4e",Num.a/Num.b);break;
case 5:printf("\t%.5e",Num.a/Num.b);break;
case 6:printf("\t%.6e",Num.a/Num.b);break;
case 7:printf("\t%.7e",Num.a/Num.b);break;
case 8:printf("\t%.8e",Num.a/Num.b);break;
case 9:printf("\t%.9e",Num.a/Num.b);break;
case 10:printf("\t%.10e",Num.a/Num.b);break;
default:printf("\t%.4e",Num.a/Num.b);break;
}
}
void Display(number Num)/*显示结果*/
{
double c;
int Precision,Flag;
printf("Set the precision(0-10):");
scanf("%d",&Precision);
printf("Set the way of displaying(0:General notation;1:Scientific notation):");
scanf("%d",&Flag);
if(modf(Num.a,&c)==0 && modf(Num.b,&c)==0 && Num.b!=1)
{
printf("Result:");
Display1(Num);
}
else if(Flag==0)
{
printf("Result:");
Display2(Precision,Num);
}
else
{
printf("Result:");
Display3(Precision,Num);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -