Ada 程序设计语言(The Ada Programming Language)[第四集]- -

第6章 子程序(Subprogram)
6.1 概述 (Overview)
一个程序是由一个或更多的子程序组成,以一个主过程(main procedure)为根本,主过程类似与 C 下的 main 函数。子程序包括过程(proceudre)和函数(function)两类,两者区别在于,过程没有返回值,而函数有返回值。
子程序,包括函数和过程,以及下一章所讲述的程序包,是构成 Ada 程序 的基础。Ada 提供了一些和 C、Pascal 不同的新特性,如重载、参数模式、分离程序等。
6.2 过程(Procedure) 过程我们以前已经见过了,但那些都是主过程(main procedure),即程序的主体部体,作用和C下的 main 函数相似。一般情况下,Ada 程序的主程序名应当和该主程序所在的文件名相同。过程的声明格式如下:
procedure

procedure_name ( parameter_specification);

它的执行部份则为:
procedure

procedure_name ( parameter_specification) is
    declarations;
begin

    statements;
end procedure_name ;

    procedure_name
  
procedure
begin
   if
     
   elsif
     
   else
      
   end if;
end Put_ine ("A <B"); compare;

    下例则是完整的程序:
000 -- filename:comp.adb;
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure comp is
004     procedure compare (A:Integer; B :Integer) is
005     begin
006        if A > B then
007            Put_Line ("A > B.");
008        elsif A = B then
009            Put_Line ("A = B.");
010        else
011            Put_ine ("A < B.");
012        end if;
013     end compare;
014 X,Y:Integer;
015 begin
016     Put ("Enter A:"); Get (X);
017     Put ("Enter B:"); Get (Y);
018    compare (X,Y);
019 end comp;

    通过上例,对过程的用法应该会有基本的了解了。因为 compare 的执行部分是在 comp 内部,所以我们无须给出单独的 compare 声明,如果要加一句"procedure compare (A:Integer; B :Integer);",程序还是老样子。声明部份和执行部份一般在使用程序包时分离。其中Put_Line,Get也都是预定义的过程。
6.3 函数 (Function)   函数和过程也很像,只是它还要有返回值,和 C 很相似,也用 return 来返回函数值。声明格式为:
function

function_name (parameter_specification) return return_type;

执行部份为:
function

function_name (parameter_specification) return return_type is
   declarations;
begin
   statements;
   return return_value;
end function_name ;

 为该函数的名称;parameter_specification 是这个函数所要使用的参数,是可选的;declarations 是声明一些局部的新类型、变量、函数、过程;statements则是该函数要执行的语句。return 返回一个数据类型为return_typereturn_value。    将上一节的 comp 程序改动一下:
    function_name
000 -- filename:comp.adb;
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure comp is
004    function compare (A:Integer; B :Integer) return Integer is
005    begin
006       return (A - B);
007    end compare;
008 X,Y,Result:Integer;
009 begin
010     Put ("Enter A:"); Get (X);
011     Put ("Enter B:"); Get (Y);
012     Result := compare (X,Y);
013    case Result is
014       when Integer'First..-1 => Put_Line (" A < B.");
015        when 0 => Put_Line (" A = B.");
016       when 1..Integer'Last => Put_Line (" A > B.");
017       when others => null;
018    end case;
019 end comp;

    上例应该还能说明函数的特点。因为函数是返回一个值,所以在变量声明中赋予初始值时,也可用函数作为所要赋的值,如返回当前时间的 Clock 函数,可以直接在初始化某变量时作为要赋的值:Time_Now :Time:= Clock。与过程一样,在上述情况下,单独的函数声明可有可无。还有一点就是函数、过程的嵌套,上面两个例子就是过程包含过程,过程包含函数,可以无限制的嵌套下去---只要编译器别出错。
6.4 参数模式(Parameter Mode)    在上面的例子中,我们对函数或过程的参数并没做什么修饰,只是很简单的说明该参数的数据类型,但有时候,我们要设置参数的属性---函数和过程是否能修改该参数的值。一共有三种模式:in,out,in out。
in
    默认情况下,函数和过程的参数是 in 模式,它表示这个参数可能在子程序中被使用,但值不能被子程序改变。如我们写一个略微像样点的swap函数:000 filename:swap.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure Swap is
004    procedure Swap ( A: in Integer;B: in Integer) is
005        Temp :Integer;
006    begin
007        Temp := A; A:= B; B :=Temp;
008    end Swap;
009 X,Y:Integer;
010 begin
011    Put ("Enter A:"); Get (X);
012    Put ("Enter B:"); Get (Y);
013    Put ("After swap:"); New_Line;
014    swap(X,Y);
015    Put ("A is "); Put (X); New_Line;
016    Put ("B is "); Put (Y); New_Line;
017 end Swap;

   上例的程序是无法编译通过的,因为Swap的两个参数 A 和 B 都是 in 模式,在这个子过程中无法修改X,Y的值,也就无法互换这两个值。这时就要使用 in out 模式的参数。in out 模式
   in out
out
   单纯的 out 模式表示该参数在这个子程序中可以修改,但不能使用。如求和的 add 过程: Add (Left
procedure,Right : Integer; Result : out Integer) is   Result := Left + Right;
end Add;

procedure

   这个过程没问题,但假如还有个输出过程为:PutResult ( Result : out Integer) is
    Temp : Integer := Result;
begin
    Put (Temp);
end PutResult;

6.5 调用子程序(Calling Subprograms)
    调用子程序最简单的方式就是按照子程序声明的格式调用,如前例的procedure swap(A:Integer;B:Integer),只要填入的参数是Integer类型,便能直接使用 swap (A,B)。注意调用子程序时参数之间用“,”隔开;同类型的参数在声明时也可简化,如procedure swap(A,B:Integer)。但使用参数时还有下列几种特殊情况.
    我们也可以不按照参数顺序调用子程序。如调用 swap 也可以这样: swap(B => Y, A => X),这时是使用有名参数,明确声明每个变量的值,可以不按照子程序声明中的参数顺序赋值。这样的做的话可读性是好了一点,比较适合参数较多的情况。
    如果将有名参数和位置参数一起混用,只需遵守一条规则:位置参数在有名参数前面。因此 swap 的调用有以下几种情况:
swap(x , y);
swap(A => x , B => y);
swap(B => y , A => x);
swap(x, B => Y);

    上述四种情况是一样的。下列两种情况是非法的:
swap(y, A => x);---不合法
swap(A => x , y); ---不合法
默认参数值(Default Parameter Values )
000 -- filename:putlines.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure putlines is
004    procedure putline(lines: integer:=1) is<> 005 begin
006        for count in 1..lines loop
007           New_Line;
008        end loop;
009    end putline;
010    Line :Integer;
011 begin
012    Put ("Print Lines :"); Get (Line);
013    putline;
014 end putlines;     实际上[012]可有可无,因为调用输出行函数 putline 时,没用参数。而 putline 在声明时赋予了参数 lines 一个默认值 1,这样的话如果调用 putline 没用参数,就以 1 作为参数值。上例也就只输出一个空行。如果putline有参数,如putline(Line),则输出的行数取决于 Line 的数值。

6.6 重载(Overload)子程序重载
    实际上通过先前的一些例子,细心的朋友可能发现,过程 Put 能处理不能类型的参数,不像 C 下的 printf 要选择输出类型,这就涉及到子程序重载:只要参数不一样,子程序可以有相同的名称。如在程序包Ada.Text_IO里的两个过程:
procedure   编译器会自动选择合适的子程序,如果Put后面的参数为 Character类型,则调用procedure Put (Item : in Character);为 String 类型,则调用procedure Put (Item : in String)。这样在用户层上使用子程序简便了许多,很多常见的子程序:Get,Put_Line,Line, Page都是这样实现的----虽然在预定义程序包内针对不同参数都有一个子程序与之相对应,用户却只要记住一个名称就可以了。
procedure

Put (Item : in String); Put (Item : in Character);

运算符重载
    运算符重载应该说时时刻刻都在----不同的数据类型都拥有相同的运算符:+,-,*,/等。它的原理和子程序重载是一样的,在 Ada 里,运算符也是通过子程序形式来实现。下面就给出一个“+”和 put 重载的例子:
000 -- filename: overload.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure overload is
004    type Vector is array (1 .. 5 ) of Integer;
005     a, b, c :Vector;

006    function "+"(left,right:Vector) return Vector is
007        result : Vector ;
008    begin
009       for i in left'range loop
010           result(i) := left(i) + right(i);
011       end loop;
012       return result;
013    end "+";

014    procedure Put (Item : Vector) is
015    begin
016       for i in Item'range loop
017           Put (Item(i));
018       end loop;
019    end Put;
020 begin
021    a := (1,2,3,4,5);
022    b := (1,2,3,4,5);
023    c := a + b;
024    Put (c);
025 end overload;

    上例为了简化问题,有些实际中应该有的代码去除了----如检测所操作数的类型。但其它类型的运算符和重载子程序实现原理也和上例一样。
6.7 分离子程序(Separating Subprogram)    Ada 还允许子程序分成多个部份,而不是像以前的例子一样都塞在同一文件里,如将上例分成两个文件:
第一个文件:
000 -- filename: overload.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure overload is
004    type Vector is array (1 .. 5 ) of Integer;
005     a, b, c :Vector;
006    function "+"(left,right:Vector) return Vector is
007        result : Vector ;
008    begin
009       for i in left'range loop
010           result(i) := left(i) + right(i);
011       end loop;
012       return result;
013    end "+";
014    procedure Put (Item : Vector) is separate;
015 begin
016    a := (1,2,3,4,5);
017    b := (1,2,3,4,5);
018    c := a + b;
019    Put (c);
020 end overload;第二个文件:

000 --filename:overload-put.adb


001 separate (overload)     -- *注意结尾没有分号;
002 procedure Put (Item : Vector) is
003 begin
004    for i in Item'range loop
005       Put (Item(i));
006    end loop;
007 end Put;

6.8 子程序的内嵌扩展(Inline Expansion of Subprograms)
  子程序可以在调用地点被内嵌扩展,以提高程序效率,它的格式为:
pragma Inline(name);
  如果 name 是一个可调用的实体,子程序或类属子程序(见第11章),那么 pragma Inline 指示在所有调用该实体的地方要求对该实体进行内嵌扩展。这在封装其它语言的接口时,使用的比较多,以提高效率。
这个程序和先前那个完全一样,只是"分了家"而已。这样分离程序有时能更好的分解程序的任务,使程序结构更为清楚。注意一下overload.adb的[014] 和 overload-put.adb的 [001],这两句就是分离子程序的主要语句。     在声明某个子程序时,我们也可以使参数具有默认值,如下例:

有名参数(Named Parameter)   则会产生问题,虽然编译可能通过,但结果是不定的,最起码不是所指望的结果,因此 out 模式的参数不能赋值给其它变量。单独的 out 模式一般也不会出现。
begin
模式 模式表示该参数在这个子程序中既可修改又可使用。如只要将上例的[004]改为:procedure Swap ( A: in out Integer,B: in out Integer) is;该程序便能编译通过,运行正常。模式A = B then Put_Line ("A = B"); 为该过程的名称;parameter_specification 是这个过程所要使用的参数,是可选的;declarations 是声明一些局部的新类型、变量、函数、过程;statements 则是该过程要执行的语句。下例创建一个比较两数大小,并输出较大值的过程:compare (A:Integer; B :Integer) is A > B then Put_Line ("A > B");

职场 休闲 程序语言 编程语言

0

分享

微博 QQ 微信

收藏

上一篇:Ada 程序设计语言(The A... 下一篇:一生受用的数学公式
hagejid

44篇文章,35W+人气,1粉丝

关注

Ctrl+Enter 发布

发布

取消

推荐专栏更多

微服务技术架构和大数据治理实战

大数据时代的微服务之路

共18章 | 纯洁微笑

¥51.00 669人订阅

订   阅

基于Python的DevOps实战

自动化运维开发新概念

共20章 | 抚琴煮酒

¥51.00 431人订阅

订   阅

猜你喜欢

我的友情链接 挂起C++,开始学习使用D语言 Java线程:线程的调度-休眠 我们不得不面对的中年职场危机 职场终极密籍--记我的职业生涯 用光影魔术手制作一寸照片(8张一寸) 我的IT职场生涯: 毕业4年,月薪过万 Linux关闭休眠和屏保模式 年薪从0到10万-我的IT职场经验总结 Windows7删除休眠文件hiberfil.sys节省大量C盘空间 致IT同仁 — IT人士常犯的17个职场错误 “跳槽加薪”现象,无奈的职场规则 智能合约编程语言-solidity快速入门(下) Android中适配器的notifyDataSetChanged()为何有时不刷新 如何在Spring Boot中使用Hibernate Natural ID 从hook开始聊聊那些windows内核数据结构 Scala的actor 正则性能调优 windows下kafka+ELK的日志系统 Nginx下,请求本机另外Host很慢

扫一扫,领取大礼包

0

分享

关注

hagejid

转载于:https://blog.51cto.com/hagejid/74845

Ada 程序设计语言(The Ada Programming Language)[第四集]相关推荐

  1. Ada 程序设计语言(The Ada Programming Language)[第二集]

    Ada 程序设计语言(The Ada Programming Language)[第二集]- -   2.5.2 通用离散类型属性 离散类型包括整型和枚举型,除了上述的属性外,还有: S'Pos   ...

  2. Ada 程序设计语言(The Ada Programming Language)[第一集]

    Ada 程序设计语言(The Ada Programming Language)[第一集]- - 版权(Copyright) <Ada 程序设计语言>的版权隶属于网站 VenusIC,允许 ...

  3. Ada 程序设计语言(The Ada Programming Language)[第三集]

    Ada 程序设计语言(The Ada Programming Language)[第三集]- - 第4章 记录(Record) 4.1 概述(Overview)     记录则是由命名分量(named ...

  4. C程序设计语言(The C Programming Language)读书笔记

    文章目录 C程序设计语言 笔记 1 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入/输出 1.5.1 文本复制 1.5.2 字符计数 1.5.3 ...

  5. Ada程序设计语言初识

    Ada曾是美国国防部指定的唯一一款可用于军用系统开发的语言,旨在整合美军事系统中运行着450多种不同的程序设计语言,她是迄今为止最复杂.最完备的软件工具.开发始于1975年,最早是针对嵌入式和实时系统 ...

  6. 经典高清C语言 The C Programming Language

    https://pan.baidu.com/s/11QrfGXJ1gn65aogi5hF8bg bdc5

  7. 计算机程序设计语言是英文翻译,程序设计英语怎么说

    程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分.随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构.可维护性.复用性.可扩展性等因素日益重要.那么你知道程序设计用英语怎么说吗 ...

  8. R语言(The R Programming Language)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支. ...

  9. 谁应该去读 C++ Programming Language

    最近在读 Bjarne Stroustrup The C++ Programming Language 第四版. pdf    http://download.csdn.net/detail/salm ...

最新文章

  1. centos6.5 安装mysql8,centos6上安装mysql8.0版本
  2. poj 3352 双连通分量
  3. ACL 2016 | CopyNet 和 Pointer Softmax
  4. python函数count_python中count函数知识点浅析
  5. html 使用符号设置固定链接,关于dw-question-answer的调试和固定链接id.html设置
  6. android 画面俯视效果,四种方法让你的画面更耐看
  7. 关于makefile的使用
  8. 【转】SQLServer 行列互换
  9. 洛谷题解(持续更新)
  10. 安卓手机如何防盗_如何使用IMEI号码追踪丢失的安卓(Android)手机
  11. NO JVM installation found. please install a 64-bit JDK,解决方法   Error launching android studio   NO J
  12. java格林尼治时间_Java日期时间使用总结
  13. android获取全部ram和rom,手机中的RAM和ROM,你懂得多少?
  14. 提神醒脑 MVP、MVVM 关系精讲
  15. Hack the box: Bastion
  16. 650 storm 铃木v_V双暴风雨 2018款铃木V-Strom 650/650XT
  17. 国外的号码如何批量加入通讯录,Excel表格如何批量导入安卓苹果手机通讯录,如何快速的添加whatsApp,下面介绍具体的方法和软件
  18. java阶梯算法_上楼梯算法的java实现(转)
  19. 巴西龟饲养日志-----饲料的选择
  20. python怎么输出所有奇数_python输出100以内奇数的几种输出方式-Go语言中文社区

热门文章

  1. 为什么微信有时无法接收到服务器,微信小程序开启了消息推送,服务器有时候接收不到...
  2. 使用Navicat生成ER关系图并导出
  3. Kubernetes之Ingress
  4. Autodesk 3dsMax2022 安装说明
  5. 应用LNK306GN-TL 转换器、非隔离电源
  6. Charles的安装和配置
  7. JAVA工具类Hutool介绍与使用
  8. 升级包的制作与升级流程简介
  9. CC1101 433无线模块,STM8串口透传
  10. 中国的股市值得价值投资吗?