目前工作当中使用的编程语言是SAP平台的ABPA语言,出于好奇心,我想把之前用JAVA(用C++也写过,事实上,我每学一个新的语言,就会尝试去实现这个小程序)写过的计算一个正整数的因子的程序用ABAP写出来。JAVA的版本如下:

import java.util.ArrayList;

public class GetNumberFactors {
    private static int origin_n;
    private static ArrayList result_list = new ArrayList();
    public static ArrayList get_factor(int n, int x){
        origin_n = n;
        judge(n, x);
        return result_list;
    }
    public static ArrayList get_factor(int n){
        return get_factor(n, 2);
    }
    public static void judge(int n, int x){
        if (n % x == 0){
            result_list.add(x);
            n = n / x;
            judge(n, x);
        }else {
            if (x < n){
                x = x + 1;
                judge(n, x);
            }
        }
    }
}

这个小程序用的编程要素主要有三个:面向对象、动态数组、递归。只要是有这三个要素的编程语言应该都能实现这个小程序。ABAP作为在SAP平台上用来编写报表查询程序或者和用户交互的数据库程序的一种语言,业务当中是绝对不会遇到需要编写类似上面这样的程序的情况的。大概也是因为这个原因,ABAP一直听低调的,基本看不到有人用ABAP编写一些有趣的东西的。由于我是财务人出身,半路开始学习编程语言,所以好奇心有些过剩,因此,就冒出了用ABAP编写上面这样的程序的想法。代码如下:

class ZM_GET_NUMBER_FACTORS definition
  public
  abstract
  final.
    "一个虚的final类,也不能实例化,也不能继承
public section.

  class-methods GET_FACTOR "公用类方法
    importing "参数
      value(N) type I
      value(X) type I default
    returning "返回值
      value(RETURN_RESULT) type /BA1/F4_TAB_INT_NUMBERS .
protected section.
private section.

  . "用来把原始的n存下来,目前没用什么用
  class-data RESULT_LIST type /BA1/F4_TAB_INT_NUMBERS . "用来接受结果
    "/BA1/F4_TAB_INT_NUMBERS是sap内部定义好的一个内表,可以作为I型array,也可以自定义一个
  class-methods JUDGE "私用方法,用来做递归计算
    importing
      value(N) type I
      value(X) type I .
ENDCLASS.

CLASS ZM_GET_NUMBER_FACTORS IMPLEMENTATION.

  METHOD get_factor.
    origin_n = n.
    .
    return_result = result_list.
  ENDMETHOD.

  METHOD judge.

    DATA result_list_line LIKE LINE OF result_list.

    .
      MOVE x TO result_list_line.
      APPEND result_list_line TO result_list.
      n = n / x.
      CALL METHOD judge EXPORTING n = n x = x.
    else.
      IF x le n.
        add  to x.
        CALL METHOD judge EXPORTING n = n x = x.
      ENDIF.
    ENDIF.

  ENDMETHOD.
ENDCLASS.

ABAP写出来看上去要长好多,一个原因是因为ABAP有类定义和类实现两个部分,并且语法类似VB,所以写出来比较多,但实际上,上面的代码没有比JAVA麻烦。可以看到,ABAP原理也可以递归的呢,真是个好语言。不过能用在什么实际场合呢?

调用上面的ABAP类很简单,甚至比JAVA还用简单:

 ) INTO data(get_result).
    "1000里的因子,应该有三个2和三个5.
  WRITE / get_result.
ENDLOOP.

ABAP其实也是挺好的语言的更多相关文章

  1. ABAP OO的八大理由

    原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...

  2. 半个月使用rust语言的体验

    从第一次下载rust语言的编译器到今天刚好第14天. 简单说一下对这个语言的感觉吧. 一.性能 把以前用java写的一个中文地址切分的算法,用rust重新实现了一下(https://github.co ...

  3. C语言|博客作业11

    问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/10127 我在 ...

  4. 在Spring中使用脚本

    Spring支持3中不同的脚本语言(看来支持地还挺多的嘛):JRuby.Groovy和BeanShell. 这三个都是java社区的脚本语言(反正到目前为止我一个都没用过,可见我有多挫). JRuby ...

  5. 字段符号FIELD-SYMBOLS

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 【DataStructure In Python】Python模拟二叉树

    使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...

  7. 为什么选择Typescript

    上一节,我简单介绍了Typescript,并将Typescript和JavaScript进行了对比,有些网友提出了一些疑问,可能有些网友对于这个Typescript还不是特别的熟悉,这节,我做一些演示 ...

  8. SAP中的一些简称及简要介绍

    SAP-(System Applications and Products) 基础部分: R/3系统内核.数据库.支持各类平台的接口.ABAP(Advanced Business Applicatio ...

  9. 日志收集之nxlog

    一,软件介绍 nxlog 是用 C 语言写的一个开源日志收集处理软件,它是一个模块化.多线程.高性能的日志管理解决方案,支持多平台.可以处理来自许多不同来源的大量事件日志.支持的日志处理类型包括重写, ...

随机推荐

  1. ubuntu mariadb installation

    sudo apt-get install mariadb-server[sudo] password for wadmin: Reading package lists... DoneBuilding ...

  2. Unity VS 创建脚本自动添加头注释-时间-描述-作者等信息

    Unity生成脚本自动添加头注释 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心 ...

  3. flume实现kafka到文件测试用例

    kafka 到 file at2.sources =st2 at2.channels = ct2 at2.sinks = kt2 # For each one of the sources, the ...

  4. 关于mdb数据库在插入过程中报错->Syntax error in INSERT INTO statement.(sql语句没问题)

    今天,在做mdb数据库的增删改查的时候,代码报错插入语句有问题,但是在数据库中正常执行,苦苦探索了多次,终于找到了问题所在. 结果如图: 上面是报错 下面是解决方案   解决方案:主要原因是offic ...

  5. 【笔记】 laravel 的路由

    路由简介 : 请求对应着路由,将用户的请求转发给相应的程序进行处理 建立URL与程序之间的映射 Laravel中的请求类型:get.post.put.patch.delete   Route::get ...

  6. 手机响应式echarts

    // 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 使用刚指定的配置项和数据 ...

  7. Ubuntu 下超简单的安装指定版本的nodejs

    第一步 指定版本源 执行 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - setup_5.x 需要安装的版本号,替换数字就 ...

  8. PymongoDB_study

    import pymongo client = pymongo.MongoClient(host='localhost',port=27017)#连接数据库 #db = client.test#指定数 ...

  9. 交换排序-C#实现

    交换排序包括:冒泡排序和快速排序 具体代码如下: 冒泡排序: /// <summary> /// 冒泡排序 /// 稳定性:稳定 /// 时间复杂度:O(n2) /// </summ ...

  10. python 解析命令行

    python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用argparse这个模块.argparse从python 2.7开始被加入到标准库中,所以如果你的python ...