减少Ada程序中语句的缩短方法?

时间:2016-04-30 17:03:25

标签: if-statement ada

我正在创建一个使用if语句执行决策的过程。

我有四个变量:AltitudeVelocityAngleTemperature

程序如下:

procedure Test3 is
begin
   if (Integer(Status_System.Altitude_Measured)) >= Critical_Altitude 
      and  (Integer(Status_System.Velocity_Measured)) >= Critical_Velocity
      and  (Integer(Status_System.Angle_Measured)) >= Critical_Angle
      and  (Integer(Status_System.Temperature_Measured)) >= Critical_Temperature 
   then 
      DT_Put ("message 1");       
   else
      null;
   end if;
end Test3;

这个程序很小便,认为如果每个变量都满足变量的所有关键值,那么它将打印一条消息。

我希望能够有更短的方式来削减陈述,以便我可以做到以下几点:

如果我有4个变量:海拔高度,速度,角度和温度 我希望有一个声明说,如果这些变量中至少有3个(无论哪三个都超过了它们的临界值) 然后显示一条消息。

甚至可以这样做吗?

我不愿意认为我必须为if语句编写每个可能的组合。

简而言之,我想要一个if语句,表明至少有3个变量显示在它们的标题值,所以打印一条消息。

对于这些变量中的至少2个也是如此。

2 个答案:

答案 0 :(得分:4)

首先,您应该尝试使用特定类型的高度,速度,角度和温度。通过使用不同类型,您可以利用Ada提供的强类型,避免混淆或比较高度和温度等错误。您的示例表明它们都是Integer。一个可能的定义可能是(还有许多其他定义):

type Temperature is digits 5 range -273.15 .. 300.0;
type Angle is digits 5 range -180.0 .. 180.0;

这种定义的优点是你可以定义值的范围和精度(捕获器都具有有限的精度)。

计算错误数量是一种方法。 在Ada 2012中,你可以写:

修改

Errors : Natural := 0;
...
Errors := Errors + (if Altitude_Measured > Critical_Altitude then 1 else 0);
Errors := Errors + (if Velocity_Measured > Critical_Velocity then 1 else 0);
Errors := Errors + (if Angle_Measured > Critical_Angle then 1 else 0);
Errors := Errors + (if Temperature_Measured > Critical_Temperature then 1 else 0);
if Errors >= 2 then
  ...
end if;

答案 1 :(得分:1)

Boolean是一个值为(False, True)的枚举类型。与任何枚举类型一样,'Pos属性可用于获取枚举文字列表中值的位置。因此,Boolean'Pos(B)如果B为假,则B等于0,如果True_Count := Boolean'Pos(Integer(Status_System.Altitude_Measured) >= Critical_Altitude) + Boolean'Pos(Integer(Status_System.Velocity_Measured) >= Critical_Velocity) + Boolean'Pos(Integer(Status_System.Angle_Measured) >= Critical_Angle) + Boolean'Pos(Integer(Status_System.Temperature_Measured)) >= Critical_Temperature); 为真,则等于1。

因此你可以说

-XX:+UseParallelGC