[连载]Java程序设计(02)---任务驱动方式:个人所得税计算器

在上一章,我们开发了一个将英制单位转换成公制单位的程序,如果我们希望该程序更实用一些,实现英制单位(英寸)和公制单位(厘米)的互换,那么代码又该如何编写呢?有一点可以肯定,我们需要在程序中设置决策条件,如果输入的单位是英寸,转换的目标就是厘米;如果输入的单位是厘米,转换的目标就是英寸。为此,我们需要构造分支结构,让程序中有两条执行路径。代码如下所示:

package com.lovo;

import java.util.Scanner;

public class MyConverter {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("输入: ");
		double length = sc.nextDouble();
		String unit = sc.next();
		if(unit.equals("英寸")) {
			System.out.printf("%f英寸 = %f厘米\n", length, length * 2.54);
		}
		else if(unit.equals("厘米")) {
			System.out.printf("%f厘米 = %f英寸\n", length, length / 2.54);
		}
		else {
			System.out.println("无法处理的单位!");
		}
		sc.close();
	}
}

运行上面的程序,结果如下所示:

输入: 13 厘米
13.000000厘米 = 5.118110英寸

输入: 3.9 英寸
3.900000英寸 = 9.906000厘米

注意:输入的时候,13和厘米之间应该放置一个空格作为分隔符,否则上面的程序无法将长度和单位分别读取出来。

在上面的代码中,我们使用了一种叫做if...else...的结构,if是Java中设置条件的关键字,后面的圆括号中会设置一个条件,如果条件成立(true),则执行if后面花括号中的代码;如果条件不成立(false),就执行else后面花括号中的代码。当然也可以在else后面再用if设置条件,条件成立和不成立再次分成两条不同的执行路径。

上面的代码中,我们用到了一种新的类型String,在Java中String是表示字符串的对象类型,String对象有很多的属性和方法,刚才使用的equals方法就是用于比较两个字符串内容是否相同的方法。


任务:现在你回到国内工作,要为你所在的公司开发薪资管理系统。你的工作是编写个人所得税计算工具。在我国,个人所得税的起征点是3500元,计算公式是:

个人所得税 = (工资收入 -  五险一金 - 个税起征点) * 税率 - 速算扣除数

其中,税率和速算扣除数可以查下表得到:


由于不同的地区不同的企业对五险一金的计算方式有所差异,我们在程序中用输入的方式指定输入五险一金的金额。

代码如下所示:

package com.lovo;

import java.util.Scanner;

public class TaxCalculator {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入工资: ");
		double salary = sc.nextDouble();
		System.out.print("请输入五险一金: ");
		double insurance = sc.nextDouble();
		double base = salary - insurance - 3500;
		double tax = 0;
		if(base <= 0) {
			tax = 0;
		}
		else if(base <= 1500) {
			tax = base * 0.03;
		}
		else if(base <= 4500) {
			tax = base * 0.1 - 105;
		}
		else if(base <= 9000) {
			tax = base * 0.2 - 555;
		}
		else if(base <= 35000) {
			tax = base * 0.25 - 1005;
		}
		else if(base <= 55000) {
			tax = base * 0.3 - 2755;
		}
		else if(base <= 80000) {
			tax = base * 0.35 - 5505;
		}
		else {
			tax = base * 0.45 - 13505;
		}
		System.out.println("应缴纳个人所得税:" + tax);
		sc.close();
	}
}

事实上,要构造分支结构还有一种方式,就是使用switch...case...default...结构,这是C、C++和Java中构造多分支结构的一种方式。但是需要注意的是这种结构只能进行等值判断,而且switch结构在JDK 1.5以前的版本能够处理的只有byte(字节型)、short(短整型)、int(整型)、char(字符型),Java 5对switch进行了增强,可以处理枚举(enum)类型;Java 7对switch进行了再次增强,可以处理字符串(String)类型。swtich结构中的每个case就是一个分支,通常每个case后面都有一个break来避免执行完一个case后又进入下一个case。通常,在最后一个case之后可以放置default,当前面的case都没有匹配成功时,则会执行default中的代码,但default并不是必须的。

下面的例子模拟将一颗色子投掷6000次,统计每一面出现的次数。

package com.lovo;

public class DiceStatistic {

	public static void main(String[] args) {
		int f1, f2, f3, f4, f5, f6;
		f1 = f2 = f3 = f4 = f5 = f6 = 1;
		for(int i = 1; i <= 6000; i++) {
			switch(roll()) {
			case 1: f1++; break;
			case 2: f2++; break;
			case 3: f3++; break;
			case 4: f4++; break;
			case 5: f5++; break;
			case 6: f6++; break;
			}
		}
		System.out.println("1点出现了" + f1 + "次");
		System.out.println("2点出现了" + f2 + "次");
		System.out.println("3点出现了" + f3 + "次");
		System.out.println("4点出现了" + f4 + "次");
		System.out.println("5点出现了" + f5 + "次");
		System.out.println("6点出现了" + f6 + "次");
	}
	
	public static int roll() {
		return (int) (Math.random() * 6 + 1);
	}
}

不好意思,上面的程序中又出现了新的知识——循环。为了模拟将一颗色子掷6000次,上面的程序用for关键字构造了一个6000次的循环,for循环后面的左花括号和右花括号构成了循环体,所谓循环体就是没循环一次就要被执行一次的部分,在上面的代码中写了一个摇色子的方法roll(),该方法会返回一个1-6的随机整数表示色子摇出的点数。这个方法被放在一个6000次的循环中,就相当于色子被摇了6000次。接下来我们用switch...case...default结构来处理摇出的点数,用了6个变量分别记录1点到6点出现的次数。++是自增运算(就是把变量的值加1),++可以放在变量之前,也可以放在变量之后,但是有些细微的差别,关于这点大家可以请教 谷老师百老师

循环结构和分支结构是构造程序逻辑最重要的结构,Java中有三种类型的循环:while循环、do...while...循环和刚才代码中的for循环。其中,while循环和do...while...循环最大的差别在于后者会无条件的执行一次,再看循环条件是否成立来决定是否继续循环。而for循环的圆括号中两个分号隔开了三个部分,第一部分叫初始语句,只在第一次循环时执行一次,以后就再也不执行了;第二部分叫循环条件,是一个布尔值,布尔值为true则执行循环体,布尔值为false则结束循环;第三部分叫步进语句,相当于循环体中的最后一条语句,每循环一次就执行一次。下面用三段代码分别展示三种循环,做的事情都是从1到100求和。

Sum1.java (while循环)

package com.lovo;

public class Sum1 {

	public static void main(String[] args) {
		int sum = 0;
		int i = 1;
		while(i <= 100) {
			sum += i++;	// 先将i的值累加到sum上再将i加1
		}
		System.out.println("SUM = " + sum);
	}
}

Sum2.java (do...while...循环)

package com.lovo;

public class Sum2 {

	public static void main(String[] args) {
		int sum = 0;
		int i = 1;
		do {
			sum += i++;	// 先将i的值累加到sum上再将i加1
		} while(i <= 100);
		System.out.println("SUM = " + sum);
	}
}

Sum3.java (for循环)

package com.lovo;

public class Sum3 {

	public static void main(String[] args) {
		int sum = 0;
		for(int i = 1; i <= 100; i++) {
			sum += i;
		}
		System.out.println("SUM = " + sum);
	}
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值