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

fengfeng2003 2003-07-02 07:13:11
一个最简单的例子:
理想气体状态方程PV=RT
已知PVT中的两个可求其余一个参数。若PVT可允许任何合法单位,则在设计过程中应
设计一个单位类将参数的数值部分和单位部分分开(根据:《UML和模式应用》)
具体如何设计呢?
请各位大侠帮忙!多谢!
如给出满意解释或源码说明,另外奉送100分。
...全文
70 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章课程定位与教学案例综述. 1.1职业岗位能力需求析 1.2课程设置和课程定位析 1.3WebShop电子商城介绍 1.3.1电子商城需求析 1.3.2电子商城系统设计 1.3.3电子商城数据库设计 1.4LibraryMIS图书管理系统介绍 1.4.1图书管理系统需求析 1.4.2图书管理系统系统设计 1.4.3图书管理系统数据库设计 习题 第2章面向对象技术和建模基础 2.1面向对象方法 2.1.1面向对象方法的基本思想 2.1.2面向对象方法的发展 2.2面向对象的基本概念与特征 2.2.1面向对象的基本概念 2.2.2面向对象的主要特征 2.3面向对象析 .2.3.1处理复杂问题的原则 2.3.200A方法的基本步骤 2.4面向对象设计 2.5面向对象实现 2.6面向对象方法的内涵 2.7软件建模概述 2.7.1软件建模的概念 2.7.2软件建模的用途 2.7.3软件建模的优点 习题 第3章UML简介 3.1UML的发展 3.1.1UML的发展历程 3.1.2理解UML建模 3.2UML的特点 3.3UML的结构 3.3.1UML的事物 3.3.2UML的关系 3.4UML的视图 3.4.1用例视图 3.4.2逻辑视图 3.4.3并发视图 3.4.4组件视图 3.4.5部署视图 3.5UML图形符号 3.5.1用例图 3.5.2类图 3.5.3对象图 3.5.4状态图 3.5.5活动图 3.5.6顺序图 3.5.7协作图 3.5.8组件图 3.5.9部署图 3.5.10UML 2.0新特性 3.6UML建模基本流程 习题 第4章UML建模工具简介 4.1常用UML建模工具 4.1.1 Rational Rose 4.1.2Enterprise Architect 4.1.3Together 4.1.4PowerDesigner 4.1.5 Visi0 4.1.6Tnffun Plat0 4.2Rational Rose安装与配置 4.2.1Rational Rose的运行环境 4.2.2Rational Rose的安装 4.2.3Rational Rose的配置 4.3使用Rational Rose建模 4.3.1Rational Rose主菜单 4.3.2Rational Rose的视图 4.3.3 Rational Rose建模的基本过程 习题 第5章需求建模 5.1用例模型概述 5.2用例图组成 5.2.1参与者 5.2.2系统 5.2.3用例 5.3识别和描述用例.. 5.3.1识别用例 5.3.2绘制WebShop电子商城用例图 5.3.3通过包对用例进行合理规划 5.3.4WebShop电子商城用例图(不含关系) 5.3.5用例描述 5.4用例间的关系 5.4.1泛化关系 5.4.2使用关系 5.4.3包含关系 5.4.4扩展关系 5.4.5关系小结 5.4.6WebShop电子商城用例图(含关系) 习题 第6章静态建模 6.1静态建模概述 6.2类图概述 6.3类图的基本组成 6.3.1类的概述 6.3.2绘制带属性的实体类 6.3.3绘制带操作的实体类 6.3.4绘制边界类图 6.3.5绘制控制类图 6.3.6UML的类与语言的类 6.4类之间的关系 6.4.1关联关系 6.4.2聚合关系 6.4.3组合关系 6.4.4泛化关系 6.4.5实现关系 6.4.6依赖关系 6.5对象图 6.5.1对象图概述 6.5.2对象图组成 6.5.3类图和对象图的比较 习题 第7章数据库建模 7.1PowerDesigner简介 7.2PowerDesigner安装和启动 7.2.1PowerDesigner的安装 7.2.2PowerDesigner的启动 7.3PowerDesigner概念数据模型 7.3.1概念数据模型概述 7.3.2PowerDesigner概念数据模型概述 7.4 PowerDesigner物理数据模型 习题 第8章动态建模 8.1动态建模概述 8.2状态图 8.2.1状态图概述 8.2.2状态图组成 8.2.3绘制员工下班回家状态图 8.3活动图 8.3.1活动图概述 8.3.2活动图组成 8.3.3绘制WebShop电子商城活动图 8.4活动图拾遗 8.4.1活动图与流程图的比较 8.4.2活动图与状态图的比较 8.5顺序图 8.5.1顺序图概述 8.5.2顺序图组成 8.5.3绘制WebShop电子商城顺序图 8.6协作图 8.6.1协作图概述 8.6.2协作图组成 8.6.3绘制WebShop电子商城协作图 8.7 顺序图拾遗 8.7.1 顺序图与协作图的比较 8.7.2 顺序图与协作图的互换 习题 第9章物理建模 9.1物理建模概述 9.1.1硬件 9.1.2软件 9.2组件图 9.2.1组件图概述 9.2.2组件图组成 9.2.3绘制WebShop电子商城组件图 9.3部署图 9.3.1部署图概述 9.3.2部署图组成 9.3.3绘制WebShop电子商城部署图 习题 第10章双向工程 10.1双向工程简介 10.2正向工程(生成Java代码) 10.3逆向工程 习题 第11章统一软件过程RUP 11.1RUP简介 11.2RUPT作流程 11.2.1业务建模 11.2.2需求 11.2.3析设计 11.2.4实施 11.2.5测试 11.2.6部署 11.2.7配置与变更管理 11.2.8项目管理 11.2.9环境 11.3RUP迭代过程 11.3.1初始 11.3.2细化 11.3.3构造 11.3.4移交 11.3.5迭代计划示例(构造阶段) 习题 附录A综合实训 附录B Rational Rose2003主菜单 参考文献...

1,268

社区成员

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

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