double sr=input.nextDouble();
System.out.println(\应交个人所得税:\调用计算所得税方法
}
public static double getTax(double sal) {
double t=0; //t代表应交税款
double b=sal-3500; //b代表应纳税所得额 if(b<=500) //计算级数1的税款 {
t=b*0.05; return t; }
else if(b<=2000) //计算级数2的税款 {
t=25+(b-500)*0.1; return t; }
else if(b<=5000) //计算级数3的税款 {
t=175+(b-2000)*0.15; return t; }
else if(b<=20000) //计算级数4的税款 {
t=625+(b-5000)*0.2; return t; }
else if(b<=40000) //计算级数5的税款 {
t=3625+(b-20000)*0.25; return t; }
else if(b<=60000) //计算级数6的税款 {
t=8625+(b-40000)*0.3; return t; }
else if(b<=80000) //计算级数7的税款 {
t=14625+(b-60000)*0.35; return t; }
else if(b<=100000) //计算级数8的税款
{
t=21625+(b-80000)*0.4; return t; }
else //计算级数9的税款
{
t=29625+(b-100000)*0.45; return t; } } }
(4)运行结果
运行程序,结果如图2.2所示。
3.扩展训练
前面的代码,在计算每个级数的税款时,都直接加上一个扣除累计数,扣除累计数是我们写代码前,慢慢计算出来的,这个需要不少时间哟,如果级数的分段数字重新划分或每级的税率修改了,那么又要重新算一遍,是不是很麻烦,我们可以尝试把分级的数据段和税款放到数组里,让程序自己来算。参考代码如下:
import java.util.Scanner;
public class ch2_2_2 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in); int s;
int sum=0;
//salary存放分级标准
int salary[]={0,500,2000,5000,20000,40000,60000,80000,100000}; //rate存放分级税率
int rate[]={5,10,15,20,25,30,35,40,45};
System.out.print(\请输入月收入:\
s=in.nextInt();
s=s-3500; //扣除基数
int index=0; //记录级数
//循环查找,属于哪一级,index记录下标
for(int i=0;i if(s index=i; //找到后记录下标 break; } } System.out.println(\级别:\ //循环计算扣除累计数 for(int i=0;i sum=sum+(int)((salary[i+1]-salary[i])*rate[i]*0.01); } //计算最终税款 sum=sum+(int)((s-salary[index-1])*rate[index-1]*0.01); System.out.print(\交税总额:\ } } 2.3 存 钱 问 题 1.问题描述 父亲准备为小龙的四年大学生活一次性储蓄一笔钱,使用整存零取的方式,控制小龙每月月初取1000元准备这个月使用。假设银行整存零取的年息为1.71%,请算出父亲至少需要存入多少钱才行。 2.问题分析 这个问题是一个典型的递推问题,分析存钱和取钱的过程,我们可以采用逆推的方法。4年48个月,每月取1000元,最后一个月正好取完。我们可以采用一个数组存放每个月剩余的钱数,那么最后一个月连本带息为1000,即第48个月数组里的值为1000。 第47个月的存折里钱为:取走的1000元生活费+下个月1000月的本金,即: 1000+第48个月的钱数/(1+0.00171/12) 依次类推可以求出第46、45、??、第1个月的钱数: 第46个月的存折里钱为:1000+第47个月的钱数/(1+0.00171/12) 第45个月的存折里钱为:1000+第46个月的钱数/(1+0.00171/12) ?? 第1个月的存折里钱为:1000+第2个月的钱数/(1+0.00171/12) 通过以上的递推就可以求出最初存款的钱数。 (1)确定程序框架 通过前面的分析,我们就可以写出程序框架了。代码如下: public class ch2_3 { public static final double MONEYRATE=0.0171; public static void main(String[] args) { ... for(int i=47;i>0;i--) { //通过循环逆推出前一个月的剩余存款 } ... } } (2)写出递推公式 通过前面的问题分析,我们很容易得到递推公式,如下: money[i-1]=1000+money[i]/(1+MONEYRATE/12); (3)完整程序 现在我们就需要把刚才的程序进行组合,构成我们的完整程序: public class ch2_3 { public static final double MONEYRATE=0.0171; 存款利率 public static void main(String[] args) { //定义一个长度为48的数组,用来装每个月月初还剩下的存款 double money[]=new double[48]; //最后一个月月初1000元 money[47]=1000; System.out.printf(\月初的剩余存款数为:%.2f\\n\ //通过循环逆推出前一个月的剩余存款 for(int i=47;i>0;i--) { money[i-1]=1000+money[i]/(1+MONEYRATE/12); System.out.printf(\月初的剩余存 款//数 为:%.2f\\n\ } //算出最初要存入的钱,即第一个剩余存款数 System.out.printf(\最初要存入%.2f元。\ } } 2.4 赛 场 统 分 1.问题描述 在编程竞赛中,有10个评委为参赛的选手打分,分数为0~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。 2.问题分析 这是一个典型的求最大值、最小值问题,为方便数据处理,我们可以把10个评委的打分放到数组里,然后通过循环打擂的原则,把最大值、最小值求出来,同时累加求和,这样一次循环就能实现。 (1)确定程序框架 通过前面的问题描述,我们可以首先循环输入10个分数,然后求出最大值、最小值,最后累加求和,算出平均分。程序的框架如下: public class ch2_4 { public static void main(String[] args) { ... //循环录入10个人的分数 //通过打擂求出最大值、最小值 //累加求和 //输出结果 } } (2)循环录入分数 通过一个循环语句,很容易实现,代码如下: for(i=0;i<10;i++) { System.out.print(\请输入第\分数:\ Scanner input=new Scanner(System.in); X[i]=input.nextInt(); }