一,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变量的值的互换。如图所示:
1.1.3 参考代码:
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物体的自由落体位移。计算结果保留一位小数并且输出到控制台。系统交互过程 如图所示
注:自由落体位移公式为: 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 扩展
用户从控制台输入物体下落的距离(米),然后计算下落此距离所需要花费的时间(秒)。计 算结果需要保留一位小数,并且将结果输出到控制台。系统交互过程如图所示:
系统代码实现如下:
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 (还款月数
系统交互过程如图所示:
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 参考代码:
1.3.4 扩展
计算使用等额本金方式还贷的情况。用户从控制台输入贷款本金,贷款月利率和还款年数,系统根据上述信息计算第一个月和第二个月的还款金额,要求每月还款金额保留两位小数并且输出到控制台。系统交互过程如图:
等额本金还款公式为 :每月还款额=贷款本金/贷款期月数+(本金-已归还本金累计额)×月利率
比如,贷款金额(即贷款本金)为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米,计算一下牛郎织女真的要会面需要动用多少只喜鹊。控制台输出信息如图所示:
注:
光速: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 参考代码:
系统代码实现如下:
1.4.4 扩展:
据称,一个人一生中要走的路加起来可以绕地球七十五圈,地球的平均半径为 6371.004 千米,而一个人走一步的步长大约是 60 厘米。请计算一个人一生中要走多少步?系统交互过程如图所示。
**系统代码实现如下: **
1.5 闰年判断程序
1.5.1 问题:
判断某年是否为闰年。根据用户在控制台输入的年份值,判断该年是否为闰年。系统交互情况如图所示:
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 参考代码:
1.5.4 扩展:
计算某年某月的天数。由用户在控制台输入年份和月份值,然后计算年该月的天数,并输出在控制台。系统交互情况如图所示:
注:大月有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。系统交互情况如 图所示:
1.6.2 方案:
系统使用if语句实现对三个数的排序,首先判断a和b的大小情况并进行交换,代码如下:
其次判断a和c的大小情况,并进行交换,代码如下:
最后判断b和c的大小情况,并进行交换,代码如下:
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 语句来实现。系统交互信息如图所示:
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 问题:
计算个人所得税的缴纳情况。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的税额,如图所示:
注:
工资个税的计算公式为:
应纳税额=(工资薪金所得-扣除数)×适用税率-速算扣除数
全月应纳税所得额=月工资薪金所得-扣除数
2011年 9月1日起执行7级超额累进税率:扣除数为3500元。
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 扩展:
计算个人工资收入的保险缴纳情况以及个人所得税。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的各项保险的总金额,并计算应该缴纳的税额。系统交互过程如图所示:
注:
工资个税的计算公式为:
应纳税额=(工资薪金所得-各项保险金额-扣除数)×适用税率-速算扣除数
全月应纳税所得额=月工资薪金所得-各项保险金额-扣除数
其中,各项保险金额的缴纳比例如下:
养老保险:月工资薪金所得 × 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();
}
}