当前位置: 首页 > news >正文

SAP-ABAP:条件判断与循环控制语句(7篇)第六篇:实战演练:用条件判断+循环实现经典算法与业务场景

条件判断与循环控制语句7篇第六篇实战演练用条件判断循环实现经典算法与业务场景从基础的IF分支到多级循环条件判断和循环控制是程序逻辑的核心。但只懂语法还不够真正的能力体现在用它们解决实际问题。本文将通过四个典型场景——冒泡排序算法基础、九九乘法表嵌套循环、用户权限校验业务逻辑、猜数字游戏交互与循环控制手把手拆解从需求分析到代码落地的完整思路。无论你是初学者还是寻求进阶的开发者都能从中获得将语法知识转化为实战能力的启发。一、场景一冒泡排序——经典算法中的条件判断与嵌套循环1.1 需求分析冒泡排序是最基础的排序算法。其核心思想重复遍历待排序的数列每次比较相邻两个元素若顺序错误则交换。每轮遍历都会将当前最大或最小的元素“冒泡”到末端。算法包含两层循环外层控制遍历轮数内层负责相邻比较和交换。1.2 算法设计输入内表lt_numbers类型为STANDARD TABLE OF i。输出排序后的内表升序。步骤获取内表行数n。外层循环n-1次。内层循环n-i-1次i为外层循环索引比较相邻元素若lt_numbers[j] lt_numbers[j1]则交换。可增加标志位优化若某轮未发生交换说明已有序提前退出。1.3 ABAP代码实现FORM bubble_sort CHANGING ct_numbers TYPE STANDARD TABLE OF i. DATA: lv_len TYPE i, lv_temp TYPE i, lv_swapped TYPE abap_bool. lv_len lines( ct_numbers ). DO lv_len - 1 TIMES. lv_swapped abap_false. DATA(lv_outer_idx) sy-index. DO lv_len - lv_outer_idx TIMES. DATA(lv_inner_idx) sy-index. 读取相邻两个元素注意索引从1开始需转换 READ TABLE ct_numbers INDEX lv_inner_idx INTO DATA(lv_left). READ TABLE ct_numbers INDEX lv_inner_idx 1 INTO DATA(lv_right). IF lv_left lv_right. 交换 lv_temp lv_left. MODIFY ct_numbers INDEX lv_inner_idx FROM lv_right. MODIFY ct_numbers INDEX lv_inner_idx 1 FROM lv_temp. lv_swapped abap_true. ENDIF. ENDDO. IF lv_swapped abap_false. EXIT. 已经有序提前退出外层循环 ENDIF. ENDDO. ENDFORM.1.4 测试代码DATA lt_nums TYPE STANDARD TABLE OF i. lt_nums VALUE #( ( 5 ) ( 2 ) ( 9 ) ( 1 ) ( 5 ) ( 6 ) ). PERFORM bubble_sort CHANGING lt_nums. LOOP AT lt_nums INTO DATA(lv_num). WRITE / lv_num. ENDLOOP.1.5 要点总结嵌套循环的索引控制外层用sy-index内层用另一个sy-index由于ABAP中sy-index在嵌套循环中共享同一值因此内层循环必须将sy-index立即赋值给局部变量否则会混乱。但上述代码中每次进入内层DO都会刷新sy-index这是安全的因为内层DO的sy-index是独立的。更好的实践显式声明局部变量避免依赖sy-index。优化使用MODIFY ... INDEX修改内表元素。条件判断IF lv_left lv_right决定是否交换。二、场景二九九乘法表——嵌套循环与格式化输出2.1 需求分析输出以下形式的乘法表1×11 1×22 2×24 1×33 2×36 3×39 ...要求每行输出与行号对应的乘法算式算式之间用空格分隔每行末换行。2.2 算法设计外层循环变量i从1到9。内层循环变量j从1到i。输出j × i i*j算式间用制表符或空格分隔。2.3 ABAP代码实现DATA: lv_i TYPE i, lv_j TYPE i, lv_output TYPE string. DO 9 TIMES. lv_i sy-index. CLEAR lv_output. DO lv_i TIMES. lv_j sy-index. CONCATENATE lv_output lv_j × lv_i lv_i * lv_j INTO lv_output. 或者使用字符串模板更优雅 lv_output |{ lv_output } { lv_j }×{ lv_i }{ lv_i * lv_j }|. ENDDO. SHIFT lv_output LEFT. 去掉开头的空格 WRITE / lv_output. ENDDO.2.4 运行效果1×11 1×22 2×24 1×33 2×36 3×39 ...2.5 要点总结嵌套循环中外层循环控制行数内层控制每行算式个数。字符串拼接技巧使用CONCATENATE或字符串模板。内层循环次数依赖于外层循环变量体现循环依赖。三、场景三用户权限校验——多条件判断与标志位3.1 需求分析某系统需校验用户是否有权执行某个操作。权限规则用户角色为“管理员”ROLE ADMIN→ 直接通过。用户角色为“普通用户”ROLE USER且满足以下所有条件时通过操作类型为允许列表中的一种ACTION IN (READ,PRINT)。用户所属部门与资源部门相同user_dep resource_dep。资源不是“机密级”resource_level CONFIDENTIAL。其他情况均拒绝。3.2 算法设计使用卫语句优先处理管理员简化主干逻辑。用布尔变量记录各个条件最后组合判断。3.3 ABAP代码实现METHODS: check_authorization IMPORTING iv_role TYPE string iv_action TYPE string iv_user_dep TYPE string iv_resource_dep TYPE string iv_resource_level TYPE string RETURNING VALUE(rv_allowed) TYPE abap_bool. METHOD check_authorization. 管理员直接通过 IF iv_role ADMIN. rv_allowed abap_true. RETURN. ENDIF. 非管理员必须角色为普通用户 IF iv_role USER. rv_allowed abap_false. RETURN. ENDIF. 普通用户权限校验 DATA(lv_action_ok) COND #( WHEN iv_action IN (READ, PRINT) THEN abap_true ELSE abap_false ). DATA(lv_department_ok) COND #( WHEN iv_user_dep iv_resource_dep THEN abap_true ELSE abap_false ). DATA(lv_level_ok) COND #( WHEN iv_resource_level CONFIDENTIAL THEN abap_true ELSE abap_false ). rv_allowed lv_action_ok AND lv_department_ok AND lv_level_ok. ENDMETHOD.3.4 测试用例DATA(lv_allowed) check_authorization( iv_role USER iv_action READ iv_user_dep SALES iv_resource_dep SALES iv_resource_level PUBLIC ). WRITE: 是否允许:, lv_allowed. 输出 X允许3.5 要点总结卫语句使代码层次清晰异常情况提前返回。布尔变量提取使组合条件自文档化。IN运算符简化多值判断。四、场景四猜数字游戏——循环与条件中断4.1 需求分析程序随机生成一个1-100之间的整数让用户猜测。每次猜测后提示“猜大了”、“猜小了”或“恭喜猜中”。用户最多猜10次若10次未中则公布答案并结束。同时用户可随时输入“退出”终止游戏。4.2 算法设计使用cl_abap_random_int生成随机数。用DO无限循环内部用IF判断用户输入用EXIT退出循环。维护猜测次数计数器达到上限时退出并揭示答案。处理用户输入“退出”关键字。4.3 ABAP代码实现REPORT z_guess_number. DATA: lv_secret TYPE i, lv_guess TYPE string, lv_num TYPE i, lv_attempts TYPE i VALUE 0, lv_max_attempts TYPE i VALUE 10. 生成1-100随机数 DATA(lo_rand) cl_abap_random_intcreate( seed cl_abap_randomseed( ) min 1 max 100 ). lv_secret lo_rand-get_next( ). WRITE: / 猜数字游戏1-100你有, lv_max_attempts, 次机会。输入退出结束游戏。. DO. 猜测次数限制 lv_attempts lv_attempts 1. IF lv_attempts lv_max_attempts. WRITE: / 很遗憾10次机会已用完。答案是, lv_secret, 。游戏结束。. EXIT. ENDIF. 获取用户输入 WRITE: / 第, lv_attempts, 次猜测:. READ lv_guess. IF lv_guess 退出 OR lv_guess EXIT. WRITE / 游戏已退出。. EXIT. ENDIF. 尝试转换为数字 TRY. lv_num CONV i( lv_guess ). CATCH cx_sy_conversion_no_number. WRITE / 请输入有效的数字或退出。. lv_attempts lv_attempts - 1. 无效输入不消耗次数 CONTINUE. ENDTRY. 判断大小 IF lv_num lv_secret. WRITE / 猜小了再试试。. ELSEIF lv_num lv_secret. WRITE / 猜大了再试试。. ELSE. WRITE / 恭喜猜中了共猜测, lv_attempts, 次。. EXIT. ENDIF. ENDDO.4.4 交互示例猜数字游戏1-100你有10次机会。输入退出结束游戏。 第1次猜测: 50 猜小了再试试。 第2次猜测: 75 猜大了再试试。 ... 第5次猜测: 67 恭喜猜中了共猜测5次。4.5 要点总结随机数生成使用标准类cl_abap_random_int。DO...EXIT构造后置条件循环至少执行一次但本程序中是在每次迭代开始时检查次数也可用WHILE。使用CONTINUE跳过无效输入且不增加有效猜测计数。异常捕获处理非数字输入。多条件退出次数耗尽、猜中、用户主动退出。五、综合对比与经验提炼场景核心技术循环结构条件判断亮点冒泡排序算法逻辑嵌套DO比较交换提前退出优化九九乘法表格式化输出嵌套DO内层次数依赖外层无复杂条件主要控制循环边界权限校验业务规则无循环卫语句、布尔变量提取、IN运算符猜数字交互随机DO无限循环 EXIT多分支退出、异常处理、CONTINUE核心收获条件判断的嵌套深度直接影响可读性应优先使用卫语句和布尔变量扁平化。循环的选择明确次数用DO...TIMES不确定次数用WHILE或DO...EXIT。嵌套循环中注意索引变量的独立性避免依赖全局sy-index。提前退出EXIT和跳过CONTINUE是精细化控制循环流程的利器。通过这四个场景的实战演练相信你已经能灵活运用条件判断和循环控制解决实际问题。下一篇我们将聚焦性能优化分析条件与循环代码的常见性能瓶颈及优化方案让程序不仅正确而且高效。下篇预告性能优化条件与循环代码的常见性能瓶颈与优化方案作者你的ABAP学习伙伴版本记录2026年5月 你在实际开发中还遇到过哪些需要巧妙结合条件与循环的场景欢迎留言分享。
http://www.zskr.cn/news/1412037.html

相关文章:

  • 【Linux网络】彻底搞懂应用层自定义协议与序列化:从底层原理到工业级实战
  • 东莞靠谱的全屋定制制造厂找哪家 - 企业推荐官【官方】
  • Nintendo Switch大气层自制系统:从入门到精通的完整指南
  • 别再只用OLS了!用Python的sklearn实战对比岭回归和Lasso,教你选对正则化参数alpha
  • HTML5 从入门到精通:不止于标签——HTML5 高级特性,小交互无需 JavaScript
  • gbert-large-openmind安全最佳实践:保护你的德语NLP应用免受攻击的终极指南
  • 别再只盯着GPT了!用VQA技术,手把手教你打造一个能‘看懂’医学影像的AI助手
  • 为什么选择GPT-2 Large?深入分析774M参数模型的独特价值
  • 3步掌握WSABuilds:在Windows 10/11上打造完整安卓环境的完整指南
  • 2026最新武夷山市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 深度解析 gbt7714-bibtex-style:实现GB/T 7714标准的技术实现与最佳实践
  • 免费开源AMD处理器调试工具:SMUDebugTool新手快速上手指南
  • 沙河市黄金回收白银回收铂金回收彩金回收门店优选+2026年最新黄金回收TOP5排行榜及联系方式 - 亦辰小黄鸭
  • SQL Server 2019 Developer版在Win11上的完整配置流水账:从ISO下载到SSMS连接
  • 5分钟掌握:Beyond Compare 5永久激活终极指南
  • 从滤波到优化:手把手拆解VIO算法演进,看OpenVINS、Basalt、DM-VIO如何解决状态估计难题
  • VS2015安装卡在‘安装包丢失或损坏’?别慌,这两个手动修复技巧亲测有效(附原理说明)
  • 厦门市黄金回收白银回收铂金回收彩金回收门店优选+2026年最新黄金回收TOP5排行榜及联系方式 - 亦辰小黄鸭
  • 一次“正确”的数据库迁移,如何演变成删库事故——AI Coding Agent 的致命误判 yolo权限
  • 【Linux—文件操作命令】
  • 【Linux—基础命令】
  • 2026年青岛沙发翻新口碑推荐|华信达家具与信华鑫达 本地靠谱品牌全解析 - 资讯焦点
  • 汕尾市黄金回收白银回收铂金回收彩金回收门店优选+2026年最新黄金回收TOP5排行榜及联系方式 - 亦辰小黄鸭
  • 【最新 v 2.7.5】Windows 版 Open Claw 一键部署,5 分钟让电脑替你打工,效率暴涨 300%
  • 怀化市黄金回收白银回收铂金回收彩金回收门店优选+2026年最新黄金回收TOP5排行榜及联系方式 - 亦辰小黄鸭
  • ULINK逻辑分析仪变量更新问题与解决方案
  • Kubernetes Helm Chart开发与最佳实践:构建可复用的应用包
  • ChatGPT生成攻略竟被《原神》社区封禁?资深UGC审核官透露的5条合规红线与安全输出协议
  • 人工智能【第47篇】深度学习优化:模型压缩与加速技术
  • 商丘市黄金回收白银回收铂金回收彩金回收门店优选+2026年最新黄金回收TOP5排行榜及联系方式 - 亦辰小黄鸭