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

📄 compute.c

📁 浙大《C语言设计基础课程设计》中的例程 有些比较好的代码!
💻 C
字号:
#include "compute.h"

/********************************************************** 
 *  函数原型:void compute()	*
 *  传入参数:无                              	*
 *  返 回 值:无                            	*
 *  函数功能:简单计算器的主处理流程函数	*
 **********************************************************/
void compute()
{
    double  u=0,v=0;          /* u:输入的第1个数, v:输入的第2个数  */
    int     mi=1;             /* 计算器开启标志:0-开启 1-未开启 */
    int     flag=0;           /* 输入数据是否有小数点标志:0-无 1-有 */
    int     sign=0;           /* 是否单击了运算符:0-无 其他-运算符字符 */
    int     x,y,xx=10,yy=10;  /* (x,y)鼠标当前位置 (xx,yy)鼠标前一位置 */
    char   s[9];              /* 存储输入的数字符号(含小数点) */
    int     fget='q';          /* 前一次单击的按钮标签 */
    char    d;                /* 当前单击的按钮标签 */

    int     i,j,a,b;

    putimage(xx,yy,imagep,XOR_PUT);  /* 首次在(10,10)处显示鼠标 */

    while(rightpress()!=1)    /* 单击右键则退出简单计算器 */
    {
    	if(leftpress()!=1)    /* 鼠标左键未单击的处理 */
    	{
    	     get_mouse_position(&x,&y); /* 获取鼠标当前位置 */
    	     if(x!=xx||y!=yy)  /* 鼠标移动处理 */
    	     {
    		      putimage(xx,yy,imagep,XOR_PUT);
    		      xx=x;yy=y;
    		      putimage(x,y,imagep,XOR_PUT);
    	     }
    	}
    	else if(MouseLeftFlag==1)  /* 鼠标左键单击的处理 */
    	{
    	    MouseLeftFlag=0;   /* 置标志为0,防止单击1次左键而多次进入 */ 

    	    d=getnumber(x,y);  /* 得到单击按钮的标签字符 */
    	    a=kx(d);
    	    b=ky(d);
    	    if(a!=0&&b!=0)    /* 显示按钮被单击的过程 */
    	        show(a,b);

    	    if(d=='C')         /* 单击C开始使用 */
    	    {
    	        clearscreen();
    	        outtextxy(OUTX-15,OUTY,"0");
    	        outtextxy(OUTX,OUTY,".");
    	        v=u=0;
    	        sign=0;
    	        flag=0;
    	        i=0;
    	        mi=0;
    	    }
    	    else if('0'<=d&&d<='9')  /* 单击'0'-'9'数字键的处理 */
    	    {
    	     if(mi==1);
    	     else
    	     {
    	      if(d=='0'&&u==0&&flag==0) /* 开始时始终单击'0',就显示0 */
    	      {
    	          i=0;
    	          s[i++]=d;
    	          s[i++]='.';
    	          s[i]='\0';
    	          u=atof(s);
    	    	    outch(u);
    	      }
    	      else
    	      { 
    	    	  if(fget=='C'||fget=='='||fget=='%'||fget=='S')
    	    	  {
    	    		   clearscreen();
    	    		   i=0;
    	    		   s[i++]=d;
    	    		   s[i++]='.';
    	    		   s[i]='\0';
    	    		   u=atof(s);
    	    		   outch(u);
    	    	  }
    	    	  if('0'<=fget&&fget<='9')
    	    	  {
    	    	     if(sign==0) /* 未单击运算符,处理第1个数u */
    	    	     {
    	    		     if(flag==0) /* 输入数据无小数点 */
    	    		     {
    	    		        clearscreen();
    	    		        u=u*10+d-'0';
    	    		        if((u>0&&u<1e8)||(u<0&&u>-1e8))
    	    		        {
    	    		           s[--i]=d;
    	    		           s[++i]='.';
    	    		           s[++i]='\0';
    	    		           u=atof(s);
    	    		           outch(u);
    	    		        }
    	    		        else
    	    		           outch(u);
    	    		     }
    	    		     if(flag==1) /* 输入数据有小数点 */
    	    		     {
    	    		        if(i<=8)
    	    		        {
    	    		           clearscreen();
    	    		           s[i]=d;
    	    		           s[++i]='\0';
    	    		           u=atof(s);
			                   outch(u);
    	    		        }
    	    		     }
    	    	     }
    	    	     if(sign!=0) /* 单击了运算符,处理第2个数v */
    	    	     {
    	    		    if(flag==0)
    	    		    {
    	    		       clearscreen();
    	    		       v=v*10+d-'0';
    	    		       if((v>0&&v<1e8)||(v<0&&v>-1e8))
    	    		       {
    	    		          s[--i]=d;
    	    		          s[++i]='.';
    	    		          s[++i]='\0';
    	    		          v=atof(s);
    	    		          outch(v);
    	    		       }
    	    		       else
    	    		          outch(v);
    	    		    }
    	    		    if(flag==1)
    	    		    {
    	    		       if(i<=8)
    	    		       {
    	    		          clearscreen();
    	    		          s[i++]=d;
    	    		          s[i]='\0';
    	    		          v=atof(s);
			                  outch(v);
    	    		       }
    	    		    }
    	    	     }
    	    	   }
    	    	   if(fget=='+'||fget=='-'||fget=='*'||fget=='/')
    	    	   {
    	    		    clearscreen();
    	    		    i=0;
    	    		    s[i++]=d;
    	    		    s[i++]='.';
    	    		    s[i]='\0';
    	    		    v=atof(s);
    	    		    outch(v);
    	    	   }
    	    	   if(fget=='.') /* 前一次单击的是小数点按钮 */
    	    	   {
    	    		   clearscreen();
    	    		   s[i]=d;
    	    		   s[++i]='\0';
    	    		   if(sign==0)
    	    		   {
			             u=atof(s);
			             outch(u);
    	    		   }
    	    		   if(sign!=0)
    	    		   {
			             v=atof(s);
			             outch(v);
    	    		   }
    	    	   }
    	       }
    	     }
    	   }
    	   else if(d=='+'||d=='-'||d=='*'||d=='/')  
{  /* 单击加,减,乘,除按钮的处理 */
    	      if(sign!=0)
    	      {
    	      	if(fget=='+'||fget=='-'||fget=='*'||fget=='/');
    	      	else
    	      	{
    	      	   if(sign=='/'&&v==0)
    	      	   {
    	      	   	clearscreen();
    	      	   	outtextxy(OUTX-15,OUTY,"E");
    	      	   }
    	      	   else{
    	      	   	u=calculate(u,v,sign);
    	      	   	outch(u);
    	      	   }
    	      	}
    	      }
    	      sign=d;
    	      flag=0;
    	      i=0;
    	   }
    	   else if(d=='=')   /* 单击等号按钮的处理 */ 
    	   {
    	      if(sign!=0)
    	      {
    	      	if(sign=='/'&&fabs(v)<1e-6)
    	      	{
    	      	   clearscreen();
    	      	   outtextxy(OUTX-15,OUTY,"E");
    	      	}
    	      	else
    	      	{
    	      	   u=calculate(u,v,sign);
    	      	   outch(u);
    	      	}
    	      }
    	      flag=0;
    	      sign=0;
    	      i=0;
    	   }
    	   else if(d=='.')   /* 单击小数点按钮的处理 */ 
    	   {
    	     if(flag==0)
    	     	 flag=1;
    	   }
    	   else if(d=='%')  /* 单击百分号按钮的处理 */ 
    	   {
    	      if(sign==0)   /* 如果是第1个数,输出u的百分数 */
    	      	outch(u*100);
    	      if(sign!=0)   /* 是第2个数(单击过运算符),输出v的百分数 */
    	      	outch(v*100);
    	      i=0;
    	   }
    	   else if(d=='S')  /* 单击求平方根按钮的处理 */
         {
    	     if(sign==0)    /*对输入的第1个数求平方根 */
    	     {
    	     	  if(u<0)
    	     	  {
    	     	     clearscreen();
    	     	     outtextxy(OUTX-15,OUTY,"E");
    	     	  }
    	     	  else{
    	     	     u=sqrt(u);
    	     	     outch(u);
    	     	  }
    	     }
    	     if(sign!=0) /*对输入的第2个数求平方根 */
    	     {
    	     	  if(v<0)
    	     	  {
    	     	     clearscreen();
    	     	     outtextxy(OUTX-15,OUTY,"E");
    	     	  }
    	     	  else{
    	     	     v=sqrt(v);
    	     	     outch(v);
    	     	  }
    	     }
    	     i=0;
    	   }
    	   else if(d=='w')   /* 单击+/-按钮的处理 */
    	   {
    	     if(mi==1);
    	     else
    	         if(sign==0)
    	         {
    	         	u=-u;
    	         	outch(u);
    	         }
    	         else
    	         {
    	         	v=-v;
    	         	outch(v);
    	         }
    	   }
    	   else
    	      continue;

	       fget=d;   /* 保存上次单击按钮的标签 */
       } /* End of else if(MouseLeftFlag==1) */
     }   /* End of while(rightpress()!=2) */
}

/********************************************************** 
 *  函数原型:double calculate(double u,double v,int sign)	*
 *  传入参数:u-第1个数  v-第2个数  sign-运算符                       	*
 *  返 回 值:四则运算结果                            	*
 *  函数功能:简单计算器的加、减、乘、除处理	*
 **********************************************************/
double calculate(double u,double v,int sign)
{
	switch(sign)
	{
		case '+':u+=v;break;
		case '-':u-=v;break;
		case '*':u*=v;break;
		case '/':u/=v;break;
	}
	return u;
}


void main()
{
	GraphInit();
	initmouse();
	picture();
	compute();
	closegraph();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -