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

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

时间:2023-06-20 14:03:02浏览次数:66  
标签:02 ... Java String int System --- 循环 public


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

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元,计算公式是:

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

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

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

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

代码如下所示:

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);
	}
}



标签:02,...,Java,String,int,System,---,循环,public
From: https://blog.51cto.com/u_16166070/6522211

相关文章

  • [连载]Java程序设计(04)---任务驱动方式:工资结算系统
    任务:还是在上一家公司,该公司将职员分为三类:部门经理、技术员和销售员。在发工资的时候,部门经理拿固定月薪8000元,技术人员按每小时100元领取月薪,销售人员按照500元底薪加当月销售额的4%进行提成,设计并实现一个工资结算系统。分析:不管是部门经理、技术员还是销售员都具有员工的共同特......
  • 松下PLC编程 FP-XH 10轴定位 松下PLC项目实例,两台CPU间通过
    松下PLC编程FP-XH10轴定位松下PLC项目实例,两台CPU间通过RS485通讯,10轴定位控制。轴控制程序采用FB,直观可靠,可以重复使用,使用时只需要对fb接口赋值即可,内部已经对系统寄存器做好了处理。拥有此fb,编程小白也能像高手一般轻松做伺服控制。整个网络使用RS485,两台PLC和一台触摸屏提......
  • Time Interval Aware Self-Attention for Sequential Recommendation
    目录概符号说明MotivationTiSASRec代码LiJ.,WangY.,McAuleyJ.Timeintervalawareself-attentionforsequentialrecommendation.WSDM,2020.概本文介绍了一种更好利用时间戳信息的方式,引入相对位置编码.符号说明Motivation无论是GRU4Rec,还是SASRec等,......
  • 西门子S7-1200 PLC双轴算法控制程序 西门子PLC做的电池焊接程序,
    西门子S7-1200PLC双轴算法控制程序西门子PLC做的电池焊接程序,电池包里面有n*m行列个电池,主要功能:1.每个电池的焊点坐标能够独立调整2.每个电池的焊接能量可独立选择3.任意一个或者多个电池可以随机选择不焊接4.可以选择某一边电池焊接5.可以灵活选择焊接方式6.可存储5套不同产品......
  • 西门子S7-300整条生产线项目程序资料 西门子S7-300 PLC做的某汽车行业
    西门子S7-300整条生产线项目程序资料西门子S7-300PLC做的某汽车行业的生产线程序。300CPU一套西门子触摸屏TP700两套远程ET200站点ProfibusDP网络系统PLC,HMI,ET200,profibusdp网络压力值模拟量采集位移传感器模拟量采集pwm控制拧紧系统扫码枪上位机双层输送线激光打标机基恩士视......
  • 西门子PLC S7-1200和Labview以太网通讯通讯周期20MS,自己做的软件,通讯子程序在设备运
    西门子PLCS7-1200和Labview以太网通讯通讯周期20MS,自己做的软件,通讯子程序在设备运行了4年多都没出现问题,1200PLC侧只需要建立两个DB块,一个读一个写,其他不需要任何编程延申科普:西门子PLCS7-1200:西门子是一家知名的工业自动化解决方案提供商,PLC(可编程逻辑控制器)是一种用于控制和......
  • Mysql数据导出---select into outfile
    select...intooutfile语法select*fromstudentsorderbyscorelimit100intooutfile'/database/mysql/tmp/students.csv'FIELDSTERMINATEDBY','OPTIONALLYENCLOSEDBY'"'ESCAPEDBY'\'LINEST......
  • fx3u和西门子v20/台达vfd-m/三菱E700 rtu所需硬件:FX3U PLC,FX3U-485BD通信板,变频器。
    fx3u和西门子v20/台达vfd-m/三菱E700rtu所需硬件:FX3UPLC,FX3U-485BD通信板,变频器。功能:使用fx3u-485bd板,rtu通信控制西门子v20/台达VFD-M/三菱E700三种变频器正反转,停止,频率设定,加减速,以及对频率,电压,电流的读取,有运行指示,效果可以看视频,反应及时,运行可靠,三种变频器程序是单个的......
  • 强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划
    强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代1.马尔科夫决策核心词汇马尔可夫性质(Markovproperty,MP):如果某一个过程未来的状态与过去的状态无关,只由现在的状态决定,那么其具有马尔可夫性质。换句话说,一个状态的下一个状态......
  • 快手数据中台建设 - 大数据服务化之路
    快手数据中台建设-大数据服务化之路 2021-01-0721:58本文是围绕着快手的数据服务化中台进行介绍。第一部分是背景介绍,包括数据开发的痛点,第二部分是介绍大数据服务化平台,包括平台架构以及关键细节详解,第三部分是经验总结和未来思考。( 本文内容已经在2020年Top100全球......