Java控制流 小案例
在编程中,控制流(Control Flow)指的是程序执行的顺序。通过使用不同的控制结构,我们可以改变代码的执行路径,以达到不同的逻辑处理效果。下面将详细介绍条件语句、循环语句以及break
和continue
语句,并通过一个简单的计算器例子来演示这些概念的应用。
条件语句
if/else
if/else
是最基本的条件语句,它允许根据某个条件来决定是否执行特定的代码块。语法如下:
if (condition) {// 条件为真时执行的代码
} else {// 条件为假时执行的代码
}
三元运算符
三元运算符(Ternary Operator)是一种简写形式的条件表达式,其语法如下:
(condition) ? expression_if_true : expression_if_false
例如,可以用来快速判断并返回两个数中的较大者:
maxValue = (a > b) ? a : b;
switch/case
switch/case
语句用于基于不同的条件执行不同的代码块,通常用于多分支的选择。它的基本语法是:
switch (expression) {case value1:// 当expression等于value1时执行的代码break;case value2:// 当expression等于value2时执行的代码break;default:// 如果没有匹配到任何case,则执行这里的代码
}
循环语句
for
for
循环非常适合当你知道循环需要执行的次数时使用。基本语法如下:
for (initialization; condition; increment/decrement) {// 循环体内的代码
}
while
while
循环则是在不知道循环次数的情况下使用,只要条件为真就会一直执行。语法如下:
while (condition) {// 循环体内的代码
}
do…while
do...while
循环至少会执行一次,即使条件一开始就是假的。语法如下:
do {// 循环体内的代码
} while (condition);
break 和 continue
break
用于立即退出循环或switch
语句。continue
用于跳过当前循环中的剩余部分,并直接开始下一次迭代。
实战案例:简单的计算器
接下来,我们创建一个简单的命令行计算器来演示如何使用上述的控制流语句。
import java.util.Scanner;public class SimpleCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个数字:");double num1 = scanner.nextDouble();System.out.println("请输入操作符 (+, -, *, /):");String operator = scanner.next();System.out.println("请输入第二个数字:");double num2 = scanner.nextDouble();double result;switch (operator) {case "+":result = num1 + num2;break;case "-":result = num1 - num2;break;case "*":result = num1 * num2;break;case "/":if (num2 == 0) {System.out.println("除数不能为零!");return;}result = num1 / num2;break;default:System.out.println("无效的操作符!");return;}System.out.printf("%.2f %s %.2f = %.2f\n", num1, operator, num2, result);}
}
这个程序首先提示用户输入两个数字和一个操作符,然后根据输入的操作符执行相应的数学运算,并输出结果。这里我们使用了switch
语句来根据不同的操作符选择不同的计算方法。如果用户输入了一个无效的操作符,程序将输出错误信息并终止运行。
当然,我们可以进一步扩展这个简单的计算器案例,增加更多的功能和复杂性,比如添加循环让用户可以连续进行多次计算,直到他们选择退出程序。同时,我们还可以添加异常处理来增强程序的健壮性。以下是一个更完整的版本:
import java.util.Scanner;
import java.util.InputMismatchException;public class AdvancedCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);boolean keepRunning = true;while (keepRunning) {try {System.out.println("\n欢迎使用简易计算器,请按提示操作:");System.out.println("请输入第一个数字:");double num1 = scanner.nextDouble();System.out.println("请输入操作符 (+, -, *, /):");String operator = scanner.next();System.out.println("请输入第二个数字:");double num2 = scanner.nextDouble();double result;switch (operator) {case "+":result = num1 + num2;break;case "-":result = num1 - num2;break;case "*":result = num1 * num2;break;case "/":if (num2 == 0) {System.out.println("除数不能为零!");continue;}result = num1 / num2;break;default:System.out.println("无效的操作符!");continue;}System.out.printf("%.2f %s %.2f = %.2f\n", num1, operator, num2, result);System.out.println("是否继续使用计算器? (y/n)");String choice = scanner.next();if (!choice.equalsIgnoreCase("y")) {keepRunning = false;}} catch (InputMismatchException e) {System.out.println("输入错误,请确保您输入的是数字。");scanner.next(); // 清空错误输入}}System.out.println("感谢使用简易计算器,再见!");}
}
在这个版本中,我们添加了一个while
循环,让程序可以在用户完成一次计算后询问是否继续。如果用户输入非数字字符,程序将捕获InputMismatchException
异常,并提示用户重新输入。
此外,我们还使用了continue
语句来跳过当前循环的剩余部分,并从while
循环的起始处重新开始,这样当用户输入无效操作符或者程序检测到除数为零时,不会影响到后续的计算过程。
以上就是一个更加完整的计算器实现示例,它包含了控制流的基本元素,如if/else
、switch/case
、for/while/do...while
循环以及break
和continue
语句的使用。
让我们进一步拓展这个计算器的功能,并且增加一些额外的功能,比如允许用户查看帮助信息、提供一个简单的菜单系统来选择操作等。同时,我们将添加一些错误处理机制来确保程序的健壮性和用户体验。
以下是改进后的计算器程序:
import java.util.Scanner;
import java.util.InputMismatchException;public class EnhancedCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);boolean keepRunning = true;while (keepRunning) {printMenu();int choice = getChoice(scanner);switch (choice) {case 1: // 加法performCalculation(scanner, "+");break;case 2: // 减法performCalculation(scanner, "-");break;case 3: // 乘法performCalculation(scanner, "*");break;case 4: // 除法performCalculation(scanner, "/");break;case 5: // 帮助printHelp();break;case 6: // 退出keepRunning = false;break;default:System.out.println("无效的选择,请重新输入。");break;}}System.out.println("感谢使用简易计算器,再见!");}private static void printMenu() {System.out.println("\n简易计算器菜单:");System.out.println("1. 加法");System.out.println("2. 减法");System.out.println("3. 乘法");System.out.println("4. 除法");System.out.println("5. 查看帮助");System.out.println("6. 退出程序");System.out.print("请选择一个操作:");}private static int getChoice(Scanner scanner) {while (true) {try {return scanner.nextInt();} catch (InputMismatchException e) {System.out.println("无效的输入,请输入一个整数。");scanner.next(); // 清空错误输入}}}private static void performCalculation(Scanner scanner, String operation) {System.out.println("请输入第一个数字:");double num1 = scanner.nextDouble();System.out.println("请输入第二个数字:");double num2 = scanner.nextDouble();double result;switch (operation) {case "+":result = num1 + num2;break;case "-":result = num1 - num2;break;case "*":result = num1 * num2;break;case "/":if (num2 == 0) {System.out.println("除数不能为零!");return;}result = num1 / num2;break;default:throw new IllegalArgumentException("Unexpected value: " + operation);}System.out.printf("%.2f %s %.2f = %.2f\n", num1, operation, num2, result);}private static void printHelp() {System.out.println("\n简易计算器帮助:");System.out.println("此计算器支持四种基本运算:加法、减法、乘法和除法。");System.out.println("在进行除法运算时,请确保除数不是零。");System.out.println("输入非数字字符会导致输入错误。");}
}
在这个版本中,我们增加了以下几个特性:
- 菜单系统:用户可以通过菜单选择不同的操作。
- 帮助信息:用户可以通过选择“查看帮助”来获得关于如何使用计算器的信息。
- 更好的错误处理:当用户输入非数字字符时,程序会提示错误并要求重新输入。
这个版本不仅提高了程序的可用性,还增加了用户体验。用户现在可以更容易地理解和使用这个简单的计算器程序。
好的,我们可以进一步完善这个计算器程序,使其更具交互性和功能性。接下来,我们将在现有的基础上增加一些额外的功能,如支持复数运算、提供历史记录查看等功能,并优化用户界面。
扩展功能:支持复数运算
为了支持复数运算,我们需要定义一个新的类来表示复数,并实现基本的复数运算方法。然后,在主程序中添加相应的选项来支持复数的加、减、乘、除。
复数类定义
首先,定义一个ComplexNumber
类来表示复数,并实现加、减、乘、除的方法:
public class ComplexNumber {private double real;private double imaginary;public ComplexNumber(double real, double imaginary) {this.real = real;this.imaginary = imaginary;}public double getReal() {return real;}public double getImaginary() {return imaginary;}public ComplexNumber add(ComplexNumber other) {return new ComplexNumber(this.real + other.real, this.imaginary + other.imaginary);}public ComplexNumber subtract(ComplexNumber other) {return new ComplexNumber(this.real - other.real, this.imaginary - other.imaginary);}public ComplexNumber multiply(ComplexNumber other) {double newReal = this.real * other.real - this.imaginary * other.imaginary;double newImaginary = this.real * other.imaginary + this.imaginary * other.real;return new ComplexNumber(newReal, newImaginary);}public ComplexNumber divide(ComplexNumber other) {double denominator = other.real * other.real + other.imaginary * other.imaginary;double newReal = (this.real * other.real + this.imaginary * other.imaginary) / denominator;double newImaginary = (this.imaginary * other.real - this.real * other.imaginary) / denominator;return new ComplexNumber(newReal, newImaginary);}@Overridepublic String toString() {return "(" + real + (imaginary >= 0 ? "+" : "") + imaginary + "i)";}
}
主程序扩展
接下来,我们需要在主程序中添加新的选项来支持复数运算,并且修改用户界面以适应新的功能。
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.InputMismatchException;public class EnhancedCalculator {private static List<String> history = new ArrayList<>();public static void main(String[] args) {Scanner scanner = new Scanner(System.in);boolean keepRunning = true;while (keepRunning) {printMenu();int choice = getChoice(scanner);switch (choice) {case 1: // 加法case 2: // 减法case 3: // 乘法case 4: // 除法performCalculation(scanner, choice);break;case 5: // 查看帮助printHelp();break;case 6: // 查看历史记录viewHistory();break;case 7: // 退出程序keepRunning = false;break;default:System.out.println("无效的选择,请重新输入。");break;}}System.out.println("感谢使用简易计算器,再见!");}private static void printMenu() {System.out.println("\n简易计算器菜单:");System.out.println("1. 加法");System.out.println("2. 减法");System.out.println("3. 乘法");System.out.println("4. 除法");System.out.println("5. 查看帮助");System.out.println("6. 查看历史记录");System.out.println("7. 退出程序");System.out.print("请选择一个操作:");}private static int getChoice(Scanner scanner) {while (true) {try {return scanner.nextInt();} catch (InputMismatchException e) {System.out.println("无效的输入,请输入一个整数。");scanner.next(); // 清空错误输入}}}private static void performCalculation(Scanner scanner, int choice) {System.out.println("请输入第一个数字或复数(格式:实部,虚部):");String firstInput = scanner.next();System.out.println("请输入第二个数字或复数(格式:实部,虚部):");String secondInput = scanner.next();ComplexNumber num1, num2;try {num1 = parseComplex(firstInput);num2 = parseComplex(secondInput);} catch (NumberFormatException e) {System.out.println("输入格式错误,请输入正确的数字或复数格式。");return;}ComplexNumber result;switch (choice) {case 1:result = num1.add(num2);break;case 2:result = num1.subtract(num2);break;case 3:result = num1.multiply(num2);break;case 4:result = num1.divide(num2);break;default:throw new IllegalStateException("Unexpected value: " + choice);}String resultStr = num1.toString() + " " + choice + " " + num2.toString() + " = " + result.toString();history.add(resultStr);System.out.println(resultStr);}private static ComplexNumber parseComplex(String input) throws NumberFormatException {String[] parts = input.split(",");if (parts.length != 2) {throw new NumberFormatException("Invalid complex number format.");}double real = Double.parseDouble(parts[0]);double imaginary = Double.parseDouble(parts[1]);return new ComplexNumber(real, imaginary);}private static void printHelp() {System.out.println("\n简易计算器帮助:");System.out.println("此计算器支持四种基本运算:加法、减法、乘法和除法。");System.out.println("支持复数运算,输入格式为:实部,虚部。");System.out.println("在进行除法运算时,请确保除数不是零。");System.out.println("输入非数字字符会导致输入错误。");}private static void viewHistory() {if (history.isEmpty()) {System.out.println("没有历史记录。");} else {System.out.println("历史记录:");for (String entry : history) {System.out.println(entry);}}}
}
在这个版本中,我们做了以下改进:
- 复数运算支持:新增了对复数的支持,并在主菜单中提供了相同的操作选项。
- 历史记录:每次计算的结果都会被记录下来,用户可以选择查看历史记录。
- 输入验证:增强了输入验证,确保用户输入符合预期的格式。
通过这些改进,计算器变得更加功能齐全,并且能够更好地处理各种类型的数值运算。用户界面也得到了优化,使得程序更加易于使用。