设为首页 加入收藏

TOP

VC++6.0物资分配软件实例分析(四)
2012-11-04 15:21:04 来源: 作者: 【 】 浏览:640
Tags:6.0 物资 分配 软件 实例分析
  4.模型的程序实现

  对于物资分配问题,用软件来实现,其流程如下:



  所以程序主要分为三个模块:数据读入模块;分配处理模块和结果保存输出模块。

  4.1数据读入模块代码:

  定义对象CDaoDatabase m_DB;用于数据库操作。定义全局变量m_ApplyArray、m_GalleryArray、m_DistributionArray,分别用于保存申请计划信息、库存信息和分配结果输出信息。定义全局变量float Class[10];用于保存各个优先级类的权系数变量。

  在读写数据库前,首先要打开数据库。

//打开数据库
if(m_DB.IsOpen())m_DB.Close();m_DB.Open("数据库名");

  读取申请数据、物资库存数据,并将单位信息存储到结果输出m_DistributionArray结构中。

CDaoRecordset m_Set(&m_DB);COleVariant var;
m_Set.Open(dbOpenDynaset,"Select * from Apply");
m_ApplyArray.RemoveAll();
m_DistributionArray.RemoveAll();
while(!m_Set.IsEOF())
{
Apply* m_Apply= =new Apply;
Distribution *m_Distribution=new Distribution;
var = m_Set.GetFieldValue(0);
m_Apply ->Code=var.intVal;
m_Distribution->Code=var.intVal;
var = m_Set.GetFieldValue(1);
m_Apply ->Name=CCrack::strVARIANT(var);
m_Distribution->Name=m_Apply ->Name;
var = m_Set.GetFieldValue(2);
m_Apply ->Class=var.intVal;
var = m_Set.GetFieldValue(3);
m_Apply ->NQ1= var.fltVal;
var = m_Set.GetFieldValue(4);
m_Apply ->NQ2= var.fltVal;

var = m_Set.GetFieldValue(i+2);
m_Apply ->NQi= var.fltVal;
m_ApplyArray.Add(m_Apply);
m_DistributionArray.Add(m_Distribution);
m_Set.MoveNext();
}
m_Set.Close();
m_Set.Open(dbOpenDynaset,"Select * from Gallery");
while(!m_Set.IsEOF())
{
Gallery* m_Gallery = =new Gallery;
var = m_Set.GetFieldValue(0);
m_Gallery ->Code=var.intVal;
var = m_Set.GetFieldValue(1);
m_Gallery ->Name=CCrack::strVARIANT(var);
var = m_Set.GetFieldValue(2);
m_Gallery ->SQ1=var.fltVal;
var = m_Set.GetFieldValue(3);
m_Gallery ->SQ2= var.fltVal;

var = m_Set.GetFieldValue(i+1);
m_Gallery ->SQi= var.fltVal;
var = m_Set.GetFieldValue(i+2);
m_Gallery ->RQ1=var.fltVal;
var = m_Set.GetFieldValue(i+3);
m_Gallery ->RQ2= var.fltVal;

var = m_Set.GetFieldValue(2i+1);
m_Gallery ->RQi= var.fltVal;
m_GalleryArray.Add(m_Gallery);
m_Set.MoveNext();
}
m_Set.Close();
if(m_DB.IsOpen())m_DB.Close();

  4.2物资分配模型主要函数

  ①第种物资的总申请量函数为

float Q()
{
float Q=0;//对第 种物资的总申请量
int a=m_ApplyArray.GetSize();
for(int j=0;j<a;j++)
{Apply* m_Apply= m_ApplyArray.GetAt(j);Q+=m_Apply->NQi;}
return Q;
}

  ②第种物资的总可供量函数为

float S()
{float S=0; //第 种物资的总可供量
a=m_ApplyArray.GetSize();
for(j=0;j<a;j++)
{Apply* m_Gallery= m_ Gallery Array.GetAt(j);
S+=m_Gallery->SQi-m_Gallery->RQi;
}
}

  ③分配算法主函数:

  由于我们考虑到实际应用中,不同情况下会有不同的分配原则(讨论如前),所以软件应该允许用户根据实际情况灵活选择分配方法。我们定义一个全局变量int method;它的取值为1、2、3、4,分别表示用户采用按照满足单位最多的原则、按照申请比例进行分配的原则、按优先级逐级保障分配法、按优先级削减分配法四种分配方法。对应的分配函数为DisFunciont1()、DisFunciont2()、DisFunciont3()、DisFunciont4().

void Distribution()
{ float S=S();float Q=Q();
if(S>=Q)
{//各单位分得的物资量等于其申请量
int a=m_DistributionArray.GetSize();
int b=m_ApplyArray.GetSize();
for(int i=0;i<a;i++)
{
int code= m_DistributionArray.GetAt(i)->Code;
for(int j=0;j<b;j++){if (code== m_ApplyArray.GetAt()->Code;) m_DistributionArray.GetAt(i)->DQi =m_ApplyArray.GetAt(j)->NQi }
}
}else
{
if(method==1) DisFunciont1();else if(method==2) DisFunciont2();else if(method==3) DisFunciont3();else if(method==4) DisFunciont4();else ::AfxMessageBox("出错啦!");
}
}


  四个分配函数的模型前面已经讨论过了,这里就不一一写出代码了。

  4.3分配结果数据存储模块

//打开数据库
if(m_DB.IsOpen())m_DB.Close();m_DB.Open("数据库名");
CString strSQL;
int a=m_DistributionArray.GetSize();
for(int i=0;i<a;i++)
{strSQL.Format(
"insert into Distribution values
(%d,'%s',%f,%f,…,%f)",m_DistributionArray.GetAt(i)->Code, m_DistributionArray.GetAt(i)->Name, m_DistributionArray.GetAt(i)->DQ1, m_DistributionArray.GetAt(i)->DQ2,…, m_DistributionArray.GetAt(i)->DQi);
m_DB.Execute(strSQL);
}
if(m_DB.IsOpen())m_DB.Close();

  把上述函数打包成模块,可以在需要的时候调用用于保存分配结果数据。
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC实现应用程序在线升级 下一篇用VC++构建树视图控件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: