如何对工程中的数值和单位建模?(另外奉送100分)

fengfeng2003 2003-07-02 07:13:11
一个最简单的例子:
理想气体状态方程PV=RT
已知PVT中的两个可求其余一个参数。若PVT可允许任何合法单位,则在设计过程中应
设计一个单位类将参数的数值部分和单位部分分开(根据:《UML和模式应用》)
具体如何设计呢?
请各位大侠帮忙!多谢!
如给出满意解释或源码说明,另外奉送100分。
...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
digital1 2003-07-06
  • 打赏
  • 举报
回复
有两种方法

1 都在operand中实现,使用方便但是扩展性不好,每次有新操作的时候需要在operand中加函数

2 在operand中实现getstandard(),然后:

int main()
{
Operand V=new Operand(ConcreteUnit1());
Operand T=new Operand(ConcreteUnit2());
const double R=123.4;
Operand P=T*cos(R.getStandard())/sin(V.getStandard());


}

我觉得第二种方式好些

所有程序都是伪代码,没有上机测试,可能存在问题
fengfeng2003 2003-07-06
  • 打赏
  • 举报
回复
To digital1(d_jt)

问题又来了,
如果是一个角度量,定义Operand时不仅有+,-,×,/还要有sin,cos...操作
这些函数要是都定义的话,就会有很多成员函数,这应该怎么办啊。
digital1 2003-07-05
  • 打赏
  • 举报
回复
to stonespace(stonespace)

不建议在客户端
SimpleUnit mmHg("mmHg",10130);

客户端尽量少的知道内容

to fengfeng2003()

traits是stl中实现不一致性的。
如一般的加法都一样,但long double的就不一样,可以用traits

另外,我觉得象单位这种永远不变的东西,无所谓你用多少类来实现,一个原则,客户端使用方便才是最重要的,

unit类我给出的是最简单的实现,如果你要考虑效率和资源占用问题,可以使用singleton模式来实现

如果不想麻烦,我觉得我前面给出的实现方式对本问题是最优考虑
stonespace 2003-07-05
  • 打赏
  • 举报
回复
很简单,就象你说的定义一个Unit基类,也不一定要用template,直接定义为类就行。原来template的参数作为构造函数的参数就行。然后还是原来的思路,用实例定义一个单位:

class SimpleUnit :public Unit
{
public:
virtual double ConvertToStandardUnit(double dbValue);
virtual string Print(double dbValue);
public:
SimpleUnit(string UnitName,double ConversionFactor);
};

SimpleUnit MPa("MPa",1e6);
SimpleUnit mmHg("mmHg",10130);

如果某各单位比如SUnit1不能用比例换算的,可以专门定义一个派生类:
class SUnit1 :public Unit
{
public:
virtual double ConvertToStandardUnit(double dbValue);
virtual string Print(double dbValue);
public:
SUnit1();
};

SUnit1 unit;
overwrite单位换算函数,但是还是用实例表示单位。

其实我认为单位只影响到I/O,所以Unit类只需要有一个把当前单位换算为标准单位的方法就行,然后再有格式化输入输出的方法。

如果要做得很灵活,这些表示单位的实例可以放在一个表中,比如vector<Unit *> vtAllUnit中,然后界面输入输出数据的时候,先在vtAllUnit选择一个单位,用选中单位实例把数据转换之后,再进一步处理。

做的好的话,Unit还应该有一个方法,取得单位适用的物理量的类别,比如是V还是P等等。
digital1 2003-07-04
  • 打赏
  • 举报
回复
另外
PressureUnit<"mmHg",10130> mmHg;
还需要客户知道10130等具体内容,这很不好啊
digital1 2003-07-04
  • 打赏
  • 举报
回复
这种方法挺好的,我也考虑过,不过,单位换算不是只有简单的比例啊,比如温度,华氏,绝对温度之间等等,你是不是还要用traits?


其实类多一点也无所谓啊,

呵呵,其实对大量的相同的简单换算可以gp,其他的就不要用gp了
stonespace 2003-07-04
  • 打赏
  • 举报
回复
>我初步考虑这样:为压力,温度等每一个物理量单位建立类,不知你的想法怎样?

我认为这样处理最好。在设计阶段考虑的类,应该从实现角度去考虑,设计阶段的类应该可以处于不同的状态,并且用数据成员保存状态。“单位”对人来说是一个概念,但是很明显,一个特定的单位本身是没有任何可变化的属性,如果强行设计为一个类,会发现这个类不需要有数据成员,而只有方法。通常如果方法不是很多的话,这种情况不应该设计为类,而应该当作一个“值”,即用一个实例表示,就像你设计的PressureUnit<"MPa",1e6> MPa一样。MPa这个实例表示一个单位。
fengfeng2003 2003-07-04
  • 打赏
  • 举报
回复
To stonespace

这只是我的初步设想,但是具体的实现应该怎样呢,能麻烦你解释一下吗?
我想应该设计一个纯虚构的Unit基类,PressureUnit,TemperatureUnit从Unit派生
得到,而后再生成PressureUnit等的各个具体单位。
还有就是,不是比例换算应如何处理呢?
fengfeng2003 2003-07-04
  • 打赏
  • 举报
回复
To digital1:

对啊,如果不是简单的比例怎么办啊?
你说的traits是什么意思,能给我解释一下吗?
多谢!
digital1 2003-07-03
  • 打赏
  • 举报
回复
说明
Operand(IUnit unit)构造函数少了一个参数,就是operand的数值

在operator*/中调用unit的getstandart方法,或者在operand类中增加getstandart方法,
fengfeng2003 2003-07-03
  • 打赏
  • 举报
回复
压力,温度,比容三个物理量常用的单位加起来有十多个,每一个都派生一个类的话
岂不是要有十多个类,如果在实际应用中变量再多的话,是不是造成了类的爆炸。

我初步考虑这样:为压力,温度等每一个物理量单位建立类,不知你的想法怎样?
template<string UnitName,double ConversionFactor>
class PressureUnit
{
.......
};

PressureUnit<"MPa",1e6> MPa;
PressureUnit<"mmHg",10130> mmHg;
.......
digital1 2003-07-02
  • 打赏
  • 举报
回复
interface IUnit
{
public double getStandard(double in);//根据输入数值计算标准单位数值
}

class ConcreteUnit:public IUnit //某个具体的单位,实现interface中的方法

class Operand//操作数
{
Operand(IUnit unit);
operator*
operator/
}

int main()
{
Operand V=new Operand(ConcreteUnit1());
Operand T=new Operand(ConcreteUnit2());
const double R=123.4;
Operand P=T*R/V;


}

1,265

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 管理版
社区管理员
  • 研发管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧