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

📄 oilmethod.cpp

📁 本程序是采用VC++和Mysql编写的一款油量换算软件
💻 CPP
字号:
// OilMethod.cpp: implementation of the COilMethod class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "OilTrans.h"
#include "OilMethod.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COilMethod::COilMethod()
{
   K0  =  0;
   K1  =  0;
}

COilMethod::~COilMethod()
{

}
/********************************************
 *Method Name : 
 * SelKn()
 *
 * Select the fuitable K0 and K1
 *参数:
 *  D   密度
 *  x   油品编码
 *********************************************/
void COilMethod::SelKn(double D,int x)
{
	if(x==2){
		K0=k01;
        K1=k11;
     }
     if(x==1){
		 K0=k03;
         K1=k13;
      }
      if(x==0){ 
		  if(D>=653&&D<770){
			  K0=k02[0];
              K1=k12[0];
		  }
          else if(D>=788&&D<839){
			  K0=k02[1];
              K1=k12[1];
          }
          else if(D>=839&&D<=1075){       
              K0=k02[2];
              K1=k12[2];
          }
          else{
			  K0=-0.00336312;
              K1=2680.3206;
		  }
	  }
}
/********************************************
 *Method Name : 
 * Decimal_R()
 *
 * handle roundly the Decimal dNum
 *参数:
 *  dNum   要处理的数值
 *  n      保留几位小数
 *返回
 *   double类型的处理后的数值
 *********************************************/
double COilMethod::Decimal_R5(double dNum, int n)
{
	n--;
	double dTemp = (dNum*pow(10.0,n));
	double dpr =fmod(dTemp,1.0);
    if(fabs(dpr)<0.25)
      dpr=0;
    else if(fabs(dpr)>0.75)
       dpr=1;
    else
       dpr=0.5;
    dNum=(floor(dTemp)+sign(dNum)*dpr)/pow(10.0,n);
    return dNum;

}
/********************************************
 *Method Name : 
 * Decimal_R()
 *
 * handle commonly the Decimal dNum
 *参数:
 *  dNum   要处理的数值
 *  n      保留几位小数
 *返回
 *   double类型的处理后的数值
 *********************************************/
double COilMethod::Decimal_R(double dNum, int n)
{
	double dTemp = (dNum)*pow(10.0,n);
	double dpr =fmod(dTemp,1.0);
	if (dpr<0.5&&dpr>-0.5)
		dpr =0.0;
	else
		dpr =sign(dpr);
    return (dpr+floor(dTemp))/pow(10.0,n);
}
/********************************************
 *Method Name : 
 * Decimal_Tru()
 *
 * handle commonly the Decimal dNum
 *参数:
 *  dNum   要处理的数值
 *  n      保留几位小数
 *返回
 *   double类型的处理后的数值
 *********************************************/
double COilMethod::Decimal_Tru(double dNum, int n)
{
	double dTemp = dNum*pow(10.0,n) -fmod(dNum*pow(10.0,n),1.0);
    return dTemp/pow(10.0,n);
}

/********************************************
 *Method Name : 
 * dntoi()
 *
 * 乘方预算
 *参数:
 *  dX      double类型的数值
 *返回
 *   int类型的处理后的数值
 *********************************************/
int COilMethod::dntoi(double dX)
{
	return (int)dX;
}
/********************************************
 *Method Name : 
 * Diff_20()
 *
 * 计算温度dX与标准温度20的差异
 *参数:
 *  dX      double类型的温度数值
 *返回
 *   double类型的处理后的差异数值
 *********************************************/
double COilMethod::Diff_20(double dX)
{
  return dX-20;
}
/********************************************
 *Method Name : 
 * Diff_15()
 *
 * 计算温度dX与标准温度15的差异
 *参数:
 *  dX      double类型的温度数值
 *返回
 *   double类型的处理后的差异数值
 *********************************************/
double COilMethod::Diff_15(double dX)
{
  return dX-15;
}
/********************************************
 *Method Name : 
 * Coefficient_T()
 *
 * 计算温度校正系数
 *参数:
 *  dT      double类型的温度数值
 *返回
 *   double类型的温度校正系数
 *********************************************/
double COilMethod::Coefficient_T(double dT)
{
  //dCT=1.0-0.000023*x-0.00000002*x*x;
  double dCT =1.000000000;
  dCT = dCT-Decimal_R(0.0000230*dT,9);
  dCT = dCT-Decimal_R(0.000000020*dT*dT,9);
  return dCT;

}
/********************************************
 *Method Name : 
 * Coefficient_TKLZ()
 *
 * 计算热力热力校正系数 当K0<0时使用
 *参数:
 *  dT      double类型的温度数值
 *返回
 *   double类型的热力校正系数
 *********************************************/
double COilMethod::Coefficient_TKLZ(double dK0,double dK1,double rho15)
{
  //alpha=K0+K1/rho15*rho15
  double dCTk = 0.0;
  dCTk = Decimal_Tru(dK1/rho15,6);
  dCTk = Decimal_R(dCTk/rho15,8);
  return Decimal_R(dK0+dCTk,7);
}
/********************************************
 *Method Name : 
 * Coefficient_TKMZ()
 *
 * 计算热力热力校正系数 当K0>=0时使用
 *参数:
 *  dT      double类型的温度数值
 *返回
 *   double类型的热力校正系数
 *********************************************/
double COilMethod::Coefficient_TKMZ(double dK0,double dK1,double rho15)
{
  //alpha=K0/rho15*rho15+K1/rho15
  double dTemp =0.0;
  if(dK0!=0)
  {
	dTemp=Decimal_Tru(dK0/rho15,8);
    dTemp=Decimal_Tru(dTemp/rho15,10);
  }
  dTemp = dTemp + Decimal_Tru(dK1/rho15,10);
  return Decimal_R(dTemp,7);

}
/********************************************
 *Method Name : 
 * Coefficient_V()
 *
 * 计算体积修正系数 
 *参数:
 *  dCTK      double类型的热力校正系数
 *  dDiffT15  温度与15的差异数
 *返回
 *   double类型的体积修正系数
 *********************************************/
double COilMethod::Coefficient_V(double dCTK,double dDiffT15)
{
  //vcf=exp(-dCTK*dDiffT15-0.8*dCTK*dCTK*dDiffT15*dDiffT15)
    double dVcf ,dTemp=1.0;
    dVcf=Decimal_Tru(dCTK*dDiffT15,9);
    dTemp=Decimal_Tru(0.8*dVcf,9);
    dTemp=Decimal_R(dVcf*dTemp,9);
    dVcf=Decimal_Tru(-(dVcf+dTemp),8);
   return Decimal_R(exp(dVcf),6);
}
/********************************************
 *Method Name : 
 * Coeffication_ThermalEx()
 *
 * 计算热力膨胀修正系数 
 *参数:
 *  dCTK      double类型的热力校正系数
 *  dDiffT15  温度与15的差异数
 *返回
 *   double类型的热力膨胀修正系数
 *********************************************/
double COilMethod::Coeffication_ThermalEx(double dK0,double dK1,double rho15)
{
    //alpha15=k0/(rho15*rho15)+k1/rho15
	double dTemp =0.0;
     if(dK0!=0)
     {
       dTemp=Decimal_Tru(dK0/rho15,8);
       dTemp=Decimal_Tru(dTemp/rho15,10);
     }
    return Decimal_R(dTemp+Decimal_Tru(dK1/rho15,10),7);
}
/********************************************
 *Method Name : 
 * Dst_ST()
 *
 * 计算密度修正系数 
 *参数:
 *  dT    温度
 *  dDst  密度
 *  n     油品
 *返回
 *   double类型的密度修正系数
 *********************************************/
double COilMethod::Dst_ST(double dDst, double dT, int nOilType)
{
	double dT_20;
	double vcf,hyc,rhot,rho15,delta15;
	double K0t,K1t,rho15_Next,alpha15,alpha;

    dDst=Decimal_R5(dDst,1);
    dT=Decimal_R5(dT,2);
    dT_20=Diff_20(dT);
    hyc=Coefficient_T(dT_20);
    rhot=Decimal_R(dDst*hyc,2);
    rho15=rhot;
    delta15=Diff_15(dT);
    SelKn(dDst,nOilType);
  
     do
     {
      rho15=rhot;
      K0t=K0;
      K1t=K1;
      rho15_Next=rho15;

      do
       {
         rho15=rho15_Next;
         if(K0>=0)
            alpha=Coefficient_TKMZ(K0,K1,rho15);
          else
            alpha=Coefficient_TKLZ(K0,K1,rho15);
          vcf=Coefficient_DT15(alpha,delta15);
          rho15_Next=Dst_15(rhot,vcf);
        } while(fabs((rho15_Next-rho15))>0.05);

         SelKn(rho15_Next,nOilType);
      }while(K0!=K0t&&K1!=K1t);

      rho15=rho15_Next;
      if(rho15>=770.5&&rho15<=787.5&&nOilType==3)
       {
         alpha15=Coefficient_TKLZ(K0,K1,rho15);
        }
      else
         alpha15=Coeffication_ThermalEx(K0,K1,rho15);
	  vcf=Coefficient_15Vs20(alpha15,dT_20);
      return Dst_20(rhot,vcf);
}
/********************************************
 *Method Name : 
 * Coefficient_DT15()
 *
 * 15校正系数 
 *参数:
 *  dDstR    要判断的数值
 *  dTR    
 *返回
 *   double类型的相对校正系数,
 *********************************************/
double COilMethod::Coefficient_DT15(double dDstR,double dTR)
{
  //vcf=exp(-alpha*delta-0.8*alpha*alpha*delta*delta)
	double dTem,dTemp =0.0;
    dTemp=Decimal_Tru(dDstR*dTR,9);
    dTem=Decimal_Tru(0.8*dTemp,9);
    dTem=Decimal_R(dTemp*dTem,9);
    dTemp=Decimal_Tru(-(dTemp+dTem),8);
   return Decimal_R(exp(dTemp),6);
}
/********************************************
 *Method Name : 
 * Dst_15()
 *
 * 15与20的相对校正系数 
 *参数:
 *  dC20    要判断的数值
 *  dC15    
 *返回
 *   double类型的相对校正系数,
 *********************************************/
double COilMethod::Dst_15(double dDst, double dCft)
{
  return Decimal_R(dDst/dCft,3);

}
/********************************************
 *Method Name : 
 * Coefficient_15Vs20()
 *
 * 15与20的相对校正系数 
 *参数:
 *  dC20    要判断的数值
 *  dC15    
 *返回
 *   double类型的相对校正系数,
 *********************************************/
double COilMethod::Dst_20(double dDst, double dCft)
{
  return Decimal_R(Decimal_Tru(dDst/dCft,3),1);
}
/********************************************
 *Method Name : 
 * Coefficient_15Vs20()
 *
 * 15与20的相对校正系数 
 *参数:
 *  dC20    要判断的数值
 *  dC15    
 *返回
 *   double类型的相对校正系数,
 *********************************************/
double COilMethod::Coefficient_15Vs20(double dC15, double dC20)
{
  /*
  *x=exp(-dC15*dC20-8*dC15*dC15*dC20
  *        -0.8*dC15*dC15*dC20*dC20)
  */
   double dT0,dT1,dT2;
   dT0=Decimal_Tru(dC15*dC20,9);
   dT1=Decimal_Tru(dC15*dT0,9);
   dT1=Decimal_R(dT1*8,9);
   dT2=Decimal_Tru(0.8*dT0,9);
   dT2=Decimal_R(dT0*dT2,9);
   dT0=Decimal_Tru(-(dT0+dT1+dT2),8); 
   return Decimal_R(exp(dT0),6);;  
}
/********************************************
 *Method Name : 
 * sign()
 *
 * 自定义符号函数 
 *参数:
 *  dNum    要判断的数值
 *
 *返回
 *   int类型的符号,如果dNum小于0,返回-1,否则返回1
 *********************************************/
int COilMethod::sign(double dNum)
{
   if (dNum>=0)
	   return 1;
   return -1;
}
/********************************************
 *Method Name : 
 * Cfc_V()
 *
 * 计算体积修正系数 
 *参数:
 *  dT    温度
 *  dDst  密度
 *  n     油品
 *返回
 *   double类型的体积修正系数
 *********************************************/
double COilMethod::Cfc_V(double dT, double dDst, int n)
{
	double K0t,K1t,rho15_Next,vcf,alpha,delta;
    double dDst_R,delta20,rho15,delta15;

	dDst_R=Decimal_R5(dDst,1);
	dT=Decimal_R5(dT,2);
	delta20=dT-20.0;
  
    rho15=dDst_R;
    delta15=5.0;
	SelKn(dDst,n);
    
     do
     {
		rho15=dDst_R;
		K0t=K0;
		K1t=K1;
		rho15_Next=rho15;

        do
        {
           rho15=rho15_Next;
           if(K0>=0)
              alpha=Coefficient_TKMZ(K0,K1,rho15);
           else
              alpha=Coefficient_TKLZ(K0,K1,rho15);
		   
           vcf=Coefficient_DT15(alpha,delta15);
           rho15_Next=Dst_15(dDst_R,vcf);
        } while(fabs(rho15_Next-rho15)>0.05);
        SelKn(rho15_Next,n);
     }while(K0!=K0t&&K1!=K1t);

     rho15=rho15_Next;
     SelKn(rho15_Next,n);

     if(K0>=0)
        alpha=Coefficient_TKMZ(K0,K1,rho15);
     else
        alpha=Coefficient_TKLZ(K0,K1,rho15);
     delta=dT-20.00;
     vcf=Coefficient_15Vs20(alpha,delta);
     if(vcf>=1)
        return Decimal_R(vcf,4);
     else
        return Decimal_R(vcf,5);
    return -1;
}

⌨️ 快捷键说明

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