Java学习笔记2.3.1 运算符与表达式 - 算术运算符

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.3.1 运算符与表达式 - 算术运算符相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 掌握加法运算符
  2. 掌握减法运算符
  3. 掌握乘法运算符
  4. 掌握除法运算符
  5. 掌握自增自减运算符

一、运算符概述

  • 运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Java表达式的注意事项。

二、算术运算符(Arithmetic Operator)

  • Java中的算术运算符就是用来处理四则运算的符号,也是最简单和最常用的运算符号。

(一)分类说明表

运算符运算范例结果
+正号+33
-负号b = 4; -b;-4
+5 + 510
-6 - 42
*3 * 412
/除(即算术中整除的结果)32 / 56
%取模(即算术中的求余数)32 % 52
++自增(前)a = 2; b = ++a;a = 3; b = 3;
++自增(后)a = 2; b = a++;a = 3; b = 2;
自减(前)a = 2; b = --a;a = 1; b = 1;
自减(后)a = 2; b = a–;a = 1; b = 2;

(二)注意事项

  • 在进行自增(++)和自减(–)的运算时,如果运算符(++或–)放在操作数的前面则是先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。
  • 在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数;如果除法运算有小数参与,得到的结果会是一个小数。
  • 在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。
  • 注意运算优先级,(取负) ⟹ \\Longrightarrow *、/、% ⟹ \\Longrightarrow +、-。 如果要改变运算次序,那么需要加括号。

(三)案例演示

任务1、计算成绩差与平均成绩

输入三科STB、SQL、JAVA的成绩,计算SQL与JAVA的成绩差以及三科的平均分。

  • 一个程序包含四个部分:声明部分、输入部分、处理部分和输出部分,其中,处理部分是一个程序的核心,涉及解决问题的方法和步骤,即算法,在处理部分就会用到运算符、表达式与控制结构。
  • 输入各种类型的数据,需要实例化Scanner类,传一个参数System.in(标准字节输入流 - 键盘)。

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:计算成绩差与平均成绩
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example501 
    public static void main(String[] args) 
        // 声明部分
        double stb, java, sql, difference, average;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入STB的成绩:");
        stb = sc.nextDouble();
        System.out.print("输入Java的成绩:");
        java = sc.nextDouble();
        System.out.print("输入SQL的成绩:");
        sql = sc.nextDouble();

        // 处理部分
        difference = java - sql;
        average = (stb + java + sql) / 3;

        // 输出部分
        System.out.println("==========================");
        System.out.println("STB\\t\\tJava\\t\\tSQL");
        System.out.println(stb + "\\t" + java + "\\t\\t" + sql);
        System.out.println("==========================");
        System.out.println("Java与SQL的成绩差:" + difference);
        System.out.println("三门课程的平均分:" + average);
    

运行程序,结果如下:

思考:如何设置平均分的小数位数?(比如保留到小数点后面两位。)
可以参看Java讲课笔记04:变量与常量里的案例程序Example409。

采用制表转义字符\\t来控制输出项的间隔,可能最终每一列并非占据等宽,如何才能保证每一列占据等宽,并且左对齐呢?很简单,采用String.format()方法就可以搞定。

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:计算成绩差与平均成绩
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example501_ 
    public static void main(String[] args) 
        // 声明部分
        double stb, java, sql, difference, average;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入STB的成绩:");
        stb = sc.nextDouble();
        System.out.print("输入Java的成绩:");
        java = sc.nextDouble();
        System.out.print("输入SQL的成绩:");
        sql = sc.nextDouble();

        // 处理部分
        difference = java - sql;
        average = (stb + java + sql) / 3;

        // 输出部分
        System.out.println("=======================");
        System.out.println(String.format("%-9s%-9s%-9s","STB", "Java", "SQL"));
        System.out.println(String.format("%-9.1f%-9.1f%-9.1f", stb, java, sql));
        System.out.println("=======================");
        System.out.println("Java与SQL的成绩差:" + difference);
        System.out.println("三门课程的平均分:" + String.format("%.2f", average));
    

运行程序,查看结果:

说明:String.format("%-9s%-9s%-9s","STB", "Java", "SQL")

  • %-9s —— 输出字符串数据,宽度为9,不足时在右边补足空格,用于产生左对齐效果;数据数据实际位数超过指定位数,按实际位数输出
  • %9s —— 输出字符串数据,宽度为9,不足时在左边补足空格,用于产生右对齐效果;数据数据实际位数超过指定位数,按实际位数输出
  • 如果要输出整型数据,那么要用%d,当然也可以指定宽度以及对齐方式,比如%8d、%-8d(总位数是8位,输出数据实际位数超过指定位数,按实际位数输出,不足时就补空格)
  • 如果要输出浮点型数据,那么要用%f,当然也可以指定宽度以及对齐方式,比如%9.1f、%-9.1f(总位数是9位,保留一位小数)

课堂练习:编程处理带余除法。

任务2、打印购物小票

打印购物小票并计算购物积分,结算时打印购物小票,计算此次购物积分购买三种商品,并且有折扣,付费以及找钱票。

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:结算时打印购物小票,计算此次购物积分
 *      购买三种商品,并且有折扣,付费以及找钱
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example502 
    public static void main(String[] args) 
        // 三种商品的单价
        double price1, price2, price3;
        // 三种商品的购买数量
        int amount1, amount2, amount3;
        // 购物折扣
        double discount = 0.8;
        // 购物总金额
        double money;
        // 实际交费
        double pay;
        // 应找钱
        double change;
        // 购物积分
        int points;
        // 扫描器
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入T恤的单价:");
        price1 = sc.nextDouble();
        System.out.print("输入T恤购买数量:");
        amount1 = sc.nextInt();
        System.out.print("输入网球鞋的单价:");
        price2 = sc.nextDouble();
        System.out.print("输入网球鞋购买数量:");
        amount2 = sc.nextInt();
        System.out.print("输入网球拍的单价:");
        price3 = sc.nextDouble();
        System.out.print("输入网球拍购买数量:");
        amount3 = sc.nextInt();
        System.out.print("顾客实际交费:");
        pay = sc.nextDouble();

        // 处理部分
        money = (price1 * amount1 + price2 * amount2 + price3 * amount3) * discount; // 计算购物总金额
        change = pay - money; // 计算找钱
        points = (int) (money / 33); // 计算购物积分

        // 输出部分
        System.out.println("************消费单**********");
        System.out.println("购买物品\\t\\t单价\\t个数\\t金额");
        System.out.println("T恤\\t\\t\\t" + price1 + "\\t" + amount1 + "\\t\\t¥" + price1 * amount1);
        System.out.println("网球鞋\\t\\t" + price2 + "\\t" + amount2 + "\\t\\t¥" + price2 * amount2);
        System.out.println("网球拍\\t\\t" + price3 + "\\t" + amount3 + "\\t\\t¥" + price3 * amount3);
        System.out.println();
        System.out.println("折扣:" + (int) (discount * 10) + "折");
        System.out.println("消费总金额:¥" + money);
        System.out.println("实际交费:¥" + pay);
        System.out.println("找钱:¥" + change);
        System.out.println("本次购物所获得的积分:" + points);
    

运行程序,结果如下:

任务3、幸运抽奖 - 由卡号计算幸运数

输入会员卡号(4位数)、分解出各位数字,再把各位数字相加,得到幸运数字,然后利用幸运数字去抽奖。编写程序,如何由卡号得到幸运数字。

难点:如何把一个四位数拆分?
解决问题的思路:例如n = 3462
3426 = 3 * 1000 + 4 * 100 + 6 *10 + 2

除了个位数2之外,其余的各位数都能被10整除,那就意味着2是3462除以10的余数,怎么表示?3462 % 10 = 2

个位数得到之后,我们希望去掉个位数,把四位数变成三位数,然后就可以采用类似的方法得到三位数的末尾数,其实就是四位数的十位数;那么怎么才能得到这样的三位数呢?3462 / 10 = 346

346 = 3 * 100 + 4 * 10 + 6 怎么得到末尾数呢? 346 % 10 = 6
然后又把346变成34,怎么做?346 / 10 = 34

34 = 3 * 10 + 4,怎么得到末尾数呢?34 % 10 = 4
然后又34变成3,怎么做?34 / 10 = 3


package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:由会员卡号计算幸运数
 *      幸运数等于会员卡号各位数字之和
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example503 
    public static void main(String[] args) 
        /* 声明部分 */
        int id; // 会员卡号
        int x1, x2, x3, x4; // 个位数、十位数、百位数、千位数
        int luckyNumber; // 幸运数字
        Scanner sc = new Scanner(System.in);  // 扫描器对象

        /* 输入部分 */
        System.out.print("输入会员卡号(四位数):");
        id = sc.nextInt(); // 从键盘接收一个整数

        /* 处理部分 */
        x1 = id % 10; // 取个位数
        x2 = id / 10 % 10; // 取十位数
        x3 = id / 100 % 10; // 取百位数
        x4 = id / 1000; // 取千位数
        luckyNumber = x1 + x2 + x3 + x4; // 计算幸运数字

        /* 输出部分 */
        System.out.println("你的幸运数:" + luckyNumber);
    


思考题: 如果输入的卡号不是四位数,程序会出现什么情况?应该如何改善这个程序,只处理输入四位数的情况?我们这个拆分数字的方法能否推广到任意多位数呢?

任务4、演示自增与自减运算

  • 自增有前自增与后自增两种情况。前自增,++a,先增后用;后自增,a++,先用后增。
  • 自减有前自减与后自减两种情况。前自减,–a,先减后用;后自减,a–,先用后减。





课堂练习:给出下列代码的执行结果。

public class Example503__ 
    public static void main(String[] args) 
        int a = 10, b = 20, c, d;

        c = a++ + b--;
        d = ++a + --b;

        System.out.println("c = " + c);
        System.out.println("d = " + d);
    

自增与自减运算,主要会用在循环结构里的更新条件,可以参看下一讲的循环结构案例。

以上是关于Java学习笔记2.3.1 运算符与表达式 - 算术运算符的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记2.3.3 运算符与表达式 - 关系运算符

Java学习笔记2.3.2 运算符与表达式 - 赋值运算符

Java学习笔记2.3.4 运算符与表达式 - 逻辑运算符

Java学习笔记2.3.6 运算符与表达式 - 条件运算符

Java学习笔记2.3.5 运算符与表达式 - 位运算符

java学习笔记2(datawhale教程):运算符和表达式流程控制数组