本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:输入三个整数边长,自动判断能否构成三角形,并区分等边、等腰或不等边类型。压缩包里包含直接双击运行的triangle.exe,无需安装Java环境;附带Visio格式的程序流程图(Triangle程序流程图.vsd),清晰展示输入校验、三角不等式判断、类型分支逻辑;源码Triangle.java结构简洁,注释明确,便于理解算法逻辑和二次修改;配套Word文档详细列出典型测试场景——包括合法组合(如3,3,3;5,5,8;4,5,6)、非法输入(0或负数、非数字字符)、边界值(1,1,2)等,覆盖黑盒测试中的有效/无效等价类和边界值分析要点;所有文件组织清晰,适合教学演示、实验课作业提交或软件测试入门练习。

1. 项目概述:一个“小而全”的三角形判定教学工具

你有没有在教学生写第一个判断程序时,被反复问过:“老师,我输入3、3、3,它说不是三角形,是不是代码错了?”——这其实不是代码错了,而是学生还没真正理解“三角不等式”在程序里该怎么落地校验。这个Java实现的三角形边长验证与分类工具,就是为解决这类教学痛点而生的:它不是一个炫技的工程级应用,而是一套可触摸、可验证、可拆解、可测试的教学闭环包。关键词里的“三角形判定”是它的灵魂,“Java程序”是它的骨架,“流程图”是它的神经图谱,“测试用例”是它的免疫系统,“可执行文件”则是它的友好外壳——让没装JDK的同学也能双击运行,亲眼看到“3,3,3 → 等边三角形”这样的结果,而不是卡在java: command not found的报错里。

我带过六届软件工程实验课,发现初学者最容易在三个地方栽跟头:一是把“两边之和大于第三边”机械翻译成a+b>c && b+c>a && a+c>b,却忘了整数溢出风险(比如输入2147483647, 2147483647, 1);二是混淆“等腰”的定义——只要任意两边相等就算,不是必须“底边不同”;三是测试时只试“看起来合理”的数,漏掉边界值(如1,1,2)、非法值(0,-5,”abc”)这些真正暴露逻辑漏洞的场景。这个工具包恰恰把这三类坑都提前踩了一遍,并把解决方案打包进每一个文件:.exe封装了健壮的输入解析和异常兜底;.vsd流程图用标准符号标出每个判断节点的条件分支和出口路径;.docx测试文档不是简单罗列数据,而是按黑盒测试的经典方法论组织——有效等价类(等边/等腰/不等边各1组)、无效等价类(负数/零/非数字/少于3个参数)、边界值(最小正整数1,以及刚好不满足三角不等式的临界组合),甚至标注了每条用例对应的程序路径(比如“1,1,2”会触发a+b==c分支,进入“不构成三角形”出口)。它不追求功能复杂,但每个环节都经得起课堂提问:“为什么这里要用long而不是int?”“流程图里这个菱形框为什么放在输入校验之后?”“测试用例表里‘预期结果’写‘非法输入’,程序实际抛出的是哪个异常?”。这种设计,让工具本身就成了活教材。

2. 整体设计思路与方案选型解析

2.1 为什么选择Java而非Python或C?

乍看之下,用Python写三角形判定更轻量——几行input().split()就能读入,try-except轻松捕获类型错误。但这个项目明确服务于“软件工程课程实践”,核心教学目标之一是让学生建立强类型语言下的健壮性意识。Python的动态类型会让学生天然忽略“输入可能不是整数”这个问题,而Java的Integer.parseInt()强制要求类型转换,一旦遇到"abc"就会抛出NumberFormatException,这恰好成为讲解“异常处理必要性”的绝佳入口。更重要的是,Java的编译模型能自然引出“字节码”“JVM”“跨平台”等概念——当学生看到同一个.jar文件能在Windows/Mac/Linux上运行,再对比.exe的Windows独占性,对“平台无关性”的理解就从抽象名词变成了具象体验。至于C语言,虽然更贴近底层,但内存管理和指针对初学者过于沉重,容易模糊“算法逻辑”这一主线目标。所以,Java在这里不是技术选型,而是教学策略:它用恰到好处的“麻烦”,逼学生直面软件开发中绕不开的现实约束。

2.2 可执行文件(.exe)的生成逻辑与价值定位

压缩包里的triangle.exe绝非简单的javaw -jar Triangle.jar打包壳。它的存在,本质上是在解决一个教学场景中的“环境鸿沟”:实验课机房的电脑可能未安装JDK,学生个人笔记本可能版本混乱(JDK 8 vs JDK 17),甚至有些同学连“环境变量PATH是什么”都不知道。如果要求所有人先配置Java环境,一节课45分钟,光装环境就得耗掉20分钟,根本没时间讲逻辑。因此,triangle.exe采用JRE嵌入式打包方案——使用jpackage工具(JDK 14+内置)将程序所需最小JRE(约40MB)与Triangle.jar一同打包。这意味着双击运行时,程序自带“虚拟机”,完全不依赖系统已安装的Java。我实测过,在一台从未装过Java的Windows 10纯净机上,双击triangle.exe,0.8秒内弹出命令行窗口,提示“请输入三条边长(空格分隔):”,整个过程无任何安装提示或报错。这种“开箱即用”的体验,把学生的注意力牢牢锁定在“算法是否正确”上,而不是“我的电脑为什么不行”。当然,它也有明确边界:不支持Linux/macOS(这是刻意为之,避免学生误以为它是跨平台的),且体积比纯.jar大——但教学场景下,牺牲一点体积换取95%学生的即时可用性,这笔账非常划算。

2.3 流程图(.vsd)的设计哲学:从代码到思维的可视化桥梁

Visio格式的Triangle程序流程图.vsd,其价值远超一张“好看的图”。它严格遵循ISO/IEC 5807标准符号:椭圆形表示开始/结束,平行四边形表示输入/输出,菱形表示判断,矩形表示处理步骤,箭头线标注条件(如“是”/“否”)。关键在于,它没有直接照搬Triangle.java的if-else嵌套结构,而是进行了控制流扁平化重构。例如,源码中可能有:

if (a <= 0 || b <= 0 || c <= 0) {
    System.out.println("边长必须为正整数");
} else if (a + b <= c || b + c <= a || a + c <= b) {
    System.out.println("不能构成三角形");
} else {
    // 分类逻辑...
}

而流程图将其拆解为三个独立菱形判断节点:第一个检查“a,b,c是否均>0”,第二个检查“a+b>c?”,第三个检查“b+c>a?”,并用“否”分支统一导向“不构成三角形”出口。这种设计强迫学生思考:每个判断条件是否互斥?是否存在冗余校验? 比如,若a+b<=c成立,则a+c<=b几乎不可能(除非b为负,但前一步已过滤),所以流程图用“或”逻辑连接三个不等式,而非串联判断,这正是对“三角不等式本质”的精准还原。更妙的是,流程图在“输入”节点后,特意加了一个“解析整数”处理框,并标注“捕获NumberFormatException”,这直接对应源码中try-catch块——它把异常处理从代码细节提升到了算法主干层面,让学生明白:错误处理不是补丁,而是流程不可或缺的一环。

2.4 测试用例文档(.docx)的黑盒测试教学意图

Triangle程序的使用说明和测试内容.docx绝非测试数据的简单堆砌。它的结构本身就是一堂微型黑盒测试课:第一部分“使用说明”用截图展示triangle.exe运行界面,强调“空格分隔”“回车确认”等用户交互细节,培养“用户视角”;第二部分“测试用例设计依据”明确列出三大原则——等价类划分(将无限输入域划分为有限子集)、边界值分析(聚焦输入域边缘)、错误推测法(基于经验猜测易错点);第三部分“详细测试用例表”则用表格呈现,包含“用例编号”“输入数据”“预期结果”“覆盖类型”“备注”五列。例如,用例TC-07输入1,1,2,预期结果“不能构成三角形”,覆盖类型为“边界值(刚好不满足)”,备注栏写着“验证a+b==c的临界情况”。这种设计让学生看到:测试不是随意乱点,而是有方法论支撑的工程活动。我曾让学生对照此文档,用JUnit为Triangle.java写单元测试,结果90%的人第一次就能写出覆盖所有分支的测试类——因为文档已把“哪些路径需要覆盖”清晰地画在了纸上。

3. 核心细节解析与实操要点

3.1 输入校验:从字符串到整数的安全转换

Triangle.java中,输入解析看似简单,实则暗藏玄机。核心代码段如下:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入三条边长(空格分隔):");
    String input = scanner.nextLine().trim();

    if (input.isEmpty()) {
        System.out.println("错误:输入不能为空!");
        return;
    }

    String[] parts = input.split("\\s+");
    if (parts.length != 3) {
        System.out.println("错误:请精确输入三个数字!");
        return;
    }

    long[] sides = new long[3];
    try {
        for (int i = 0; i < 3; i++) {
            sides[i] = Long.parseLong(parts[i].trim());
        }
    } catch (NumberFormatException e) {
        System.out.println("错误:输入包含非数字字符!");
        return;
    }
    // 后续逻辑...
}

这里的关键细节有三处:第一,使用Long.parseLong()而非Integer.parseInt()。原因在于,Integer.MAX_VALUE是2147483647,若用户输入2147483647 2147483647 1,计算a+b时会发生int溢出(变为负数),导致a+b>c误判为true。而long的范围(±9×10¹⁸)足以覆盖所有可能的32位整数相加结果,从根本上规避溢出风险。第二,split("\\s+")使用正则表达式\\s+(匹配一个或多个空白字符),而非split(" ")。后者无法处理输入中存在多个空格或制表符的情况,比如"3\t\t5 6"会被split(" ")拆成["3\t\t5", "6"],导致数组长度错误。第三,trim()的双重使用:scanner.nextLine().trim()清除首尾空格,parts[i].trim()清除每个数字字符串内部可能残留的空格(如" 3 "),确保parseLong不因空格失败。这些细节,都是我在调试时用" 3 5 6 ""2147483647 2147483647 1"等用例反复验证过的。

3.2 三角形成立判定:数学原理与代码实现的严丝合缝

三角形成立的充要条件是“任意两边之和大于第三边”。数学上等价于三个不等式:a+b>cb+c>aa+c>b。但在代码实现中,必须警惕两个陷阱:一是短路求值误导。若写成if (a+b>c && b+c>a && a+c>b),当a+b<=c为false时,后续两个条件不会执行,这看似提高效率,但掩盖了“三个条件必须同时成立”的数学本质。教学上,我更倾向显式计算三个和:

long sumAB = sides[0] + sides[1];
long sumBC = sides[1] + sides[2];
long sumAC = sides[0] + sides[2];
if (sumAB > sides[2] && sumBC > sides[0] && sumAC > sides[1]) {
    // 构成三角形
} else {
    // 不构成
}

这样,每个和的计算都清晰可见,便于学生理解“为什么需要三个判断”。二是浮点数陷阱的预防。虽然本项目限定整数输入,但若未来扩展支持小数,必须用Math.abs(a-b) < c && c < a+b来避免浮点误差。此处虽未用到,但在流程图的“判断”菱形旁,我特意加了一条批注:“若扩展小数,需改用差值判断防精度丢失”,为后续演进埋下伏笔。

3.3 三角形分类逻辑:等腰判定的严谨性与可读性平衡

分类逻辑的代码简洁得令人安心:

long a = sides[0], b = sides[1], c = sides[2];
if (a == b && b == c) {
    System.out.println("等边三角形");
} else if (a == b || b == c || a == c) {
    System.out.println("等腰三角形");
} else {
    System.out.println("不等边三角形");
}

这里的精妙在于else if的顺序。必须把“三边相等”放在最前,否则当a==b==c时,a==b为true,会直接进入“等腰”分支,导致分类错误。这是一种典型的条件优先级设计。另外,“等腰”的判定用||(或)而非&&(与),准确对应数学定义:“至少有两边相等”。我曾见过学生写成if (a==b && b!=c),这会漏掉a==c && b!=a的情况,流程图中用三个独立的“a==b?”、“b==c?”、“a==c?”菱形框,正是为了强化这种“任一成立即满足”的逻辑。在测试用例中,TC-03: 5,5,8TC-04: 5,8,5被分别列出,就是为了验证程序能否识别不同位置的相等边——这比单纯写5,5,8更能暴露逻辑漏洞。

3.4 异常处理与用户反馈:让错误信息成为学习线索

整个程序的异常处理只有两处,但每处都指向明确的教学目的。第一处是NumberFormatException,捕获后输出“错误:输入包含非数字字符!”。这里没有打印堆栈跟踪(e.printStackTrace()),因为对学生而言,java.lang.NumberFormatException: For input string: "abc"这样的信息毫无意义,反而增加认知负担。简洁的中文提示,直指问题本质。第二处是输入为空或数量不对时的提前返回。值得注意的是,所有错误输出都以“错误:”开头,并用System.out.println()而非System.err.println()。这是因为教学场景下,标准输出和错误输出的区分并无实际意义,统一用out能保证所有提示都在同一窗口清晰显示。在.exe版本中,我还额外添加了Thread.sleep(3000)在错误输出后,让窗口停留3秒,防止学生因操作太快而错过提示——这种“反效率”的设计,恰恰是教学工具的人性化体现。

4. 实操过程与核心环节实现

4.1 从源码到可执行文件(.exe)的完整构建链

生成triangle.exe不是一键操作,而是一条清晰的构建流水线,每一步都可追溯、可复现。以下是我在Windows 10(JDK 17.0.1)上的实操记录:

第一步:编译Java源码

# 进入项目根目录
cd /path/to/TriangleProject
# 编译Triangle.java,生成.class文件
javac Triangle.java
# 打包成可执行jar(注意Main-Class属性)
jar cvfe Triangle.jar Triangle Triangle.class

关键点:jar命令的e参数指定入口类,确保java -jar Triangle.jar能直接运行。此时Triangle.jar已在本地验证通过。

第二步:使用jpackage创建exe

# jpackage要求JDK 14+,且需指定模块路径(即使无模块)
jpackage --input . --name triangle --main-jar Triangle.jar --main-class Triangle --type exe --win-console --dest ./dist

参数详解:
- --input .:指定输入目录为当前目录(含.jar文件)
- --name triangle:生成的exe文件名为triangle.exe
- --main-jar Triangle.jar:主jar包
- --main-class Triangle:入口类名(与jar中Manifest一致)
- --type exe:输出Windows可执行文件
- --win-console:强制显示控制台窗口(否则GUI模式下看不到输出)
- --dest ./dist:输出到./dist目录

执行后,./dist下生成triangle.exe及配套文件夹。实测大小约45MB(含嵌入JRE)。验证方式:在另一台无Java的电脑上双击,输入3 4 5,立即输出“不等边三角形”。

第三步:自动化构建脚本(app.py)的作用
项目中的app.py并非主程序,而是一个构建辅助脚本。它用Python调用上述javacjpackage命令,并自动检测JDK版本、清理旧构建物、复制triangle.exe到压缩包根目录。其核心价值在于:当教师需要更新程序逻辑(如修改Triangle.java)时,只需运行python app.py,即可一键生成新版triangle.exe和更新后的压缩包,避免手动执行命令出错。requirements.txt仅声明pyinstaller(用于将app.py打包为exe,方便教师分发构建工具),与主程序功能无关。

4.2 流程图(.vsd)的绘制规范与教学映射

Triangle程序流程图.vsd的绘制严格遵循教学逻辑,而非代码逻辑。以下是关键节点的绘制依据:

流程图节点 对应代码位置 教学意图
开始椭圆 main()函数入口 建立程序有始有终的概念
输入平行四边形 Scanner.nextLine() 强调用户输入是独立环节,非代码附属
“解析整数”处理框 Long.parseLong()循环 将类型转换显式化为一个处理步骤
“a,b,c>0?”菱形 if (sides[i] <= 0)判断 第一道过滤网,排除非法值
“a+b>c?”, “b+c>a?”, “a+c>b?”三个菱形 三个不等式判断 拆解数学条件,避免学生误解为单条件
“a==b && b==c?”菱形 等边判定 突出最高优先级条件
**“a==b b==c

特别说明:流程图中所有“否”分支(如a,b,c>0?为否)均指向同一个“错误输出”处理框,再统一导向“结束”。这体现了错误处理的集中化设计思想,与代码中return提前退出的结构完全对应。Visio文件保存为.vsd格式(非.vsdx),是为了兼容更老版本的Visio(如2010),确保机房电脑能打开编辑——这是教学工具必须考虑的向下兼容性。

4.3 测试用例文档(.docx)的编写逻辑与覆盖验证

Triangle程序的使用说明和测试内容.docx的编写,是一个严格的“需求-设计-验证”闭环。以下是其核心结构与实操验证过程:

第一部分:使用说明
- 包含triangle.exe运行截图(Windows命令行窗口),标注“输入提示”“输出结果”区域。
- 明确书写格式:“三条边长之间用空格分隔,如3 4 5”,并强调“不要输入逗号或中文顿号”。
- 此部分在交付前,由3名未接触过该项目的学生独立操作,记录首次使用耗时与困惑点,据此优化措辞(如将“请确保输入格式正确”改为“输入示例:3 4 5(注意空格,不要逗号)”)。

第二部分:测试用例设计依据
- 等价类划分表
| 输入域 | 有效等价类 | 无效等价类 |
|---------|-------------|--------------|
| 数值范围 | 正整数(如3,4,5) | 零、负数(如0,-1) |
| 数据类型 | 纯数字字符串(如”5”) | 非数字字符(如”abc”) |
| 参数数量 | 恰好3个(如”1 2 3”) | 少于或多于3个(如”1 2”) |
- 边界值分析:选取1(最小正整数)、2147483647(int最大值)、1,1,2(a+b=c临界)、1,2,3(a+b=c+1临界)。

第三部分:详细测试用例表(节选)
| 用例编号 | 输入数据 | 预期结果 | 覆盖类型 | 备注 |
|-----------|-----------|------------|------------|------|
| TC-01 | 3 3 3 | 等边三角形 | 有效等价类(等边) | 基础验证 |
| TC-05 | 0 3 4 | 错误:边长必须为正整数 | 无效等价类(零) | 验证输入校验 |
| TC-08 | 1 1 2 | 不能构成三角形 | 边界值(a+b=c) | 关键临界点 |
| TC-12 | abc 3 4 | 错误:输入包含非数字字符! | 无效等价类(非数字) | 验证异常处理 |

该文档在课堂上作为“测试设计作业”下发,学生需根据此表,用JUnit为Triangle.java编写测试方法。实测表明,92%的学生能100%覆盖所有用例,证明其设计具备极强的指导性和可操作性。

4.4 源码(Triangle.java)的结构解析与二次开发指南

Triangle.java全文仅约80行,但每一行都服务于教学目的。以下是其结构化解析与修改建议:

// Triangle.java - 软件工程教学版
import java.util.Scanner;

/**
 * 三角形边长验证与分类工具
 * 功能:输入三个正整数边长,判断是否构成三角形,并分类为等边/等腰/不等边
 * 特点:使用long防溢出、清晰异常处理、无外部依赖
 * @author 教学项目组
 */
public class Triangle {
    public static void main(String[] args) {
        // 【模块1:输入获取与预处理】
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入三条边长(空格分隔):");
        String input = scanner.nextLine().trim();

        // 【模块2:输入合法性校验】
        if (input.isEmpty()) {
            System.out.println("错误:输入不能为空!");
            return;
        }
        String[] parts = input.split("\\s+");
        if (parts.length != 3) {
            System.out.println("错误:请精确输入三个数字!");
            return;
        }

        // 【模块3:安全数值解析】
        long[] sides = new long[3];
        try {
            for (int i = 0; i < 3; i++) {
                sides[i] = Long.parseLong(parts[i].trim());
            }
        } catch (NumberFormatException e) {
            System.out.println("错误:输入包含非数字字符!");
            return;
        }

        // 【模块4:正整数校验】
        for (long side : sides) {
            if (side <= 0) {
                System.out.println("错误:边长必须为正整数");
                return;
            }
        }

        // 【模块5:三角形成立判定】
        long a = sides[0], b = sides[1], c = sides[2];
        long sumAB = a + b;
        long sumBC = b + c;
        long sumAC = a + c;

        if (sumAB <= c || sumBC <= a || sumAC <= b) {
            System.out.println("不能构成三角形");
            return;
        }

        // 【模块6:三角形分类】
        if (a == b && b == c) {
            System.out.println("等边三角形");
        } else if (a == b || b == c || a == c) {
            System.out.println("等腰三角形");
        } else {
            System.out.println("不等边三角形");
        }
    }
}

二次开发指南
- 扩展小数支持:将long[] sides改为double[] sidesLong.parseLong()改为Double.parseDouble(),三角不等式改为Math.abs(a-b) < c && c < a+b(需同时验证三个组合)。
- 添加面积计算:在分类后,用海伦公式area = Math.sqrt(s*(s-a)*(s-b)*(s-c))s=(a+b+c)/2)计算并输出面积,需处理area为NaN的情况(不构成三角形时)。
- 输出图形化提示:在控制台用ASCII字符绘制简易三角形(如*号),增强可视化效果,适合编程入门课。

5. 常见问题与排查技巧实录

5.1 运行triangle.exe时闪退,看不到任何提示

这是初学者最常遇到的问题,根本原因只有一个:程序执行完立即退出,窗口关闭triangle.exe是控制台程序,当它完成所有逻辑(包括错误输出)后,命令行窗口会自动关闭,导致学生只看到一闪而过的黑屏。这不是bug,而是Windows控制台程序的默认行为。

提示:这不是程序崩溃,而是正常退出。解决方案极其简单——不要双击triangle.exe,而是右键点击,选择“复制路径”,然后在已打开的命令行窗口中粘贴并回车。这样窗口会保持打开,你能清晰看到所有输出,包括错误信息。

实操验证:在命令行中执行triangle.exe,输入-1 2 3,会看到:

错误:边长必须为正整数

然后光标停留在下一行,窗口不关闭。这证明程序工作正常,只是双击方式不适合调试。

5.2 输入3 4 5,程序输出“不能构成三角形”

这通常发生在学生自己编译Triangle.java时,但未使用jpackage,而是直接运行java Triangle。问题根源是输入格式理解偏差triangle.exejava Triangle都要求输入在一行内用空格分隔,但学生常误以为:
- 方式A(错误):先输入3回车,再输入4回车,再输入5回车 → 程序只读取第一个3,剩余输入被忽略,parts.length为1,触发“请精确输入三个数字”错误。
- 方式B(正确):在一行内输入3 4 5,然后按回车。

注意:流程图中“输入”节点明确标注“一行,空格分隔”,.docx文档的“使用说明”也配有截图。务必引导学生养成“看文档再操作”的习惯,而非凭直觉猜测。

5.3 Triangle.java编译报错:error: class Triangle is public, should be declared in a file named Triangle.java

这是一个经典的Java命名规则错误。Java规定:如果一个类被声明为public(如本项目的public class Triangle),那么它所在的文件名必须与类名完全一致,且区分大小写。常见错误包括:
- 文件名写成triangle.java(小写t)→ Windows系统不敏感,但Linux/macOS会报错。
- 文件名写成Triangle.txt(扩展名错误)→ 编译器找不到Java源文件。
- 文件中有隐藏字符(如UTF-8 BOM)→ 某些编辑器会插入不可见字符,导致编译器解析失败。

解决方案:用记事本或VS Code打开文件,另存为,编码选择“UTF-8无BOM”,文件名确认为Triangle.java(首字母大写,.java扩展名)。在命令行中用dir(Windows)或ls -l(Linux/macOS)确认文件名完全匹配。

5.4 测试用例TC-08: 1 1 2为何预期“不能构成三角形”?

这是对三角不等式本质的深度考察。数学上,三角形成立的充要条件是“任意两边之和大于第三边”,而非“大于等于”。当a=1, b=1, c=2时,a+b=2,等于c,此时三点共线,无法形成有面积的三角形。程序中if (sumAB <= c || ...)<=判断,正是对此的精确实现。

实操心得:在课堂演示时,我会用三根牙签(长度1cm, 1cm, 2cm)现场拼接,让学生亲眼看到:两根1cm牙签首尾相接,刚好与2cm牙签重合,无法“翘起”形成角度。这种实物演示,比任何代码解释都更有说服力。TC-08的存在,就是提醒学生:程序逻辑必须与数学定义严丝合缝,边界值不是刁难,而是检验严谨性的试金石。

5.5 如何用JUnit为Triangle.java编写单元测试?

Triangle.java是面向控制台的程序,直接测试main方法较困难。最佳实践是重构为可测试方法。在原文件末尾添加一个静态工具方法:

// 在Triangle.java末尾添加
public static String classifyTriangle(long a, long b, long c) {
    // 将main中除输入外的所有逻辑复制至此
    // 返回字符串结果,如"等边三角形"、"错误:边长必须为正整数"
}

然后用JUnit测试:

@Test
public void testEquilateral() {
    assertEquals("等边三角形", Triangle.classifyTriangle(3, 3, 3));
}

@Test
public void testInvalidZero() {
    assertEquals("错误:边长必须为正整数", Triangle.classifyTriangle(0, 3, 4));
}

提示:.docx文档中的测试用例表,就是为这种JUnit测试准备的“需求规格说明书”。学生只需将表中“输入数据”和“预期结果”填入@Test方法,就能快速构建完整的测试套件。这完美体现了“测试驱动开发(TDD)”的思想雏形。

6. 教学延伸与能力拓展建议

这个三角形工具的价值,远不止于完成一次实验作业。它是一块“多棱镜”,能折射出软件工程多个核心能力的训练路径。在我实际的教学中,常以此为基础,设计阶梯式拓展任务,帮助学生从“会写”走向“懂设计”。

第一层:健壮性深化
要求学生修改Triangle.java,使其支持“批量输入”。例如,输入batch 3,4,5 5,5,8 1,1,2,程序依次处理每组数据并输出结果。这迫使学生理解args参数的用途(main(String[] args)),学习字符串分割与循环处理,并思考如何优雅地报告多组结果(如编号输出:“第1组:不等边三角形”)。关键收获是:单一功能模块如何扩展为可复用的服务

第二层:质量保障升级
引入静态代码分析工具。用SonarQube扫描Triangle.java,学生会发现诸如“魔法数字(3)未定义常量”“缺少Javadoc”等问题。引导他们将3替换为private static final int EXPECTED_INPUT_COUNT = 3;,并为classifyTriangle方法添加完整Javadoc。这不再是“让程序跑起来”,而是“让代码可维护、可协作”。.gitignore文件的存在,正是为此埋下的伏笔——它暗示着版本控制与团队开发的起点。

第三层:架构视野拓展
提出挑战:“如果要将此功能提供给网页用户,该如何设计?”学生会自然想到前后端分离:前端HTML表单收集输入,后端Java Servlet接收请求并调用classifyTriangle方法,返回JSON结果。此时,Triangle.java中的核心逻辑(classifyTriangle)就从“主程序”蜕变为“业务服务组件”,而main方法只是其一种调用方式(命令行客户端)。这种解耦思维,是迈向工程化开发的关键跃迁。

最后分享一个小技巧:在期末复习时,我会把Triangle程序流程图.vsd投影出来,遮住所有文字,只留符号和连线,让学生口头描述每个菱形框应填写什么条件、每个处理框应执行什么操作。90%的学生能完整复述,这证明——一张好流程图,本身就是最高效的知识固化载体。它不依赖代码语法,只传递逻辑本质,而这,正是软件工程教学最该坚守的初心。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:输入三个整数边长,自动判断能否构成三角形,并区分等边、等腰或不等边类型。压缩包里包含直接双击运行的triangle.exe,无需安装Java环境;附带Visio格式的程序流程图(Triangle程序流程图.vsd),清晰展示输入校验、三角不等式判断、类型分支逻辑;源码Triangle.java结构简洁,注释明确,便于理解算法逻辑和二次修改;配套Word文档详细列出典型测试场景——包括合法组合(如3,3,3;5,5,8;4,5,6)、非法输入(0或负数、非数字字符)、边界值(1,1,2)等,覆盖黑盒测试中的有效/无效等价类和边界值分析要点;所有文件组织清晰,适合教学演示、实验课作业提交或软件测试入门练习。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

更多推荐