ADA程序实例(类型、控制流、转换、简单数学运算等)

以下是ADA实现的质因数分解程序,其等价C#程序可见:

http://topic.csdn.net/u/20111112/18/2bf17a93-862d-458e-91d7-8682dc899315.html


(由于没有专门的ADA代码显示模板,只能选择最相近的Delphi模板,故关键字标识会不正常)

首先是功能单元模块(package)的声明文件(prime-factors-resolver.ads):

with Ada.Containers.Doubly_Linked_Lists; use Ada.Containers;

package prime_factors_resolver is
  -- instantiate a generic package and use its content
  package Int_List is new Doubly_Linked_Lists(Integer);
  use Int_List;

  function resolve(number : Integer) return List;

end prime_factors_resolver;


接下来是功能单元的实现文件(prime-factors-resolver.adb):

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Numerics.Generic_Elementary_Functions;
use  Ada.Numerics;

package body prime_factors_resolver is
  package Float_Functions is new Generic_Elementary_Functions(Float);
  use Float_Functions;

  function resolve(number : Integer) return List is
    list_of_factors : List;
    list_of_primes : List; -- list of primes encountered so far
    k : Integer := 2;	-- prime number starts from 2
    value: Integer;
  begin
    if number < 2 then
      list_of_factors.Append(number);
      return list_of_factors;
    end if;

    value := number;

    -- see, ada supports this also now in its latest version
    -- originally it had to be Append(list_of_primes, k);
    list_of_primes.Append(k);

    mainloop:	-- named loop for specific quiting
    while true loop
      if value = k then	-- value is k straight
        list_of_factors.Append(k);
        exit mainloop;	-- exit specific loop (in this case the immediate loop)
      elsif value rem k = 0 then	-- value is divisible by k
        Append(list_of_factors, k);
      	value := value / k;
      else 	-- value is greater than and indivisible by k
        declare	-- make use of block to declare block-wide variables
          is_prime: Boolean := true;
          prime_number : Integer;
        begin
          if k = 2 then
            k := 1;	-- go backwards by one for this special case
          end if;
          loop	-- loop to find the prime number next to k
            k := k + 2;

            is_prime := true;
            for prime_cursor in list_of_primes loop
              prime_number := element(prime_cursor);
              if k rem prime_number = 0 then
                is_prime := false;
              	exit;
              elsif prime_number > Integer(Float'Floor(Float(k)**0.5)) then
                exit;
              end if;
            end loop;
            exit when is_prime;	-- this is equivalent to 'until' condition
          end loop;	-- the next prime number found

          list_of_primes.Append(k);
        end;
      end if;
    end loop mainloop;

    return list_of_factors;
  end resolve;

begin
  put_line("Resolver successfull loaded.");

end prime_factors_resolver;


最后是调用这个模块的主程序(main.adb):

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed;  use Ada.Strings.Fixed;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with prime_factors_resolver; use prime_factors_resolver;
use prime_factors_resolver.Int_List;  -- have to be that defined immediately

procedure main is
  user_input : String(1..32) := 32 * " "; -- a way to create string with spaces
  user_input_len : Integer;
  number : Integer;
  list_of_factors : Int_List.List;
  factor : Integer; 	 -- the value of the item the cursor pointing to
  first_factor : Boolean := true;
begin
  
  put("Input a number: ");
  get_line(user_input, user_input_len);
  number := Integer'Value(user_input);	-- a system provided way of conversion

  put(number);
  put(" = ");
  list_of_factors := resolve(number);
  for factor_cursor in list_of_factors loop
    factor := Element(factor_cursor);
    if first_factor then
      first_factor := false;
    else
      put(" * ");
    end if;
    put(factor, 0);	-- 0 to indicate leaving no spaces around the number
  end loop;

end main;


这里面有几点注意,(以前学的时候也可能忽略,有些可能是近期ADA版本的新属性)

1. ADA最新版本支持以对象Instance为主体的方法调用(可以像C#和Java那样用点“.”来访问对象的方法),就像以上的Append方法,但条件是这个方法定义的第一参数(潜在的接入主体)必须是tagged定义的record,即使能了object oriented的ADA数据。例如对Cursor类型的Element方法就不能这样用,因为Cursor没有tagged。

2. ADA中使用一个功能提供者的交互的数据结构(就像函数参数,返回值),其类型需要从这个功能提供者这边直接得到,而不是从源头得到,就像例子中的List。这和C#是不一样的(对我而言我倒更接受ADA这种处理,虽然有时有些麻烦了点)。

3. 泛型包(Generic Package)的实例化要加new关键字。

4. 好多Attribute要记(ADA里的Attribute指一种基于类型的功能方法,他们都是系统内建的(还是可能供用户定义?可能性不大))。

5. ADA的运算符重载的广度肯定在C#之上(但,当然,在C++之下:))。

6. ADA的可带类型限制的泛型定义的广度和表达力极可能完全在C#之上。


从这个例子可以看出ADA十分严谨(我认为它是世界上最严谨的语言),而功能全面超越所有Pascal系语言(除了一些OO特性如多态性需要进一步研究考证),而且有大量的类型定义和处理特性和面向对象特性有待探索。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
保留原有所有功能,新增直接从mapinfo图层输出googleearth kml文件的工具。 Mapinfo 2 Googleearth 将ADA_CDMATool基础上生成的CDMA_Cell_Map_NB图层直接转为googleearth的kml文件。 kml保留扇区的三叶草图形,全向站用六边形标识。 ///////原有功能///////// ADA CDMA Tool Help 扇区信息表格式 扇区信息表:CdmaCellInfo.xls。 “Bearing”列为方位角,“radius”列为半径,“FREQ”列为不同频率,“H_BeamWidth”为扇区水平瓣宽,“Longitude”经度,“Latitude”纬度。 “扇区类型”列用“射频拉远”标识是否RRU站。 “基站名”列标识站名或者射频拉远站的施主站名。 “物理地址”列标识实际站点站名。 “NeighborNumber”列保存对应扇区的邻小区数。 “N01”记录第一个邻小区的小区号,必须放在第24列。 Make Cell 用来生成扇区结构的mapinfo图层,用不同的方位角和半径来区分同一物理地址不同频点的扇区。 扇区信息表:CdmaCellInfo.xls,放在和本插件同一目录下。 并在同一目录下生成图层CDMA_Cell_Map_NB。 下图即为生成的基站扇区图,圆形为全向站(包括室分系统) 注:以下所有的工具均需要在生成的CDMA_Cell_Map_NB图层上工作! RRU Line 用来生成RRU站和施主站之间的连线。 用箭头工具点击扇区,如果扇区是RRU站则画出其与施主站之间的连线。 用RECT工具进行区域选择,程序会将区域范围内的RRU站与施主站之间连线。 Draw RRU Line all 一次性生成CDMA_Cell_Map_NB图层中所有RRU站与其施主站间的连线。 注:生成全网的RRU联线,所需时间较长。 Find PN 用来查找CDMA_Cell_Map_NB图层中所有指定PN的扇区,填充颜色并标注PN。 可以用此来检查PN复用距离。 下图为find PN 274的结果,标注PN 274 并红色填充对应扇区。 NB Check 显示所选择扇区的所有邻小区并用颜色填充。 可以用此来查看是否有明显的PN漏配。 如果点击选择的位置有多个扇区时,会弹出选择对话框供用户确定扇区。 PN One Way Check 点击图层,输出所点击扇区的邻小区重复PN信息,或者多余邻小区信息(多余邻小区为小区号已经不在现网中)。 注:PN One Way 和 Two way与某一地点的覆盖有很大关系,并不仅仅是邻小区设置的问题,程序中只是检查了基站邻小区的PN是否有重复 PN Two Way Check 检查所点击扇区的邻小区、所有二次邻小区(邻小区的邻小区)之间的PN是否有重复。如果二次邻小区PN重复,则可能存在PN Two way的风险 print出PN Two way点位的Cell信息,在map上连线,显示造成Two way 的邻小区路径。 注:此程序运行时间视邻小区个数与PN重复数有关,在2min~10min左右 注:PN One Way 和 Two way与某一地点的覆盖有很大关系,并不仅仅是邻小区设置的问题,程序中检查了基站邻小区、所有二次邻小区的PN是否有重复 PN Two Way Check 2 检查所点击扇区的邻小区与二次邻小区之间的PN复用关系,不检查二次邻小区之间的复用关系。 用不同的颜色填充和连线显示出可能存在的PN Two Way,此工具检查出来的PN Two Way结果比PN Two Way Check检查出来的结果更有风险。 话统数据分析 选择需要分析的数据列,或者输入需要分析的数据列(输入的列名要与CdmaCellInfo.xls中的列名完全一致),输入分析数据的最大值和5类层级的填充颜色和范围。用不同的颜色标识属于不同范围的扇区,并用图示标识出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值