⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.c

📁 该课程设计通过使用flex和bison编写了一个科学计算器的程序
💻 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 + -