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

📄 calculate.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
                 err=3;
               break;
    case '*':   if(opd1!=0&&opd2!=0)
                {
                	if((((double)opd1/100.0*opd2)>MAX_VALUE)||(((double)opd1/100.0*opd2)<-MAX_VALUE))
			    		    	err=3;
    						}
                *result=((double)opd1)/100*opd2;
              	break;
    case '/':  
    	       if(opd2==0)
    	       	  err=2;
    	       else
    	       { 
     	         *result=(((double)opd1/100.0)/((double)opd2/100.0))*100;
     	         /*
               	 	mod=opd1%opd2;
                	if(mod>=5&&(*result)>=0)
                  	(*result)++;
                	if(mod>=5&&(*result)<0)
                  	(*result)--; 
               */
             }
             break;
  }
  return err;
}
//========================================================================
uchar LongToString(long num,uchar *str)  //长整型转换为字符串
{
  uchar xdata pos=0,buf[12];
  uchar  xdata m,i,end,temp;

	memset(buf,0,12);
  if(num<0)
  {
    str[pos]='-';
    pos++;
    num=-num;
  }
  else if(num==0)
  {
  	str[0]='0';
  	str[1]='\0';
  	return 0;
  }
  i=0;
  while(num>0)
  {
    m=num%10;
    buf[i]=m+'0';
    num=num/10;
    i++;
  } 
  i=0;
  end=strlen(buf)-1;
  while(i<end)
  {
  	temp=buf[i];
  	buf[i]=buf[end];
  	buf[end]=temp;
  	i++;
  	end--;
  }
  strcpy(str+pos,buf);
  return 0;
}

/*=========================================================
功能:
首先判断ch在*status状态下是否可接受(即str1+str2+ch是否为正确的表达式),
如不可以接受,则返回0,不作任何处理,
如可接受,作如下处理:
   如ch为运算符,str+ch->str2,返回1,
   如ch不为运算符,str2+ch->str2,返回值是2;
参数:str1为在LCD第三行显示的表式,str2为最后操作数表达式,str1+str2为完整
表达式,ch为将要接受的字符。*status为表达式的状态,在不同状态,表达式应接受
字符表达式是不同的。
===========================================================*/
uchar AddCh(uchar *status,uchar *str,uchar ch)
{
  uchar xdata len,ret=100;

  len=strlen(str);
  switch(*status)
  {
    case  0:
      if(ch=='0')    
        *status=1;
      else if(ch>'0'&&ch<='9')
        *status=2;
      else if(ch=='.')
      {
        *status=3;
        str[len]='0';
        len++;
       }
      else
        ret=0;
      if(ret)
      {
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      break;
    case  1:
      if(ch=='.')     
      {
        *status=3;
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      else if(ch>='1'&&ch<='9')
      {
      	*status=2;
      	str[len-1]=ch;
      	str[len]='\0';
      	ret=2;
      }
      else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
      {
        *status=0;
        str[len]=ch;
        str[len+1]='\0';
        ret=1;
      }
      else
        ret=0;          
      break;
    case  2:
      if((ch>='0'&&ch<='9'&&strlen(str)<6))
      {
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      else if(ch==CAL_KEY00&&strlen(str)<5)
      {
        str[len]='0';
        str[len+1]='0';
        str[len+2]='\0';
        ret=2;
      }
      else if(ch=='.')
      {
        *status=3;
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
      {
        *status=0;
        str[len]=ch;
        str[len+1]='\0';
        ret=1;
      }
      else
         ret=0;          
      break;
    case  3:
      if(ch>='0'&&ch<='9')
      {
        *status=4;
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      else if(ch==CAL_KEY00)
      {
      	*status=5;
        str[len]='0';
        str[len+1]='0';
        str[len+2]='\0';
        ret=2;
      }
      else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
      {
        *status=0;
        str[len]=ch;
        str[len+1]='\0';
        ret=1;
      }
      else
         ret=0;          
      break;
    case  4:
      if(ch>='0'&&ch<='9')
      {
        *status=5;
        str[len]=ch;
        str[len+1]='\0';
        ret=2;
      }
      else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
      {
        *status=0;
        str[len]=ch;
        str[len+1]='\0';
        ret=1;
      }
      else
         ret=0;          
      break;
    case  5:
      if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
      {
        *status=0;
        str[len]=ch;
        str[len+1]='\0';
        ret=1;
      }
      else
         ret=0;          
      break;
  }
  return ret;
}

/*=====================================================================
功能:此函数根据str最后一个字符ch(必为运算符)来进行运算,
如ch为'+''-',则进行表达式(除ch外的表达式)进行运算,否则
看此表达式是否有乘除运算,有只需算乘除运算
返回0运算正确,其它值表达式错误!
=====================================================================*/
uchar OperateByStr1(uchar *str)
{
  uchar xdata len,ret,pos,i,k,ch;
  uchar xdata str1[25];
  
  len=strlen(str);
  ch=str[len-1];
  str[len-1]='\0';
  if(ch=='+'||ch=='-')   
  {
    ret=OperateByStr(str);
    if(ret)
      return ret;
  }
  else
  {
    len=len-1;
    for(i=len;i>0;i--)
      if(str[i-1]=='+'||str[i-1]=='-')
        break;
    pos=i;
    k=0;
    while(i<=len)
    {
      str1[k]=str[i];
      k++;
      i++;
    }
    str[pos]='\0';
    ret=OperateByStr(str1);
    if(ret)
      return ret;
    strcat(str,str1);
  }
  len=strlen(str);
  str[len]=ch;
  str[len+1]='\0';
  return 0;
}
//===================================================
uchar CalWaitKey()
{
	uchar key=0;
	
	while(key==0) 
	{
        openbacklight();
		if(low_pwr) return VOID;
        key=get_key();
	}
	
	/*if(key==ADD_KEY)
		key='+';
	else if(key==SUB_KEY)
	 	key='-';
	else */
    /*if(key==MUL_KEY)
		key='*';
	else if(key==DIV_KEY)
		key='-';
	else if(key==KEY00)
		key=CAL_KEY00;*/
	//else if(key=='+'||key=='-')
		//key=0x01;
		
	return key;
}



/*-------------------------------------------------------------------------------
 Funtion: 计算日期 (加减)
 Input  : TUcDateBuf:日期指针;TcDays:加减天数 
 Output : 计算得到的日期指针 date_result 
 Date:    2003-01-18
 Editor: 
----------------------------------------------------------------------------*/
void calc_date(uchar *TUcDateBuf,char TcDays,uchar *date_result)
{
   uchar xdata m_day,i;
   code uchar  date[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//非润年
   code uchar  date_r[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//润年

   ////////////////Bcd to Bin and calculate day/////////////////
   date_result[0] = (TUcDateBuf[0]>>4)*10 +(TUcDateBuf[0]&0xf);
   date_result[1] = (TUcDateBuf[1]>>4)*10 +(TUcDateBuf[1]&0xf);
   date_result[2] = (TUcDateBuf[2]>>4)*10 +(TUcDateBuf[2]&0xf)+ TcDays;
   //////////////润年//////////////////
   if(date_result[0]%4==0) m_day = date_r[date_result[1]-1];
   else m_day = date[date_result[1]-1];
   ////////////////calculate date/////////////////
   if(date_result[2]>m_day) 
   {
      date_result[1] += 1;     
      if(date_result[1]>12) 
      {
	date_result[0] += 1;
	date_result[1] = 1;
      }    
      date_result[2] = 1;
   }
   else if(!date_result[2]) 
   {  
      date_result[1] -= 1;
      if(!date_result[1]) 
      {
	date_result[0] -= 1;
	date_result[1] = 12;
      }     
    if(date_result[0]%4==0)  date_result[2] = date_r[date_result[1]-1];
	else date_result[2] = date[date_result[1]-1];
   }
   for(i=0;i<3;i++) date_result[i] = ((date_result[i]/10)<<4)|(date_result[i]%10);
 }

⌨️ 快捷键说明

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