易语言流程控制:让程序“智能决策”与“重复执行” 🎯
1.4.1 学习目标 🎯
作为承上启下的核心章节(承接1.3的数据处理基础,开启模块化/批量处理能力),你将通过本节掌握程序的“思维逻辑”:
- 用生活化场景类比理解三大流程控制结构(顺序/选择/循环);
- 熟练掌握易语言选择结构(如果/如果真/判断)的语法与应用场景;
- 精通易语言循环结构(计次循环/判断循环/循环判断)的语法与效率差异;
- 完成**「带等级评定的学生成绩分析系统」**——升级1.3的成绩统计器,新增批量处理、智能评级功能;
- 排查流程控制的高频错误(死循环、条件逻辑反转、分支覆盖不全等)。
1.4.2 核心概念:用“生活场景”类比流程控制 💡
程序的运行逻辑本质是“指令的执行顺序”,易语言通过三种流程控制结构实现:
(1)顺序结构:默认的“按部就班” 🚶
类比:早上出门流程——睁眼→穿衣→刷牙→吃早餐→出门(从上到下依次执行);
易语言表现:代码默认从上到下逐行执行,无需额外关键字,是所有程序的基础。
(2)选择结构:智能的“分支决策” 🚦
类比:十字路口导航——红灯→停下,绿灯→通行,黄灯→减速(按条件选择执行分支);
易语言表现:通过关键字(如果/如果真/判断)根据条件执行不同代码块,实现“智能决策”。
(3)循环结构:高效的“重复执行” 🔄
类比:考前复习——每天背10个单词×30天(固定次数重复),或跑步→直到心率达标(条件满足重复);
易语言表现:通过关键字(计次循环/判断循环)重复执行代码块,替代“复制粘贴多段重复代码”的低效操作。
1.4.3 易语言选择结构:实现“智能决策”
(1)「如果」语句:双/多分支决策 🎯
语法格式:
.如果 (条件表达式, 分支1代码, 分支2代码)类比:如果今天下雨(条件)→带伞(分支1),否则→戴帽子(分支2);
高级用法:嵌套「如果」语句实现多分支(如成绩评级:90+→优秀,80-89→良好…)。
💡重点:条件表达式必须返回逻辑型(真/假),常用关系运算符(≥/≤/≠)和逻辑运算符(且/或)组合。
(2)「如果真」语句:单分支快捷决策 ⚡
语法格式:
.如果真 (条件表达式) 满足条件时执行的代码 .如果真结束类比:如果手机电量<20%(条件)→充电(仅执行这一步,否则什么都不做);
优势:比「如果」语句更简洁,适合“只有满足条件才执行”的场景,无需写空分支。
(3)「判断」语句:多分支清晰决策 📋
语法格式:
判断 (表达式) .判断开始 (条件1) 条件1满足时的代码 .判断开始 (条件2) 条件2满足时的代码 ... .默认 所有条件都不满足时的代码 .判断结束类比:成绩评级——90-100→优秀,80-89→良好,70-79→中等…(多区间分支);
优势:比嵌套「如果」语句更易读,适合“多条件分支且区间连续”的场景。
⚠️注意:判断语句的条件是“从上到下依次匹配”,匹配到第一个满足的条件后立即结束,无需检查后续条件。
1.4.4 易语言循环结构:实现“高效重复”
(1)「计次循环首」:固定次数的重复 🔢
语法格式:
计次循环首 (循环次数, 循环变量) 重复执行的代码 计次循环尾类比:绕操场跑5圈(循环次数=5,循环变量=当前圈数);
特征:循环次数固定,循环变量从1开始自动递增,适合“批量处理固定数量的数据”。
(2)「判断循环首」:条件满足才重复 ✔️
语法格式:
判断循环首 (条件表达式) 重复执行的代码 判断循环尾类比:跑步→直到心率≤120(先判断心率,满足条件才停止);
特征:先判断后执行,若初始条件不满足则一次都不执行,适合“需要满足条件才开始循环”的场景。
(3)「循环判断首」:先执行再判断的重复 🚩
语法格式:
循环判断首 重复执行的代码 循环判断尾 (条件表达式)类比:先喝一杯水→再判断是否口渴(先执行,再决定是否继续);
特征:先执行后判断,至少执行一次循环体,适合“需要先执行一次再判断”的场景(如输入验证)。
⚠️死循环预警:若循环内未修改条件表达式,循环将无限执行(如判断循环首 (真)且无跳出循环 ()语句),需用「任务管理器」结束程序进程。
1.4.5 实操:升级「学生成绩统计器」为「成绩分析系统」 ⏱️
(1)需求升级与界面优化 🎨
原1.3功能:5门成绩输入→总分/平均分/及格门数/及格率计算;
新升级功能:① 每门成绩自动评级(优秀/良好/中等/及格/不及格);② 用循环批量统计及格门数(替代原5段重复的「如果」语句);③ 新增“平均分等级”展示;
界面调整(基于原1.3的成绩统计器):
- 新增1个静态文本框:
lbl_平均等级,标题「平均分等级:」,X=50,Y=400; - 新增1个静态文本框:
lbl_科目等级,标题「科目等级:」,X=250,Y=400; - 调整窗口高度为480(避免组件溢出)。
⚠️ 所有原组件名称、属性保持不变,确保代码复用性。
(2)核心代码编写 ⌨️
切换到代码视图,为btn_统计按钮的「被单击」事件编写升级代码:
.版本 2 ; 易语言版本声明 .支持库 spec ; 引入标准支持库 .支持库 iext ; 引入扩展支持库(用于数组操作) .程序集 窗口程序集_启动窗口 .子程序 _btn_统计_被单击 ' 1. 基础变量声明(复用1.3的逻辑) 局部变量 db_语文, 双精度小数型 局部变量 db_数学, 双精度小数型 局部变量 db_英语, 双精度小数型 局部变量 db_物理, 双精度小数型 局部变量 db_化学, 双精度小数型 局部变量 db_总分, 双精度小数型 局部变量 db_平均分, 双精度小数型 局部变量 i_及格门数, 整数型 局部变量 db_及格率, 双精度小数型 局部变量 i_科目总数, 整数型 = 5 ; 直接初始化科目总数 ' 2. 新增变量(流程控制专用) 局部变量 成绩数组, 双精度小数型, , "5" ; 声明5个元素的双精度数组(存储5门成绩) 局部变量 i, 整数型 ; 循环变量 局部变量 平均等级, 文本型 ; 平均分等级 局部变量 科目等级串, 文本型 = "" ; 存储5门成绩的等级字符串(初始为空) ' ---------------------- 第一步:输入验证(复用1.3的逻辑,确保代码简洁) ---------------------- .如果真 (edt_语文.内容 = “”) 信息框 (“请输入语文成绩!”, 0, “错误提示”) edt_语文.获取焦点 () 返回 () .如果真结束 db_语文 = 到数值 (edt_语文.内容) .如果真 (edt_数学.内容 = “”) 信息框 (“请输入数学成绩!”, 0, “错误提示”) edt_数学.获取焦点 () 返回 () .如果真结束 db_数学 = 到数值 (edt_数学.内容) .如果真 (edt_英语.内容 = “”) 信息框 (“请输入英语成绩!”, 0, “错误提示”) edt_英语.获取焦点 () 返回 () .如果真结束 db_英语 = 到数值 (edt_英语.内容) .如果真 (edt_物理.内容 = “”) 信息框 (“请输入物理成绩!”, 0, “错误提示”) edt_物理.获取焦点 () 返回 () .如果真结束 db_物理 = 到数值 (edt_物理.内容) .如果真 (edt_化学.内容 = “”) 信息框 (“请输入化学成绩!”, 0, “错误提示”) edt_化学.获取焦点 () 返回 () .如果真结束 db_化学 = 到数值 (edt_化学.内容) ' ---------------------- 第二步:数组赋值与批量计算(循环应用) ---------------------- ' 将5门成绩存入数组,便于循环处理 成绩数组[1] = db_语文 成绩数组[2] = db_数学 成绩数组[3] = db_英语 成绩数组[4] = db_物理 成绩数组[5] = db_化学 ' 用【计次循环首】批量统计及格门数(替代原5段重复的If语句) i_及格门数 = 0 ; 初始化及格门数为0 计次循环首 (i_科目总数, i) ; 循环5次,i从1到5递增 .如果真 (成绩数组[i] ≥ 60) i_及格门数 = i_及格门数 + 1 ; 及格门数+1 .如果真结束 ' 同时批量生成科目等级字符串 .判断 (成绩数组[i]) .判断开始 (成绩数组[i] ≥ 90 且 成绩数组[i] ≤ 100) 科目等级串 = 科目等级串 + “优秀|” ; 拼接等级,用|分隔 .判断开始 (成绩数组[i] ≥ 80 且 成绩数组[i] < 90) 科目等级串 = 科目等级串 + “良好|” .判断开始 (成绩数组[i] ≥ 70 且 成绩数组[i] < 80) 科目等级串 = 科目等级串 + “中等|” .判断开始 (成绩数组[i] ≥ 60 且 成绩数组[i] < 70) 科目等级串 = 科目等级串 + “及格|” .默认 科目等级串 = 科目等级串 + “不及格|” .判断结束 计次循环尾 ; 循环结束 ' 去除科目等级串末尾的|(优化显示) .如果真 (取文本长度 (科目等级串) ≥ 1) 科目等级串 = 取文本左边 (科目等级串, 取文本长度 (科目等级串) - 1) .如果真结束 ' ---------------------- 第三步:总分/平均分计算(复用1.3的逻辑) ---------------------- db_总分 = db_语文 + db_数学 + db_英语 + db_物理 + db_化学 db_平均分 = db_总分 ÷ i_科目总数 db_及格率 = (i_及格门数 ÷ i_科目总数) × 100 ' ---------------------- 第四步:平均分等级评定(判断语句应用) ---------------------- 判断 (db_平均分) .判断开始 (db_平均分 ≥ 90 且 db_平均分 ≤ 100) 平均等级 = “优秀” .判断开始 (db_平均分 ≥ 80 且 db_平均分 < 90) 平均等级 = “良好” .判断开始 (db_平均分 ≥ 70 且 db_平均分 < 80) 平均等级 = “中等” .判断开始 (db_平均分 ≥ 60 且 db_平均分 < 70) 平均等级 = “及格” .默认 平均等级 = “不及格” .判断结束 ' ---------------------- 第五步:结果输出到界面 ---------------------- lbl_总分.标题 = “总分:” + 到文本 (db_总分) lbl_平均分.标题 = “平均分:” + 到文本 (db_平均分) lbl_及格门数.标题 = “及格门数:” + 到文本 (i_及格门数) + “/” + 到文本 (i_科目总数) lbl_及格率.标题 = “及格率:” + 到文本 (db_及格率) + “%” lbl_平均等级.标题 = “平均分等级:” + 平均等级 lbl_科目等级.标题 = “科目等级:” + 科目等级串⌨️
代码解释:
- 数组应用:用
成绩数组[5]存储5门成绩,减少变量个数; - 计次循环:替代原5段重复的「如果」语句,批量统计及格门数和生成等级串;
- 判断语句:用清晰的多分支结构实现成绩评级,避免嵌套「如果」的混乱;
- 字符串处理:用
取文本左边()去除等级串末尾的分隔符「|」,优化显示效果。
(3)编译与测试 🚀
① 点击IDE工具栏【工具】→【支持库配置】,勾选「iext扩展支持库」(数组操作依赖);
② 点击【编译】→【静态编译】,保存为「成绩分析系统.exe」;
③ 测试用例:
- 输入成绩:95(语文)、88(数学)、76(英语)、62(物理)、55(化学);
- 点击「开始统计」,界面显示:
- 总分:376 | 平均分:75.2 | 及格门数:4/5 | 及格率:80%;
- 平均分等级:中等 | 科目等级:优秀|良好|中等|及格|不及格;
- 输入非数值或空值,弹出错误提示,符合预期。
1.4.6 常见问题与解决方案 ⚠️
(1)死循环
现象:程序运行后无响应,只能通过任务管理器结束;
原因:循环条件永远为真,且循环内未修改条件(如判断循环首 (真)且无跳出循环 ());
解决方案:
- 检查循环条件是否会在执行过程中变为假;
- 必要时用
跳出循环 ()语句强制结束循环。
(2)条件逻辑反转
现象:判断结果与预期相反(如85分被评为“不及格”);
原因:关系运算符使用错误(如将≥写成≤);
解决方案:
- 用
信息框()在条件判断前输出变量值,验证条件逻辑; - 统一将“大范围条件”写在前面(如先判断90+,再判断80+)。
(3)分支覆盖不全
现象:部分情况未被处理(如0分未被评为“不及格”);
原因:多分支判断时未覆盖所有区间;
解决方案:
- 用
默认分支处理所有未匹配的情况; - 验证条件区间的连续性(如是否包含0-59的分数段)。
(4)循环变量未初始化
现象:循环次数错误或数组越界;
原因:循环变量未赋值(如i = 0但数组从1开始);
解决方案:
- 始终在循环前初始化循环变量;
- 用
计次循环首的自动递增变量,避免手动赋值错误。
1.4.7 本章小结 📌
通过本节学习,你已经掌握了程序开发的“思维核心”——流程控制,实现了从“被动执行”到“智能决策+批量处理”的升级:
✅概念理解:用生活化场景彻底掌握三大流程控制结构的本质;
✅语法掌握:熟练使用易语言所有选择/循环结构,理解各自的应用场景与效率差异;
✅实操能力:升级「学生成绩分析系统」,实现批量统计、智能评级等高级功能;
✅问题排查:能够解决死循环、条件逻辑错误等流程控制高频问题。