一,Java语法基础(四)-案例

1.1 数据交换程序
1.1.1 问题:

实现两个变量间的数据交换,例如:有两个整数类型变量a和b,现需要使变量a的值和变量b的值进行交换。例如: a的原值为100,b的原值为200,交换后a的值为200,b的值为100。

1.1.2 方案:

系统使用中间变量的方式来解决上述问题。

步骤1:把a变量的值赋给中间变量,代码如下所示:

int temp=a;

步骤2:把b变量的值赋给a变量,代码如下所示:

a=b;

步骤3:把中间变量的值赋给b变量,代码如下所示:

b=temp;

最终实现了a变量的值和b变量的值的互换。如图所示:

olnyoffice java案例 java案例教程_Math

1.1.3 参考代码:

olnyoffice java案例 java案例教程_System_02

1.1.4 扩展

不使用中间变量来实现数据交换程序,即实现两个变量值的交换。可以先把a+b值赋给a,接着把a-b的值赋给b,最后把a-b的值在赋给a,请看如下代码:

public class SwapExt{
    public static void main(String[] args){
        int a = 100;
        int b = 200;
        System.out.println("a="+a+",b="+b);
        a=a+b;
        b=a-b; 
        a=a-b; 
        System.out.println("a="+a+",b="+b);
    }
}

1.2 计算自由落体运动中物体的位移
1.2.1 问题:

该系统使用交互的方式计算自由落体运动中物体的位置。用户从控制台输入自由落体的时间t,系统计算经过时间t物体的自由落体位移。计算结果保留一位小数并且输出到控制台。系统交互过程 如图所示

olnyoffice java案例 java案例教程_System_03

注:自由落体位移公式为: s = 1/2 × g × t*t ,其中:

s (位移(m)

t (时间(s)

g (重力加速度(9.8m/s2)

例如:从控制台接收到的时间t为10s,那么位移s=1/2 × 9.8 × 10 × 10=490.0

1.2.2 方案:

系统使用double类型接收控制台输入的时间数据t。调用Scanner的nextDouble()方法接收用户从控制台输入的时间数据,该方法的返回值为double类型。代码如下所示:

double t=scanner.nextDouble();

系统根据自由落体的位移公式计算出位移值s,s的类型为double,代码如下所示:

double s=0.5*g*t*t;

**系统为了确保小数点后保留一位小数可以使用如下方法: **

s=Math.round(10*s)/10.0;

Math的round(double s)方法用于实现四舍五入的计算,返回值为long类型的数据。

需要注意的是round(double s)返回值为long类型,要除以double类型的数据后,其结果才

会自动类型转换为double类型,因此被除数为double直接量10.0而不是int直接量10。

1.2.3 参考代码:
import java.util.Scanner;
public class FreeFall{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        double g=9.80; 
        System.out.println("请输入自由下落的时间(秒):");
        double t=scanner.nextDouble();
        double s=0.5*g*t*t;
        s=Math.round(10*s)/10.0;
        System.out.println(t+"秒后,物体自由下落了"+s+"米");
    }
}
1.2.4 扩展

用户从控制台输入物体下落的距离(米),然后计算下落此距离所需要花费的时间(秒)。计 算结果需要保留一位小数,并且将结果输出到控制台。系统交互过程如图所示:

olnyoffice java案例 java案例教程_olnyoffice java案例_04

系统代码实现如下:

import java.util.Scanner;
public class FreeFallExt{
    
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        double g=9.80;
        System.out.println("请输入自由下落的距离(米):");
        double s=scanner.nextDouble();
        double t=Math.sqrt(2*s/g);
        t=Math.round(10*t)/10.0;
        System.out.println("物体下落"+s+"米,需要"+t+"秒");
    }
    
}

1.3 等额本息还款计算器
1.3.1 问题:

系统使用交互的方式计算等额本息贷款的还款情况。用户从控制台输入贷款本金,贷款月利率和还款年数,系统根据上述信息计算每月还款金额,要求每月还款金额保留两位小数并且输出到控制台。

注:等额本息还款公式 :payment = (p × r × (1 + r)^m) / ((1 + r)^m - 1),

其中: p (贷款本金(元) r (贷款月利率 m (还款月数

系统交互过程如图所示:

olnyoffice java案例 java案例教程_System_05

1.3.2 方案:

**系统使用double类型定义贷款本金和贷款月利率,代码如下所示: **

double p=scanner.nextDouble()*10000;
double r=scanner.nextDouble()/1200;

**系统使用int类型定义还款年数,代码如下所示: **

int m=scanner.nextInt()*12

系统根据等额本息还款公式计算出还款情况,使用Math.pow(double a,double b)计算幂运算,该方法返回a的b次幂的值,代码如下所示:

double payment=(p*r*Math.pow((1+r),m))/(Math.pow(1+r,m)-1);

系统使用Math.round()方法确保还款金额保留两位小数,代码如下所示:

Math.round(payment*100)/100.0
1.3.3 参考代码:

olnyoffice java案例 java案例教程_控制台输入_06

1.3.4 扩展

计算使用等额本金方式还贷的情况。用户从控制台输入贷款本金,贷款月利率和还款年数,系统根据上述信息计算第一个月和第二个月的还款金额,要求每月还款金额保留两位小数并且输出到控制台。系统交互过程如图:

olnyoffice java案例 java案例教程_System_07

等额本金还款公式为 :每月还款额=贷款本金/贷款期月数+(本金-已归还本金累计额)×月利率

比如,贷款金额(即贷款本金)为30万元,贷款年利率为 6.14%,还款年数为 20年,则计算方式如下:

每月本金:300000/240 = 1250

月利率:6.14%/12

首月还款:1250 + 300000 * 6.14%/12 = 2785

第 2 月还款: 1250 + (300000 - 1250) * 6.14%/12 = 2778.60

注:第一个月已归还的本金1250 在第二个月就不用再计算利息。 系统代码实现如下:

import java.util.Scanner;

public class MonthlyPaymentExt {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你的贷款本金:(万)");
		double p = scanner.nextDouble() * 10000;
		System.out.println("请输入你的贷款年利率:(%)");
		double r = scanner.nextDouble() / 1200;
		System.out.println("请输入你的还款年数:");
		int m = scanner.nextInt() * 12;
		scanner.close();
		double firstPayment = p / m + p * r;
		firstPayment = Math.round(firstPayment * 100) / 100.0;
		System.out.println("你的第一个月的还款金额为:¥"+ firstPayment); 
		double secondPayment=p/m+(p-p/m)*r; 
		secondPayment=Math.round(secondPayment*100)/100.0; 
		System.out.println("你的第二个月的还款金额为:¥"+ secondPayment);
	}

}

1.4 计算牛郎星到织女星的距离
1.4.1 问题:

计算牛郎星到织女星的距离。牛郎星到织女星的距离为16.4光年,如果一只喜鹊的长度是0.46米,计算一下牛郎织女真的要会面需要动用多少只喜鹊。控制台输出信息如图所示:

olnyoffice java案例 java案例教程_olnyoffice java案例_08

注:

光速:299792458米/秒

1光年=(1 * 365 * 24 * 60 * 60 * 光速 / 1000)公里

1公里=1千米

1.4.2 方案:

使用double类型定义光年变量和喜鹊的长度变量,代码如下所示:

double dLightYear=16.4;
double dMagpie=0.46;

使用int类型定义光速变量,没有超过int的最大值,故使用int类型定义光速变量,代码如下所示:

int speedOfLight=299792458;

根据公式计算牛郎星到织女星的距离,使用long类型定义牛郎星到织女星的距离变量,代码如下所示:

long d=(long)(dLightYear*365*24*60*60*speedOfLight/1000);

根据公式计算出牛郎织女会面,搭起鹊桥需要的喜鹊只数,超过int类型的最大,但是小于long的最大值,故使用long类型定义需要喜鹊的只数变量,代码如下所示:

long numberOfMagpie=(long)(d*1000/dMagpie)
1.4.3 参考代码:

系统代码实现如下:

olnyoffice java案例 java案例教程_System_09

1.4.4 扩展:

据称,一个人一生中要走的路加起来可以绕地球七十五圈,地球的平均半径为 6371.004 千米,而一个人走一步的步长大约是 60 厘米。请计算一个人一生中要走多少步?系统交互过程如图所示。

olnyoffice java案例 java案例教程_System_10

**系统代码实现如下: **

olnyoffice java案例 java案例教程_olnyoffice java案例_11


1.5 闰年判断程序
1.5.1 问题:

判断某年是否为闰年。根据用户在控制台输入的年份值,判断该年是否为闰年。系统交互情况如图所示:

olnyoffice java案例 java案例教程_olnyoffice java案例_12

1.5.2 方案:

使用数学运算符取余运算(%),关系运算符等于(==)和不等于(!=),逻辑运算符逻辑 与(&&)和逻辑或(||),来判断某年是否为闰年,判断的结果为boolean类型的值,如果为闰年 boolean类型的值为true,否则为false,代码如下所示:

boolean isLeapYear=(year%4==0&&year%100!=0)||year%400==0;

使用三目运算符,获取是否为闰年的String类型信息,输出到控制台,代码如下所示:

String msg=isLeapYear?year+"是闰年":year+"不是闰年";
1.5.3 参考代码:

olnyoffice java案例 java案例教程_控制台输入_13

1.5.4 扩展:

计算某年某月的天数。由用户在控制台输入年份和月份值,然后计算年该月的天数,并输出在控制台。系统交互情况如图所示:

olnyoffice java案例 java案例教程_控制台输入_14

注:大月有31天,小月有30天,闰年的2月有29天,非闰年的2月有28天。系统代码实现如下:

import java.util.Scanner;
public class LeapYear{ 
    public static void main(String[]args){ 
        Scanner scanner=new Scanner(System.in); 
        System.out.println("请输入年份(例如:2020)"); 
        int year=scanner.nextInt(); 
        System.out.println("请输入月份(例如:1)"); 
        int month=scanner.nextInt(); 
        scanner.close(); 
        //判断是否是闰年
        boolean isLeapYear=(year%4==0&&year%100!=0)||year%400==0; 
        //判断大月和小月,2月除外 
        boolean isLittleMonth=month==4||month==6||month==9||month==11; 
        boolean isLargeMonth=month==1||month==3||month==5||month==7||month==8||month==10||month==12; 
        //计算天数 
        int days=isLittleMonth?30:(isLargeMonth?31: (isLeapYear?29:28));
        //输出 
        System.out.println(year+"年"+month+"月有"+days+"天"); 
    }
}

1.6 数字排序程序
1.6.1 问题:

系统使用交互的方式给三个数字进行排序。例如:接收用户输入的三个整数a,b,c,a的原值是20,b的原值是5,c的原值是10,排序后a的值为5,b的值为10,c的值为20。系统交互情况如 图所示:

olnyoffice java案例 java案例教程_Math_15

1.6.2 方案:

系统使用if语句实现对三个数的排序,首先判断a和b的大小情况并进行交换,代码如下:

olnyoffice java案例 java案例教程_olnyoffice java案例_16

其次判断a和c的大小情况,并进行交换,代码如下:

olnyoffice java案例 java案例教程_System_17

最后判断b和c的大小情况,并进行交换,代码如下:

olnyoffice java案例 java案例教程_olnyoffice java案例_18

1.6.3 参考代码:
import java.util.Scanner;

public class MaxofThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		System.out.println("请依次输入三个整数:a,b,c(以空格隔开)");
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		int c=scanner.nextInt();
		scanner.close();
		System.out.println("a="+a+",b="+b+",c="+c);
		int temp=0;
		if(a>b) {
			temp = a;
			a = b;
			b = temp;
		}
		if(a>c) {
			temp = a;
			a = c;
			c = temp;
		}
		if(b>c) {
			temp = b;
			b = c;
			c = temp;
		}
		System.out.println("a="+a+",b="+b+",c="+c);
	}

}
1.6.4 扩展

用户在控制台输入 3 个数值,需要找出这 3 个数值中的最小值,要求使用 if 语句来实现。系统交互信息如图所示:

olnyoffice java案例 java案例教程_控制台输入_19

import java.util.Scanner;

public class MinofThree {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请依次输入三个整数:a,b,c(以空格隔开)");
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		int c=scanner.nextInt();
		scanner.close();
		
		int temp = a;
		if(temp>b) {
			temp = b;
		}
		if(temp>c) {
			temp = c;
		}
		System.out.println("最小值为:"+temp);
	}
}

1.7 个人所得税计算器
1.7.1 问题:

计算个人所得税的缴纳情况。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的税额,如图所示:

olnyoffice java案例 java案例教程_System_20

注:

工资个税的计算公式为:

应纳税额=(工资薪金所得-扣除数)×适用税率-速算扣除数

全月应纳税所得额=月工资薪金所得-扣除数

2011年 9月1日起执行7级超额累进税率:扣除数为3500元。

olnyoffice java案例 java案例教程_olnyoffice java案例_21

1.7.2 参考代码:
package day03;

import java.util.Scanner;

public class IncomeTax {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你的工资的税前金额(¥):");
		double salary = scanner.nextDouble();
		double tax = 0.0;
		double taxIncome = salary-3500;
		if(taxIncome<=0) {
			tax = 0.0;
		}else if(taxIncome<=1500) {
			tax = taxIncome*0.03;
		}else if(taxIncome<=4500) {
			tax = taxIncome*0.10-105;
		}else if(taxIncome<=9000) {
			tax = taxIncome*0.20-555;
		}else if(taxIncome<=35000) {
			tax = taxIncome*0.25-1005;
		}else if(taxIncome<=55000) {
			tax = taxIncome*0.30-2755;
		}else if(taxIncome<=80000) {
			tax = taxIncome*0.35-5505;
		}else {
			tax=taxIncome*0.45-13505;
		}
		System.out.println("你应该缴纳的个人所得税是:¥"+tax);
		scanner.close();
	}
}
1.7.3 扩展:

计算个人工资收入的保险缴纳情况以及个人所得税。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的各项保险的总金额,并计算应该缴纳的税额。系统交互过程如图所示:

olnyoffice java案例 java案例教程_控制台输入_22

注:

工资个税的计算公式为:

应纳税额=(工资薪金所得-各项保险金额-扣除数)×适用税率-速算扣除数

全月应纳税所得额=月工资薪金所得-各项保险金额-扣除数

其中,各项保险金额的缴纳比例如下:

养老保险:月工资薪金所得 × 8%

医疗保险:月工资薪金所得 × 2%

失业保险:月工资薪金所得 × 0.2%

公积金:月工资薪金所得 × 12%

系统代码实现如下:

package day03;

import java.util.Scanner;

public class InsuranceTax {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入你的工资的税前金额(¥):");
		double salary=scanner.nextDouble();
		scanner.close();
		//计算各项保险金额
		double endowmentInsurance=salary*0.08;
		double medicalInsurance=salary*0.02;
		double unemploymentInsurance=salary*0.002;
		double accumulationFund=salary*0.12;
		double insurance=endowmentInsurance+medicalInsurance+unemploymentInsurance+accumulationFund;
		System.out.println("你应该缴纳的各项保险总金额为:¥"+insurance);
		//计算个税
		double tax=0.0;
		double taxIncome=salary-insurance-3500;
		if(taxIncome<=0) {
			tax = 0.0;
		}else if(taxIncome<=1500) {
			tax = taxIncome*0.03;
		}else if(taxIncome<=4500) {
			tax = taxIncome*0.10-105;
		}else if(taxIncome<=9000) {
			tax = taxIncome*0.20-555;
		}else if(taxIncome<=35000) {
			tax = taxIncome*0.25-1005;
		}else if(taxIncome<=55000) {
			tax = taxIncome*0.30-2755;
		}else if(taxIncome<=80000) {
			tax = taxIncome*0.35-5505;
		}else {
			tax=taxIncome*0.45-13505;
		}
		System.out.println("你应该缴纳的个人所得税是:¥"+tax);
		scanner.close();
	}
}