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

Day3 Java 学习笔记:运算符与简易计算器

一、今日学习目标

本次学习内容主要围绕 Java 运算符展开,并完成一个简易计算器程序。

学习任务:

  • 学习 Java 常见运算符

  • 理解算术运算符、赋值运算符、比较运算符、逻辑运算符

  • 手写一个支持加、减、乘、除、取余的计算器

  • 掌握 switch 分支判断

  • 掌握 do while 输入校验

  • 理解 int / int 的整数除法问题

  • 处理除数为 0 的情况


二、运算符基础

1. 算术运算符

算术运算符主要用于数学计算。

运算符含义示例
+ 加法 10 + 3
- 减法 10 - 3
* 乘法 10 * 3
/ 除法 10 / 3
% 取余 10 % 3

示例:

int a = 10;
int b = 3;

System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3
System.out.println(a % b); // 1

注意:

10 / 3

结果是:

3

不是:

3.3333

原因是:103 都是整数,整数除以整数,结果还是整数,小数部分会被舍掉。


2. 赋值运算符

赋值运算符用于给变量赋值。

最基础的是:

int num = 10;

这里的 = 不是数学里的等于,而是赋值。

意思是:把右边的 10 放进左边的变量 num 里面。

常见赋值运算符:

运算符示例等价写法
= num = 10 把 10 赋值给 num
+= num += 5 num = num + 5
-= num -= 3 num = num - 3
*= num *= 2 num = num * 2
/= num /= 4 num = num / 4
%= num %= 3 num = num % 3

示例:

int num = 10;

num += 5;   // num = 15
num *= 2;   // num = 30
num -= 8;   // num = 22

System.out.println(num); // 22

计算过程:

num = 10
num += 5   -> 15
num *= 2   -> 30
num -= 8   -> 22

3. 比较运算符

比较运算符用于比较两个值。

比较运算符的结果只有两个:

true
false

常见比较运算符:

运算符含义
> 大于
< 小于
>= 大于等于
<= 小于等于
== 判断是否相等
!= 判断是否不相等

示例:

int age = 18;

System.out.println(age >= 18); // true
System.out.println(age < 18); // false
System.out.println(age == 18); // true
System.out.println(age != 18); // false

重点区别:

a = b;

这是赋值。

a == b;

这是判断是否相等。


4. 逻辑运算符

逻辑运算符用于连接多个条件。

运算符含义说明
&& 并且 两边都为 true,结果才是 true
|| 或者 只要有一边是 true,结果就是 true
! 取反 true 变 false,false 变 true

示例:

int age = 20;
boolean hasTicket = false;

System.out.println(age >= 18 && hasTicket); // false
System.out.println(age >= 18 || hasTicket); // true
System.out.println(!hasTicket); // true

解释:

age >= 18 && hasTicket

年龄满足,但是没有票,所以结果是 false

age >= 18 || hasTicket

年龄满足,虽然没有票,但是 || 只要一个条件成立,结果就是 true

!hasTicket

hasTicketfalse,取反后就是 true


三、本次计算器程序学习点

1. 使用 Scanner 接收用户输入

代码:

Scanner sc = new Scanner(System.in);

作用:创建一个键盘输入对象。

接收整数:

int a = sc.nextInt();

接收字符串:

String input = sc.next();

接收字符串中的第一个字符:

char op = input.charAt(0);

2. 为什么运算符用 char 类型?

因为本次计算器只需要接收一个运算符,例如:

+
-
*
/
%

这些都是单个字符,所以可以用:

char op;

但是局部变量在使用前必须初始化,所以写成:

char op = ' ';

这里的 ' ' 表示先给变量一个空字符作为占位。


3. 使用 do while 校验运算符

本次代码中使用了:

do {
// 输入和判断
} while (!isValidOp);

意思是:

先执行一次输入,然后判断输入是否合法。

如果输入不合法,就继续循环。

本次判断规则:

if (op == '+' || op == '-' || op == '*' || op == '/' || op == '%') {
isValidOp = true;
}

意思是:只有输入 + - * / % 中的一个,才算合法。


4. 为什么要判断 input.length() == 1?

用户有可能输入:

++
abc
加号

这些都不是一个字符。

所以要先判断:

if (input.length() == 1) {
op = input.charAt(0);
}

只有用户输入的是一个字符,才继续判断这个字符是不是合法运算符。


5. 使用 switch 根据运算符执行不同计算

本次代码使用:

switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
}

意思是:

根据用户输入的运算符,执行对应的计算逻辑。

例如用户输入 +,就执行加法。

用户输入 *,就执行乘法。


6. 除数不能为 0

除法中,第二个数字不能为 0。

错误示例:

10 / 0

所以代码中要判断:

if (b != 0) {
result = (double) a / b;
} else {
System.out.println("错误:除数不能为0!");
isOk = false;
}

取余 % 也不能对 0 取余,所以也需要判断:

if (b != 0) {
result = a % b;
} else {
System.out.println("错误:除数不能为0!");
isOk = false;
}

四、本次重点坑点总结

1. int / int 会丢小数

本次最重要的坑:

int a = 10;
int b = 4;

double result = a / b;

结果是:

2.0

不是:

2.5

原因:

a / b

会先按照整数除法计算,得到 2,再赋值给 double,所以最后是 2.0

正确写法:

double result = (double) a / b;

这样会先把 a 转成 double,再参与除法计算,结果就是:

2.5

2. 局部变量使用前必须初始化

错误示例:

char op;

如果后续编译器无法确认 op 一定会被赋值,就可能报错。

本次使用:

char op = ' ';

先给一个空字符占位,避免未初始化问题。


3. default 分支也要处理错误状态

虽然前面已经校验过运算符,正常不会进入 default,但是代码要写严谨。

建议写法:

default:
System.out.println("输入的运算符有误!");
isOk = false;
break;

这样即使出现意外情况,也不会错误输出结果。


4. 用 isOk 控制是否输出结果

本次使用:

boolean isOk = true;

如果计算过程中出现错误,例如除数为 0:

isOk = false;

最后输出结果前判断:

if (isOk) {
System.out.println("计算结果是:" + result);
}

这样可以避免程序在出错后继续输出错误结果。


五、本次程序执行流程

整体流程:

1. 创建 Scanner 输入对象
2. 输入第一个数字 a
3. 输入运算符 op
4. 校验 op 是否为 + - * / % 中的一个
5. 如果不合法,继续重新输入
6. 输入第二个数字 b
7. 输出用户输入的表达式
8. 使用 switch 判断运算符
9. 执行对应的加、减、乘、除、取余
10. 如果是除法或取余,判断 b 是否为 0
11. 如果没有错误,输出计算结果
12. 关闭 Scanner

六、测试用例

1. 加法测试

输入:

10
+
5

预期结果:

计算结果是:15.0

2. 减法测试

输入:

10
-
3

预期结果:

计算结果是:7.0

3. 乘法测试

输入:

10
*
3

预期结果:

计算结果是:30.0

4. 除法测试

输入:

10
/
4

预期结果:

计算结果是:2.5

5. 取余测试

输入:

10
%
3

预期结果:

计算结果是:1.0

6. 除数为 0 测试

输入:

10
/
0

预期结果:

错误:除数不能为0!
计算结束...

不会输出计算结果。


7. 错误运算符测试

输入:

10
++

预期结果:

错误:只能输入一个字符,请重新输入!

七、今日掌握情况

本次已经完成:

  • 会使用算术运算符:+ - * / %

  • 会使用赋值运算符:= += -= *= /= %=

  • 会使用比较运算符:> < >= <= == !=

  • 会使用逻辑运算符:&& || !

  • 会用 Scanner 接收键盘输入

  • 会用 do while 做输入校验

  • 会用 switch 根据不同运算符执行不同逻辑

  • 会判断除数不能为 0

  • 理解了 int / int 丢小数的问题

  • 会使用 (double) 强制类型转换解决整数除法问题


八、后续可升级方向

后续可以继续升级这个计算器:

  • 支持小数输入,把 int 改为 double

  • 支持连续计算

  • 支持输入错误数字时重新输入

  • 支持退出程序

  • 支持更多运算,例如平方、开方

  • 使用方法封装,把每种计算写成单独的方法


九、最终源码

文件名:

CalculatorDemo.java

最终代码:

import java.util.Scanner;

public class CalculatorDemo {
   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("请输入第一个数字:");
       int a = sc.nextInt();

//       System.out.println("请输入运算符(+ - * /):");
//       char op = sc.next().charAt(0);
       //   假设只允许输入一个计算符| Java 编译器要求局部变量在使用前必须被初始化,虽然 do-while 循环一定会给 op 赋值,但编译器无法静态分析出这一点
       char op=' ';
       boolean isValidOp = false;

       do {
           System.out.println("请输入运算符(+ - * / %):");
           String input = sc.next();
           if (input.length() == 1) {
               op = input.charAt(0);
               if (op == '+' || op == '-' || op == '*' || op == '/' || op == '%') {
                   isValidOp = true;
              } else {
                   System.out.println("错误:运算符只能是 + - * / % 中的一个,请重新输入!");
              }
          } else {
               System.out.println("错误:只能输入一个字符,请重新输入!");
          }
      } while (!isValidOp);

       System.out.println("请输入第二个数字:");
       int b = sc.nextInt();

       System.out.println("输入的数字是:" + a + " " + op + " " + b);
       double result = 0;
       boolean isOk = true;
       System.out.println("开始计算...");
       switch (op) {
           case '+':
               result = a + b;
               break;
           case '-':
               result = a - b;
               break;
           case '*':
               result = a * b;
               break;
           case '/':
               if (b != 0) {
                   result = (double) a / b;
              } else {
                   System.out.println("错误:除数不能为0!");
                   isOk = false;
              }
               break;
           case '%':
               if (b != 0) {
                   result = a % b;
              } else {
                   System.out.println("错误:除数不能为0!");
                   isOk = false;
              }
               break;
           default:
               System.out.println("输入的运算符有误!");
               isOk = false;
               break;
      }

       System.out.println("计算结束...");
       if (isOk) {
           System.out.println("计算结果是:" + result);
      }
       sc.close();

  }

}
http://www.gsyq.cn/news/1563799.html

相关文章:

  • SGA-MCTS:基于蒙特卡洛树搜索与原子经验检索的智能体架构解析
  • Node.js path模块实战指南:跨平台路径处理与安全校验
  • 2026合肥漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 家里管道堵了别乱找!2026济南正规疏通维修团队甄选指南 - 宅安选房屋修缮
  • 2026合肥防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 三步掌握QrScan:高效离线批量二维码识别终极指南
  • 渗透测试必备:16款Chrome插件打造高效安全评估工作流
  • 2026吉安漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 2026台州漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • Maya glTF 2.0导出插件:3D资产跨平台转换的终极解决方案
  • Ubuntu 18.04 SSH密钥配置实战:RSA 3072+VS Code远程开发零故障
  • ARM中断机制与LPC210x外部中断配置实战详解
  • NXP智能门锁平台:多模态身份验证与Matter生态集成开发指南
  • GitHub最全前端资源汇总仓库FrontEndGitHub:从入门学习到进阶求职的一站式导航与开源共建指南
  • 5p072基于深度学习的车道线检测系统(django)1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码
  • NXP i.MX RT与Murata Wi-Fi/BT模块集成实战:从硬件连接到SDK配置
  • 2026年中广州小红书推广销售公司专业选择指南:佐维营销实力剖析 - 品牌鉴赏官2026
  • 终极游戏手柄转换指南:如何让老旧手柄在现代游戏中重获新生
  • 2026 丽水生成式引擎优化服务商全景测评:主流 GEO 机构综合实力深度解析 - 936品牌测评网
  • OpenClaw:本地AI工作流的可编程调度中枢
  • YOLO自定义数据集GPU训练全链路实战指南
  • HarmonyOS技术精讲之Background Tasks Kit(后台任务开发服务)——基础概念与任务类型解析
  • 华硕笔记本风扇噪音终极解决方案:G-Helper手动控制完全指南
  • 2026年近期广东AI玩具优质厂家专业解析:聚焦东莞市福盈电子科技有限公司 - 品牌鉴赏官2026
  • 嵌入式GUI显示驱动配置实战:从emWin GUIDRV_SPage到硬件接口优化
  • 2026年当下江苏隔断销售厂家深度解析:如何甄别与选择可靠合作伙伴 - 品牌鉴赏官2026
  • Win11本地部署OpenClaw:系统级AI智能体实战指南
  • 独立产品智能化:从零搭建 AI 驱动的用户引导系统
  • emWin控件开发实战:SLIDER与SPINBOX创建、定制与交互指南
  • 2026北京老字画回收公司哪家好?行业选择指南 - 品牌排行榜